shell脚本打日志技巧

2022-12-05  本文已影响0人  404d67ac8c12

执行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
}
上一篇下一篇

猜你喜欢

热点阅读