07 linux 一个完整的shell脚本调试工具


在这里插入图片描述

执行shell脚本时,常常会打印一些日志到控制台,根据输出的日志,来判断脚本功能正确与否。

常用的日志输出形式

通过Vim编辑需要调试的脚本,在脚本很多行使用echo输出不同的内容来作为调试的依据

[userwin@MiWiFi-R3L-srv temp]$ echo "This is a test log"
This is a test log

通常小篇幅的shell 脚本,使用echo的形式来调试,木的问题。
但是如果shell脚本有上千行,且逻辑复杂的情况下,这种就很难满足要求。

使用OOP编程思想设计log函数

[userwin@MiWiFi-R3L-srv temp]$ vim log.sh

#!/bin/bash
function log()
{
        echo "$@"
}
[userwin@MiWiFi-R3L-srv temp]$ vim debug.sh

#!/bin/bash
source ./log.sh

log "test log funciton"
log "today is `date '+%Y-%m-%d'` "

[userwin@MiWiFi-R3L-srv temp]$ sh debug.sh 
test log funciton
today is 2021-11-26

让log方法象log4j一样 输出时前面带日期和时间

[userwin@MiWiFi-R3L-srv temp]$ vim log.sh

#!/bin/bash
function log()
{
        echo "$(date '+%Y-%m-%d %H:%M:%S') $@"
}

[userwin@MiWiFi-R3L-srv temp]$ sh debug.sh 
2021-11-26 00:04:53 test log funciton
2021-11-26 00:04:53 today is 2021-11-26 

为日志输出添加开关

LOG_OPEN=1 即为Log日志的开关。

[userwin@MiWiFi-R3L-srv temp]$ cat log.sh 
#!/bin/bash
LOG_OPEN=1
function log()
{
	[ $LOG_OPEN -eq 1 ]  && echo "$(date '+%Y-%m-%d %H:%M:%S') $@"
}

划分日志等级 并添加颜色

[userwin@MiWiFi-R3L-srv temp]$ vim log.sh 

#!/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 "33[32m"  ${content}  "33[0m"
}
#信息日志
function log_info(){
  content="[INFO] $(date '+%Y-%m-%d %H:%M:%S') $@"
  [ $LOG_LEVEL -le 2  ] && echo -e "33[32m"  ${content} "33[0m"
}
#警告日志
function log_warn(){
  content="[WARN] $(date '+%Y-%m-%d %H:%M:%S') $@"
  [ $LOG_LEVEL -le 3  ] && echo -e "33[33m" ${content} "33[0m"
}
#错误日志
function log_err(){
  content="[ERROR] $(date '+%Y-%m-%d %H:%M:%S') $@"
  [ $LOG_LEVEL -le 4  ] && echo -e "33[31m" ${content} "33[0m"
}
#一直都会打印的日志
function log_always(){
   content="[ALWAYS] $(date '+%Y-%m-%d %H:%M:%S') $@"
   [ $LOG_LEVEL -le 5  ] && echo -e  "33[32m" ${content} "33[0m"
}

调用

[userwin@MiWiFi-R3L-srv temp]$ vim test.sh 

#!/bin/bash

source ./log.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.."

输出结果

[userwin@MiWiFi-R3L-srv temp]$ sh test.sh 
 [WARN] 2021-11-28 23:05:23 this is warn log... 
 [ERROR] 2021-11-28 23:05:23 this is error log... 
 [ALWAYS] 2021-11-28 23:05:23 this is always log.. 

输出到文件

vim logFile.sh
#!/bin/bash

#日志级别 debug-1, info-2, warn-3, error-4, always-5
LOG_LEVEL=3

#日志文件
LOG_FILE=./log.txt

#调试日志
function log_debug(){
  content="[DEBUG] $(date '+%Y-%m-%d %H:%M:%S') $@"
  [ $LOG_LEVEL -le 1  ] && echo $content >> $LOG_FILE && echo -e "33[32m"  ${content}  "33[0m"
}
#信息日志
function log_info(){
  content="[INFO] $(date '+%Y-%m-%d %H:%M:%S') $@"
  [ $LOG_LEVEL -le 2  ] && echo $content >> $LOG_FILE && echo -e "33[32m"  ${content} "33[0m"
}
#警告日志
function log_warn(){
  content="[WARN] $(date '+%Y-%m-%d %H:%M:%S') $@"
  [ $LOG_LEVEL -le 3  ] && echo $content >> $LOG_FILE && echo -e "33[33m" ${content} "33[0m"
}
#错误日志
function log_err(){
  content="[ERROR] $(date '+%Y-%m-%d %H:%M:%S') $@"
  [ $LOG_LEVEL -le 4  ] && echo $content >> $LOG_FILE && echo -e "33[31m" ${content} "33[0m"
}
#一直都会打印的日志
function log_always(){
   content="[ALWAYS] $(date '+%Y-%m-%d %H:%M:%S') $@"
   [ $LOG_LEVEL -le 5  ] && echo $content >> $LOG_FILE && echo -e  "33[32m" ${content} "33[0m"
}

调用

[userwin@MiWiFi-R3L-srv temp]$ vim test.sh 

#!/bin/bash

source ./logFile.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.."

输出结果:

[userwin@MiWiFi-R3L-srv temp]$ cat log.txt 
[WARN] 2021-11-28 23:09:00 this is warn log...
[ERROR] 2021-11-28 23:09:00 this is error log...
[ALWAYS] 2021-11-28 23:09:00 this is always log..

为什么输出没有颜色? 见下图

在这里插入图片描述
修改输出信息如下就有颜色处处了
在这里插入图片描述
输出记过
在这里插入图片描述

总结

脚本还有待完善,目前有如下几个想法
1:创建log.cfg配置文件,放如下配置

#日志级别 debug-1, info-2, warn-3, error-4, always-5
LOG_LEVEL=3
#日志文件
LOG_FILE=./log.txt

修改 logFile.sh 如果读取log.cfg 有值,则取其值;无值,给个默认值。

2:将这两个配置写在调用shell 脚本中,并将这个量变量导入环境变量中,如果logFile.sh 没有取到系统变量,就给个默认值。
如此,脚本就编程谁调用,谁给日志配置日志等级和日志输出路径。

3: logFile.sh 中的方法有待优化。
以上三个想法留着后面补充吧!!!

本图文内容来源于网友网络收集整理提供,作为学习参考使用,版权属于原作者。
THE END
分享
二维码
< <上一篇
下一篇>>