当前位置: 首页 > 科技观察

非常容易使用!Shell脚本日志技巧

时间:2023-03-20 01:54:52 科技观察

本文转载自微信公众号《Linux开发那些事》,作者LinuxThings。转载此文请联系Linux开发那些事公众号.在执行shell脚本时,经常会打印一些日志到控制台。根据输出日志判断脚本函数是否正确。但是,如果打印的日志过多,会造成阅读困难。从日志信息中找到我们关心的内容。那部分也变得很不方便。因此,有一个好用的shell脚本日志接口是非常有必要的。本文将在实践中谈谈日志打印的一些技巧。常见的日志打印方式在编写shell脚本时,最简单的日志打印就是使用echo输出,例如:下面是打印一个测试程序的日志[root@VM-0-2-centos~]#echo"thisisalogtest.log".."thisisalogtest...上面的方法使用起来很简单,写起来效率也很高。对于一些功能简单、代码量小的shell脚本,很适合这种打印日志的方式。上面这段简单快捷的通用界面,每次都用到了echo。没有统一的输出格式。在每条日志的开头添加指定的内容,脚本中的每一处都需要修改日志,成为手工任务。为此,可以定义一个输出函数,所有输出统一调用这个函数。现有的测试脚本t.sh内容如下#!/bin/bashfunctionlog(){echo"$@"}新建一个测试脚本ta.sh#!/bin/bashsource./t.shlog"thisisatest..."log"todayis`date'+%Y-%m-%d'`"执行./ta.h命令,结果如下[root@VM-0-2-centosshell_log]#./ta.shthisisatest...todayis2021-07-27如果想在每行日志前加上当前时间,可以直接修改t.sh中的日志函数。t.sh中调整后的脚本如下#!/bin/bashfunctionlog(){echo"$(date'+%Y-%m-%d%H:%M:%S')$@"}然后执行再次./ta.sh命令,结果如下[root@VM-0-2-centosshell_log]#./ta.sh2021-07-2719:55:54thisisatest...2021-07-2719:55:54todayis2021-07-27上面只修改了日志功能,t在a.sh中每行日志的开头输出当前时间。$@表示传递给日志函数的所有参数都被打印出来。调试脚本的时候,会增加很多日志打印。调试后需要关闭所有上面的日志输出已经将日志打印统一为一个功能。这个时候我们只需要禁止log函数的echo语句的执行即可。修改后的t.sh内容如下#!/bin/bashfunctionlog(){[0-gt1]&&echo"$(date'+%Y-%m-%d%H:%M:%S')$@"}当[0-gt1]表示条件结果为假时,echo语句将不会被执行,这样就可以关闭所有的日志打印。也可以在t.sh中添加一个变量来表示是否开启日志。开启后会有日志打印。当开关关闭时,日志打印功能将同时关闭。调整后的t.sh内容如下#!/bin/bashLOG_OPEN=0functionlog(){[$LOG_OPEN-eq1]&&echo"$(date'+%Y-%m-%d%H:%M:%S')$@"}当需要打开日志时,设置LOG_OPEN为1,关闭日志打印,设置为0为日志级别。在不同的脚本逻辑中,打印的日志应该有不同的作用,有的是临时变量值的输出,用于调试,有的是状态转换或到达不同阶段的提示信息,有的是严重错误,需要重点输出,提醒用户。上面输出了不同的颜色,方便查看,直接看修改后的t.sh脚本内容#!/bin/bash#logleveldebug-1,info-2,warn-3,error-4,always-5LOG_LEVEL=3#调试日志函数log_debug(){content="[DEBUG]$(date'+%Y-%m-%d%H:%M:%S')$@"[$LOG_LEVEL-le1]&&echo-e"\033[32m"${content}"\033[0m"}#informationlogfunctionlog_info(){content="[INFO]$(date'+%Y-%m-%d%H:%M:%S')$@[$LOG_LEVEL-le2]&&echo-e"\033[32m"${content}"\033[0m"}#警告日志函数log_warn(){content="[WARN]$(date'+%Y-%m-%d%H:%M:%S')$@"$LOG_LEVEL-le3]&&echo-e"\033[33m"${content}"\033[0m"}#错误日志函数log_err(){content="[ERROR]$(date'+%Y-%m-%d%H:%M:%S')$@"[$LOG_LEVEL-le4]&&echo-e"\033[31m"${content}"\033[0m"}#永远打印的logfunctionlog_always(){content="[ALWAYS]$(date'+%Y-%m-%d%H:%M:%S')$@"$LOG_LEVEL-le5]&&echo-e"\033[32m"${content}"\033[0m"}将日志级别分为5个级别,分别是:debug日志、info日志、警告日志、错误日志、一直打印的日志。每一层对应一个功能接口,每一层可以定义不同的字符颜色,方便在屏幕上查看错误和警告。在上面的脚本中,错误日志为红色,警告日志为黄色,其他级别日志为绿色修改ta.sh脚本,内容如下#!/bin/bashsource./t.shlog_debug"thisisdebuglog..."log_info"thisisinfolog..."log_warn"thisiswarnlog..."log_err"thisiserrorlog..."log_always"thisisalwayslog.."将LOG_LEVE放入t.sh将L设置为1,执行./ta.sh命令,结果如下再次将t.sh中的LOG_LEVEL调整为3,执行./ta.sh命令,结果如下从上面两个结果来看,我们可以知道,日志级别设置为debug级别(当LOG_LEVEL=1时),所有级别的日志都会输出。当日志级别设置为info级别(LOG_LEVEL=3)时,只会输出warn日志、error日志和always日志。如果要关闭所有级别的日志,将日志级别调整到比always日志更高的级别,即LOG_LEVEL的值大于5,写入文件即可。定时调用脚本时,有时需要查询一段时间内脚本的运行状态。在这种情况下,脚本通常是在后台运行的,如果要查询一段时间的日志,就需要将日志写入日志文件。比如定期备份数据库shell脚本,就需要记录每次备份的情况,方便后续查询调整t.sh脚本。添加语句将日志写入文件。修改后的脚本内容如下#!/bin/bash#logleveldebug-1,info-2,warn-3,error-4,always-5LOG_LEVEL=3#logfileLOG_FILE=./log.txt#debuglogfunctionlog_debug(){content="[DEBUG]$(date'+%Y-%m-%d%H:%M:%S')$@"[$LOG_LEVEL-le1]&&echo$内容>>$LOG_FILE&&echo-e"\033[32m"${content}"\033[0m"}#informationlogfunctionlog_info(){content="[INFO]$(date'+%Y-%m-%d%H:%M:%S')$@"[$LOG_LEVEL-le2]&&echo$content>>$LOG_FILE&&echo-e"\033[32m"${content}"\033[0m"}#警告日志函数log_warn(){content="[警告]$(日期'+%Y-%m-%d%H:%M:%S')$@[$LOG_LEVEL-le3]&&echo$content>>$LOG_FILE&&echo-e"\033[33m"${content}"\033[0m"}#错误日志函数log_err(){content="[ERROR]$(date'+%Y-%m-%d%H:%M:%S')$@"[$LOG_LEVEL-le4]&&echo$content>>$LOG_FILE&&echo-e"\033[31m"${content}"\033[0m"}#一直打印的logfunctionlog_always(){content="[ALWAYS]$(date'+%Y-%m-%d%H:%M:%S')$@[$LOG_LEVEL-le5]&&echo$content>>$LOG_FILE&&echo-e"\033[32m"${content}"\033[0m"}实际上在每个日志级别echo$content>>$LOG_FILE语句添加到界面,表示日志写入文件,$LOG_FILE表示日志文件当前日志级别为warn日志级别。执行./ta.sh命令,结果如下从上面的结果我们可以看到,执行./ta.sh命令后,除了屏幕上会输出日志外,还会在本地目录下生成一个log.txt文件。文件内容和屏幕上的日志一样技能,这些技能是s实践总结,文中提供了脚本的所有代码,可直接使用,也可根据实际需要调整