本文描述了一個用於記錄shell腳本執行日誌的日誌腳本函數。在進行shell腳本開發時,經常需要監控系統數據。爲了方便查看,我們可以將腳本運行情況記錄爲日誌文件,避免需要一直在命令控制檯上監視。
需求:
1、可以記錄腳本的運行情況;
2、可以記錄時間;
3、可以在輸入log達到一定的行數後對以前的log進行刪減,防止log文件無限累積;
需求分析
這個簡單需求可以通過編寫一個函數來實現,該函數能夠將腳本中的日誌信息輸出到同名的log文件中,方便開發人員日後查閱分析腳本運行情況。可以根據個人喜好和技術能力選擇合適的方式來實現這一功能。
需求實現:
經過三天三夜的奮戰,寫出了以下腳本函數:
#!/bin/bashlog(){#log文件名local fileName="./$(basename $0 .sh).log"#log文件最大存儲log行數(此處設置最大存儲log行數是100行)local fileMaxLen=100#超過log最大存儲行數後需要從頂部開始刪除的行數(此處設置的是刪除第1到第10行的數據)local fileDeleteLen=10if test $fileNamethen#記錄logecho "[`date +%y/%m/%d-%H:%M:%S`]:$*" >> $fileName#獲取log文件實際行數loglen=`grep -c "" $fileName`if [ $loglen -gt $fileMaxLen ]then#從頂部開始刪除對應行數的logsed -i '1,'$fileDeleteLen'd' $fileNamefielseecho "[`date +%y/%m/%d-%H:%M:%S`]:$*" > $fileNamefi}#testtestdate=100#記錄輸出的字符串log "test string"#記錄輸出的數據log "testdate=$testdate"#記錄輸出的運算log $[1+2]#記錄命令輸出的信息log $(printf "this is cmd test %sn" "this is cmd output string")登錄後複製其中主要的就是log()這個腳本函數,’#test’之後的都是對這個函數的測試;
實現功能:
1、可以快速的加入到當前的腳本中,加入方法:將log()函數複製到在當前的腳本的最前面,然後後面對需要記錄的日誌直接調用log就可以;
2、加入需要記錄日誌的腳本後,執行腳本時,會在執行腳本同目錄下生成一個同名的.log文件,裏面就是執行腳本的日誌輸出;
3、可以記錄腳本運行時間及可對字符串、數據變量、及命令輸出的信息進行記錄;
4、可以對log文件的行數進行判斷,當行數超過最大限制行數後,會從log文件頂部開始刪除以前的log記錄。
使用示例:
比如要實時查看CPU的溫度,就有如下腳本(cputemp.sh):
#!/bin/bashecho CPU temperature is $[`cat /sys/class/thermal/thermal_zone0/temp`/1000]登錄後複製
在命令控制檯使用watch命令可以做到實時監控
watch -n 1 ./cputemp.sh登錄後複製登錄後複製
執行結果如下:
這樣是可以實現實時查看,可是爲了數據的延續性,所以我加上了log腳本函數,修改了cputemp.sh腳本,如下:
#!/bin/bashlog(){#log文件名local fileName="./$(basename $0 .sh).log"#log文件最大存儲log行數(此處設置最大存儲log行數是100行)local fileMaxLen=100#超過log最大存儲行數後需要從頂部開始刪除的行數(此處設置的是刪除第1到第10行的數據)local fileDeleteLen=10if test $fileNamethen#記錄logecho "[`date +%y/%m/%d-%H:%M:%S`]:$*" >> $fileName#獲取log文件實際行數loglen=`grep -c "" $fileName`if [ $loglen -gt $fileMaxLen ]then#從頂部開始刪除對應行數的logsed -i '1,'$fileDeleteLen'd' $fileNamefielseecho "[`date +%y/%m/%d-%H:%M:%S`]:$*" > $fileNamefi}echo CPU temperature is $[`cat /sys/class/thermal/thermal_zone0/temp`/1000]log $(echo CPU temperature is $[`cat /sys/class/thermal/thermal_zone0/temp`/1000])登錄後複製使用watch命令循環執行
watch -n 1 ./cputemp.sh登錄後複製登錄後複製
執行在命令控制檯的結果和之前是一樣的,但是現在在同一個文件目錄下會生成一個cputemp.log的文件,查看該文件可以發現CPU的溫度信息已記錄。
使用cat命令查看cputemp.log
cat ./cputemp.log登錄後複製
得到文件內容,如下
從圖中可以看出CPU溫度在40-41之間波動。
注意事項
1、不能把watch命令寫到cputemp.sh腳本里面
這中間還是有一點不完善的地方是,不能把watch命令寫到cputemp.sh腳本里面是比較麻煩的,如果把watch命令寫到cputemp.sh腳本里面,就會出現執行的溫度信息被固定成一個固定值,不能做到實時查看。
如下:
修改的腳本:
#!/bin/bashwatch -n 1 echo CPU temperature is $[`cat /sys/class/thermal/thermal_zone0/temp`/1000]登錄後複製
執行:
./cputemp.sh登錄後複製
執行結果:
從執行結果中可以看到
$[`cat /sys/class/thermal/thermal_zone0/temp`/1000]登錄後複製
被固定成了40,導致每秒循環只是打印
CPU temperature is 40登錄後複製
而不能達到效果,所以目前只能用命令調用腳本的方式了。
2、單引號內引用變量需要嵌套單引號
在使用 sed 命令時用到了單引號(‘’),單引號內需要引用變量時,需要對引用變量嵌套單引號,不然會報錯。
sed -i '1,'$fileDeleteLen'd' $fileName登錄後複製
總結:
目前這種實現方式也滿足了基本需求。
以上就是Linux腳本學習筆記,log函數使用技巧的詳細內容,更多請關注本站其它相關文章!