执行shell脚本时,常常会打印一些日志到控制台,根据输出的日志,来判断脚本功能正确与否。但是,太多日志打印的话,会让阅读变得很困难,从日志信息里面找到我们关心的那部分也变得很不方便了。所以,有一个好用的shell脚本日志接口是非常有必要的,本文将聊聊实践中日志打印的一些技巧。
1、封装一个日志函数
最简单的方式,是在shell脚本中通过echo来打印,缺点是要改动时需要每处都修改,所以我们可以封装一个函数:
#!/bin/bash
function log()
{
echo "$@"
}
//测试:
log "this is a test..."
log "today is `date '+%Y-%m-%d'` "
通常,日志第一列是一个时间,修改如下:
#!/bin/bash
function log()
{
echo "$(date '+%Y-%m-%d %H:%M:%S') $@"
}
log "this is a test..."
输出:2021-07-27 19:55:54 this is a test...
2、日志级别:
#!/bin/bash
#日志级别 debug-1, info-2, warn-3, error-4, always-5
LOG_LEVEL=3 #调试日志
function log_debug()
{
content="[DEBUG] $(date '+%Y-%m-%d %H:%M:%S') $@"
[ $LOG_LEVEL -le 1 ] && echo -e "\033[32m" ${content} "\033[0m"}#信息日志
function log_info()
{
content="[INFO] $(date '+%Y-%m-%d %H:%M:%S') $@"
[ $LOG_LEVEL -le 2 ] && echo -e "\033[32m" ${content} "\033[0m"}#警告日志
function log_warn()
{
content="[WARN] $(date '+%Y-%m-%d %H:%M:%S') $@"
[ $LOG_LEVEL -le 3 ] && echo -e "\033[33m" ${content} "\033[0m"}#错误日志
function log_err()
{
content="[ERROR] $(date '+%Y-%m-%d %H:%M:%S') $@"
[ $LOG_LEVEL -le 4 ] && echo -e "\033[31m" ${content} "\033[0m"}#一直都会打印的日志
function log_always()
{
content="[ALWAYS] $(date '+%Y-%m-%d %H:%M:%S') $@"
[ $LOG_LEVEL -le 5 ] && echo -e "\033[32m" ${content} "\033[0m"
}
把日志级别分成 5 个等级,分别是 : debug日志、info日志、警告日志、错误日志、一直都打印的日志
,每个级别对应一个函数接口,而且每个级别可以定义不同的字符颜色,方便在屏幕上查看错误以及警告,上述脚本中错误日志是红色,警告日志是黄色,其他级别的日志是绿色。例如:
#!/bin/bash
source ./t.sh
log_debug "this is debug log..."
log_info "this is info log..."
log_warn "this is warn log..."
log_err "this is error log..."
log_always "this is always log.."
把 脚本中 LOG_LEVEL 设置为 1 , 执行,结果如下输出:
LOG_LEVEL 为 3 , 执行 ,结果如下:
从上面两次结果可以知道,日志级别设置为 debug级别 ( LOG_LEVEL = 1 ) 时,所有的等级的日志都会输出,当把日志级别设置为 info级别 ( LOG_LEVEL = 3 ) 后,只输出 warn日志、error日志 以及 always日志
如果想关闭所有级别的日志,把日志级别调到比 always日志 更高的级别,也即 LOG_LEVEL 的值大于 5 就行了。
3、写入文件
#日志文件
LOG_FILE=./log.txt
function log()
{
content="$(date '+%Y-%m-%d %H:%M:%S') $@"
echo $content >> $LOG_FILE
}