shell脚本实现分日志级别输出的方法

 更新时间:2017年03月17日 10:06:59   投稿:jingxian   我要评论
下面小编就为大家带来一篇shell脚本实现分日志级别输出的方法。小编觉得挺不错的,现在就分享给大家,也给大家做个参考。一起跟随小编过来看看吧

shell脚本如何优雅的记录日志信息,下面让我们一步一步,让shell脚本的日志也变得高端起来,实现如下功能

①设定日志级别,实现可以输出不同级别的日志信息,方便调试

②日志格式类似为:[日志级别] 时间 funcname:函数名 [lineno:行号] 日志信息

③不同级别,设定不同颜色

④让其变为函数库文件,重用代码

下面看看我用shell记录日志的进化之路

1.最简单的日志记录方式

对于刚入门的同学,记录日志一般用echo加重定向方式,这应该是最原始的方式了^_^

echo "log message" > file

2.简单函数封装,简化重复写重定向到日志文件

当你想记录的日志变多,你得重复的写echo “”>$logfile,这也是件挺麻烦的事情,于是我就写了个log函数,这样修改的时候也比较方便。

log() {
  msg=$1
  echo $msg > log.file
}

3.实现日志的级别不同颜色输出

某天使用某脚本的时候,报错了确没发现,于是就想将报错信息用不同颜色字体,这样会稍微友好一点,请看下面函数

function log {
  local text;local logtype
  logfile=./log.txt
  logtype=$1
  text=$2
  #其实可以再将日志的格式定义为一个字符串,这样就不用重复写`date +'%F %H:%M:%S'`\t$1\t$2\033[0m,又可以省好多代码。
  case $logtype in 
    error)
      echo -e "\033[31m`date +'%F %H:%M:%S'`\t$1\t$2\033[0m" | tee -a $logfile;;
    info)
      echo -e "\033[32m`date +'%F %H:%M:%S'`\t$1\t$2\033[0m" | tee -a $logfile;;
    warn)
      echo -e "\033[33m`date +'%F %H:%M:%S'`\t$1\t$2\033[0m" | tee -a $logfile;;
  esac
}

4.实现设定日志级别,输出不同级别以上的日志,方便调试

学了Python的日志模块后,想着如何像python那样,可以设定日志级别,比如设定debug,那么只有debug级别以上的日志会输出,而且日志的格式也支持定义,常见格式 如下:[日志级别] 时间 funcname:函数名 [lineno:行号] 日志信息

请看如下的log函数:大家可以将log函数放到一个单独文件,称为函数库文件,然后写脚本的时候,通过source或 . 命令引入,就想python的导入模块一样,重用log的代码

#!/bin/bash
#可将log函数单独放一个文件,通过.命令引入,这样就可以共用了
#. log.sh 
#设置日志级别
loglevel=0 #debug:0; info:1; warn:2; error:3
logfile=$0".log"
function log {
    local msg;local logtype
    logtype=$1
    msg=$2
    datetime=`date +'%F %H:%M:%S'`
    #使用内置变量$LINENO不行,不能显示调用那一行行号
    #logformat="[${logtype}]\t${datetime}\tfuncname:${FUNCNAME[@]} [line:$LINENO]\t${msg}"
    logformat="[${logtype}]\t${datetime}\tfuncname: ${FUNCNAME[@]/log/}\t[line:`caller 0 | awk '{print$1}'`]\t${msg}"
    #funname格式为log error main,如何取中间的error字段,去掉log好办,再去掉main,用echo awk? ${FUNCNAME[0]}不能满足多层函数嵌套
    {  
    case $logtype in 
        debug)
            [[ $loglevel -le 0 ]] && echo -e "\033[30m${logformat}\033[0m" ;;
        info)
            [[ $loglevel -le 1 ]] && echo -e "\033[32m${logformat}\033[0m" ;;
        warn)
            [[ $loglevel -le 2 ]] && echo -e "\033[33m${logformat}\033[0m" ;;
        error)
            [[ $loglevel -le 3 ]] && echo -e "\033[31m${logformat}\033[0m" ;;
    esac
    } | tee -a $logfile
}
#以下为测试
debug () {
    log debug "there are $# parameters:$@"
}
info() {
    log info "funcname:${FUNCNAME[@]},lineno:$LINENO"
}
warn() {
    log warn "funcname:${FUNCNAME[0]},lineno:$LINENO"
}
error() {
    log error "the first para:$1;the second para:$2"
}
set -x
debug first second
set +x
info first second
warn first second 
error first second

输出如下:

在写这个函数的遇到一个问题就是不能用内建变量$LINENO来取得调用的行号,只能取得log函数中定义$LINENO那一行,搜了许久找到的解决办法是利用caller命令,关于caller命令的用法,如下:

5.caller的用法

caller命令放到函数中, 将会在stdout上打印出函数的调用者信息.,caller命令也可以在一个被source的脚本中返回调用者信息. 当然这个调用者就是source这个脚本的脚本. 就像函数一样, 这是一个”子例程调用”.你会发现这个命令在调试的时候特别有用.

 #!/bin/bash
 function1 ()
 {
  # 在 function1 () 内部.
  caller 0  # 显示调用者信息.
 }
 function1  # 脚本的第9行.
 # 9 main test.sh
 # ^         函数调用者所在的行号.
 #  ^^^^      从脚本的"main"部分开始调用的.
 #    ^^^^^^^  调用脚本的名字.
 caller 0   # 没效果, 因为这个命令不在函数中.

以上这篇shell脚本实现分日志级别输出的方法就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持澳门金沙网上娱乐。

相关文章

  • 详解Linux ln 命令

    详解Linux ln 命令

    Linux 中的文件分为 Hard Link 和 Symbolic Link 两种。Hard Link 文件又被称为硬链接文件、实体链接文件,Symbolic Link 文件则常被称为符号链接、软链接文件。这篇文章主要介绍了Linux ln 命令 ,需要的朋友可以参考下
    2019-08-08
  • Nginx和PHP-FPM的启动、重启、停止脚本分享

    Nginx和PHP-FPM的启动、重启、停止脚本分享

    这篇文章主要介绍了Nginx和PHP-FPM的启动、重启、停止脚本分享,脚本中包含start、stop、reload、restart等常用的管理方法,并可以加入系统服务然后使用servicem命令管理,需要的朋友可以参考下
    2014-12-12
  • Shell实现多级菜单系统安装维护脚本实例分享

    Shell实现多级菜单系统安装维护脚本实例分享

    这篇文章主要介绍了Shell实现多级菜单系统安装维护脚本实例分享,本文脚本用多级菜单实现管理WEB服务器、Mysql服务器、Nginx服器等,需要的朋友可以参考下
    2014-12-12
  • LINUX 查找tomcat日志关键词命令

    LINUX 查找tomcat日志关键词命令

    下面小编就为大家带来一篇LINUX 查找tomcat日志关键词命令。小编觉得挺不错的,现在就分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2017-03-03
  • scp命令详解(全)

    scp命令详解(全)

    这篇文章主要介绍了scp命令,scp如何做远程拷贝,下面小编帮助大家解决有关scp命令相关知识,需要的朋友可以参考下
    2015-08-08
  • CentOS下redis自启动shell脚本

    CentOS下redis自启动shell脚本

    这篇文章主要介绍了CentOS下redis自启动shell脚本,使用此脚本可以加入系统服务,实现redis机启动,并且包含了如启动、停止、重启等功能命令,需要的朋友可以参考下
    2014-08-08
  • 查找目录下同名但不同后缀名文件的shell脚本代码

    查找目录下同名但不同后缀名文件的shell脚本代码

    这个脚本可以实现指定目录下同名但不同后缀名的查找,可以拓展为删除指定的文件的脚本,觉得很实用,分享一下
    2013-02-02
  • sed删除文件中的一行内容的脚本代码

    sed删除文件中的一行内容的脚本代码

    sed删除文件中的一行内容的脚本代码,需要的朋友可以参考下
    2013-03-03
  • Shell创建用户并生成随机密码脚本分享

    Shell创建用户并生成随机密码脚本分享

    这篇文章主要介绍了Shell创建用户并生成随机密码脚本分享,本文生成的随机密码会比较复杂和实用,需要的朋友可以参考下
    2014-12-12
  • linux C语言开发管道通信实例详解

    linux C语言开发管道通信实例详解

    这篇文章主要介绍了linux C语言开发管道通信实例详解的相关资料,需要的朋友可以参考下
    2017-01-01

最新评论