Linux脚本学习笔记,log函数使用技巧

发表于:2024-1-19 09:20

字体: | 上一篇 | 下一篇 | 我要投稿

 作者:微技术    来源:微技术之家

  本文主要讲述的是一个关于记录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
  总结:
  目前这种实现方式也满足了基本需求。
  本文内容不用于商业目的,如涉及知识产权问题,请权利人联系51Testing小编(021-64471599-8017),我们将立即处理
《2023软件测试行业现状调查报告》独家发布~

关注51Testing

联系我们

快捷面板 站点地图 联系我们 广告服务 关于我们 站长统计 发展历程

法律顾问:上海兰迪律师事务所 项棋律师
版权所有 上海博为峰软件技术股份有限公司 Copyright©51testing.com 2003-2024
投诉及意见反馈:webmaster@51testing.com; 业务联系:service@51testing.com 021-64471599-8017

沪ICP备05003035号

沪公网安备 31010102002173号