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

Posted EngineerForSoul

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了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 "\\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"


调用

[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 "\\033[32m"  $content  "\\033[0m"

#信息日志
function log_info()
  content="[INFO] $(date '+%Y-%m-%d %H:%M:%S') $@"
  [ $LOG_LEVEL -le 2  ] && echo $content >> $LOG_FILE && echo -e "\\033[32m"  $content "\\033[0m"

#警告日志
function log_warn()
  content="[WARN] $(date '+%Y-%m-%d %H:%M:%S') $@"
  [ $LOG_LEVEL -le 3  ] && echo $content >> $LOG_FILE && echo -e "\\033[33m" $content "\\033[0m"

#错误日志
function log_err()
  content="[ERROR] $(date '+%Y-%m-%d %H:%M:%S') $@"
  [ $LOG_LEVEL -le 4  ] && echo $content >> $LOG_FILE && echo -e "\\033[31m" $content "\\033[0m"

#一直都会打印的日志
function log_always()
   content="[ALWAYS] $(date '+%Y-%m-%d %H:%M:%S') $@"
   [ $LOG_LEVEL -le 5  ] && echo $content >> $LOG_FILE && echo -e  "\\033[32m" $content "\\033[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 中的方法有待优化。
以上三个想法留着后面补充吧!!!

以上是关于07 linux 一个完整的shell脚本调试工具的主要内容,如果未能解决你的问题,请参考以下文章

Linux拓展之调试脚本

shell脚本调试

如何在shell脚本中修改添加替换指定文件中的内容

如何调试LoadRunner脚本

如何调试LoadRunner脚本

怎么通过你shell脚本删除文件的某一行以及后面几行