【Linux】Linux腳本學習筆記,log函數使用技巧

2024年2月6日 23点热度 0人点赞

本文主要講述的是一個關於記錄shell腳本執行日志的日志腳本函數,在做shell腳本開發的過程中,常常要運行腳本來監測一些系統數據,但是我們又沒有很多時間來一直盯著命令控制臺看,所以看能不能把這些腳本運行的情況記錄成一個日志並保存下來,方便我們有時間的時候查看。

本文主要講述的是一個關於記錄shell腳本執行日志的日志腳本函數,在做shell腳本開發的過程中,常常要運行腳本來監測一些系統數據,但是我們又沒有很多時間來一直盯著命令控制臺看,所以看能不能把這些腳本運行的情況記錄成一個日志並保存下來,方便我們有時間的時候查看。

需求:

1、可以記錄腳本的運行情況

2、可以記錄時間

3、可以在輸入log達到一定的行數後對以前的log進行刪減,防止log文件無限累積

需求分析

需求很簡單,想想看好像有很多方式可以實現,最終結合個人喜好和技術能力,選擇編寫一個運行在shell腳本裡面的函數;這個函數的作用是將shell腳本中需要輸出的日志信息,輸出成與腳本同名的log文本,記錄在系統中,方便開發人員在空閑時間進行查閱,分析腳本的運行情況。

需求實現:

經過三天三夜的奮戰,寫出了以下腳本函數:

#!/bin/bash
log(){
  #log文件名
  local fileName="./$(basename $0 .sh).log"
  #log文件最大存儲log行數(此處設置最大存儲log行數是100行)
  local fileMaxLen=100
  #超過log最大存儲行數後需要從頂部開始刪除的行數(此處設置的是刪除第1到第10行的數據)
  local fileDeleteLen=10
  if test $fileName
  then
    #記錄log
    echo "[`date  %y/%m/%d-%H:%M:%S`]:$*" >> $fileName
    #獲取log文件實際行數
    loglen=`grep -c "" $fileName`
    if [ $loglen -gt $fileMaxLen ]
    then
      #從頂部開始刪除對應行數的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"
#記錄輸出的數據
log "testdate=$testdate"
#記錄輸出的運算
log $[1 2]
#記錄命令輸出的信息
log $(printf "this is cmd test %s\n" "this is cmd output string")

其中主要的就是log()這個腳本函數,'#test’之後的都是對這個函數的測試。

實現功能:

1、可以快速的加入到當前的腳本中,加入方法:將log()函數復制到在當前的腳本的最前面,然後後面對需要記錄的日志直接調用log就可以;

2、加入需要記錄日志的腳本後,執行腳本時,會在執行腳本同目錄下生成一個同名的.log文件,裡面就是執行腳本的日志輸出;

3、可以記錄腳本運行時間及可對字符串、數據變量、及命令輸出的信息進行記錄;

4、可以對log文件的行數進行判斷,當行數超過最大限制行數後,會從log文件頂部開始刪除以前的log記錄。

使用示例:

比如要實時查看CPU的溫度,就有如下腳本(cputemp.sh):

#!/bin/bash
echo CPU temperature is $[`cat /sys/class/thermal/thermal_zone0/temp`/1000]

在命令控制臺使用watch命令可以做到實時監控:

watch -n 1 ./cputemp.sh

執行結果如下:

這樣是可以實現實時查看,可是為了數據的延續性,所以我加上了log腳本函數,修改了cputemp.sh腳本,如下:

#!/bin/bash
log(){
  #log文件名
  local fileName="./$(basename $0 .sh).log"
  #log文件最大存儲log行數(此處設置最大存儲log行數是100行)
  local fileMaxLen=100
  #超過log最大存儲行數後需要從頂部開始刪除的行數(此處設置的是刪除第1到第10行的數據)
  local fileDeleteLen=10
  if test $fileName
  then
    #記錄log
    echo "[`date  %y/%m/%d-%H:%M:%S`]:$*" >> $fileName
    #獲取log文件實際行數
    loglen=`grep -c "" $fileName`
    if [ $loglen -gt $fileMaxLen ]
    then
      #從頂部開始刪除對應行數的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命令循環執行:

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/bash
watch -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

總結

目前這種實現方式也滿足了基本需求。

來源:微技術之傢

-END--

歡迎關註【輝哥傳書vlog】頭條號,喜歡記得點贊、收藏、評論、轉發哦!