Linux腳本學(xué)習(xí)筆記,log函數(shù)使用技巧
本文主要講述的是一個(gè)關(guān)于記錄shell腳本執(zhí)行日志的日志腳本函數(shù),在做shell腳本開(kāi)發(fā)的過(guò)程中,常常要運(yùn)行腳本來(lái)監(jiān)測(cè)一些系統(tǒng)數(shù)據(jù),但是我們又沒(méi)有很多時(shí)間來(lái)一直盯著命令控制臺(tái)看,所以看能不能把這些腳本運(yùn)行的情況記錄成一個(gè)日志并保存下來(lái),方便我們有時(shí)間的時(shí)候查看。
需求:
1、可以記錄腳本的運(yùn)行情況
2、可以記錄時(shí)間
3、可以在輸入log達(dá)到一定的行數(shù)后對(duì)以前的log進(jìn)行刪減,防止log文件無(wú)限累積
需求分析
需求很簡(jiǎn)單,想想看好像有很多方式可以實(shí)現(xiàn),最終結(jié)合個(gè)人喜好和技術(shù)能力,選擇編寫(xiě)一個(gè)運(yùn)行在shell腳本里面的函數(shù);這個(gè)函數(shù)的作用是將shell腳本中需要輸出的日志信息,輸出成與腳本同名的log文本,記錄在系統(tǒng)中,方便開(kāi)發(fā)人員在空閑時(shí)間進(jìn)行查閱,分析腳本的運(yùn)行情況。
需求實(shí)現(xiàn):
經(jīng)過(guò)三天三夜的奮戰(zhàn),寫(xiě)出了以下腳本函數(shù):
#!/bin/bash
log(){
#log文件名
local fileName="./$(basename $0 .sh).log"
#log文件最大存儲(chǔ)log行數(shù)(此處設(shè)置最大存儲(chǔ)log行數(shù)是100行)
local fileMaxLen=100
#超過(guò)log最大存儲(chǔ)行數(shù)后需要從頂部開(kāi)始刪除的行數(shù)(此處設(shè)置的是刪除第1到第10行的數(shù)據(jù))
local fileDeleteLen=10
if test $fileName
then
#記錄log
echo "[`date +%y/%m/%d-%H:%M:%S`]:$*" >> $fileName
#獲取log文件實(shí)際行數(shù)
loglen=`grep -c "" $fileName`
if [ $loglen -gt $fileMaxLen ]
then
#從頂部開(kāi)始刪除對(duì)應(yīng)行數(shù)的log
sed -i '1,'$fileDeleteLen'd' $fileName
fi
else
echo "[`date +%y/%m/%d-%H:%M:%S`]:$*" > $fileName
fi
}
#test
testdate=100
#記錄輸出的字符串
log "test string"
#記錄輸出的數(shù)據(jù)
log "testdate=$testdate"
#記錄輸出的運(yùn)算
log $[1+2]
#記錄命令輸出的信息
log $(printf "this is cmd test %s\n" "this is cmd output string")
其中主要的就是log()這個(gè)腳本函數(shù),'#test’之后的都是對(duì)這個(gè)函數(shù)的測(cè)試。
實(shí)現(xiàn)功能:
1、可以快速的加入到當(dāng)前的腳本中,加入方法:將log()函數(shù)復(fù)制到在當(dāng)前的腳本的最前面,然后后面對(duì)需要記錄的日志直接調(diào)用log就可以;
2、加入需要記錄日志的腳本后,執(zhí)行腳本時(shí),會(huì)在執(zhí)行腳本同目錄下生成一個(gè)同名的.log文件,里面就是執(zhí)行腳本的日志輸出;
3、可以記錄腳本運(yùn)行時(shí)間及可對(duì)字符串、數(shù)據(jù)變量、及命令輸出的信息進(jìn)行記錄;
4、可以對(duì)log文件的行數(shù)進(jìn)行判斷,當(dāng)行數(shù)超過(guò)最大限制行數(shù)后,會(huì)從log文件頂部開(kāi)始刪除以前的log記錄。
使用示例:
比如要實(shí)時(shí)查看CPU的溫度,就有如下腳本(cputemp.sh):
#!/bin/bash
echo CPU temperature is $[`cat /sys/class/thermal/thermal_zone0/temp`/1000]
在命令控制臺(tái)使用watch命令可以做到實(shí)時(shí)監(jiān)控:
watch -n 1 ./cputemp.sh
執(zhí)行結(jié)果如下:
這樣是可以實(shí)現(xiàn)實(shí)時(shí)查看,可是為了數(shù)據(jù)的延續(xù)性,所以我加上了log腳本函數(shù),修改了cputemp.sh腳本,如下:
#!/bin/bash
log(){
#log文件名
local fileName="./$(basename $0 .sh).log"
#log文件最大存儲(chǔ)log行數(shù)(此處設(shè)置最大存儲(chǔ)log行數(shù)是100行)
local fileMaxLen=100
#超過(guò)log最大存儲(chǔ)行數(shù)后需要從頂部開(kāi)始刪除的行數(shù)(此處設(shè)置的是刪除第1到第10行的數(shù)據(jù))
local fileDeleteLen=10
if test $fileName
then
#記錄log
echo "[`date +%y/%m/%d-%H:%M:%S`]:$*" >> $fileName
#獲取log文件實(shí)際行數(shù)
loglen=`grep -c "" $fileName`
if [ $loglen -gt $fileMaxLen ]
then
#從頂部開(kāi)始刪除對(duì)應(yīng)行數(shù)的log
sed -i '1,'$fileDeleteLen'd' $fileName
fi
else
echo "[`date +%y/%m/%d-%H:%M:%S`]:$*" > $fileName
fi
}
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命令循環(huán)執(zhí)行:
watch -n 1 ./cputemp.sh
執(zhí)行在命令控制臺(tái)的結(jié)果和之前是一樣的,但是現(xiàn)在在同一個(gè)文件目錄下會(huì)生成一個(gè)cputemp.log的文件,查看該文件可以發(fā)現(xiàn)CPU的溫度信息已記錄。
使用cat命令查看cputemp.log:
cat ./cputemp.log
得到文件內(nèi)容,如下:
從圖中可以看出CPU溫度在40-41之間波動(dòng)。
注意事項(xiàng)
1、不能把watch命令寫(xiě)到cputemp.sh腳本里面
這中間還是有一點(diǎn)不完善的地方是,不能把watch命令寫(xiě)到cputemp.sh腳本里面是比較麻煩的,如果把watch命令寫(xiě)到cputemp.sh腳本里面,就會(huì)出現(xiàn)執(zhí)行的溫度信息被固定成一個(gè)固定值,不能做到實(shí)時(shí)查看。
如下:
修改的腳本:
#!/bin/bash
watch -n 1 echo CPU temperature is $[`cat /sys/class/thermal/thermal_zone0/temp`/1000]
執(zhí)行:
./cputemp.sh
執(zhí)行結(jié)果:
從執(zhí)行結(jié)果中可以看到:
$[`cat /sys/class/thermal/thermal_zone0/temp`/1000]
被固定成了40,導(dǎo)致每秒循環(huán)只是打印:
CPU temperature is 40
而不能達(dá)到效果,所以目前只能用命令調(diào)用腳本的方式了。
2、單引號(hào)內(nèi)引用變量需要嵌套單引號(hào)
在使用 sed 命令時(shí)用到了單引號(hào)(‘’),單引號(hào)內(nèi)需要引用變量時(shí),需要對(duì)引用變量嵌套單引號(hào),不然會(huì)報(bào)錯(cuò)。
sed -i '1,'$fileDeleteLen'd' $fileName
總結(jié):
目前這種實(shí)現(xiàn)方式也滿足了基本需求。