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[31mdate +'%F %H:%M:%S'\t$1\t$2\033[0m" | tee -a $logfile;;
info)
echo -e "\033[32mdate +'%F %H:%M:%S'\t$1\t$2\033[0m" | tee -a $logfile;;
warn)
echo -e "\033[33mdate +'%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 # 没效果, 因为这个命令不在函数中.

转载:http://www.jb51.net/article/108721.htm

shell脚本实现分日志级别输出相关推荐

  1. Android系统10 RK3399 init进程启动(十八) isLoggable日志级别输出控制

    配套系列教学视频链接: 安卓系列教程之ROM系统开发-百问100ask 说明 系统:Android10.0 设备: FireFly RK3399 (ROC-RK3399-PC-PLUS) 前言 在编写 ...

  2. 宝塔linux shell定时访问url,bt(宝塔)面板添加shell 脚本通过nginx日志封访问频率过高的IP...

    额,这篇文章是bt(宝塔)面板来写的文章,其他的程序如果是wdcp管理面板也有添加shell脚本的功能,大鸟自己用的是bt(宝塔)面板,所以说说如何添加shell 脚本通过nginx日志封访问频率过高 ...

  3. python定时任务执行shell脚本切割Nginx日志-慎用

    Python定时任务执行shell脚本切割Nginx日志(慎用) 缘起 我们有一个Nginx服务用来接收埋点上报数据,输出的日志文件比较大,Nginx没有自带日志分割组件,这样输出的日志文件就比较大, ...

  4. shell脚本使得nginx日志每天定时切割压缩

    Linux下添加shell脚本使得nginx日志每天定时切割压缩 对于nginx的日志文件,特别是access日志,如果我们不做任何处理的话,最后这个文件将会变得非常庞大 这时,无论是出现异常时查日志 ...

  5. linux查询日志中页面返回状态码,[linux shell] Shell脚本实现apache日志中的状态码分析...

    这篇文章主要介绍了Shell脚本实现apache日志中的状态码分析,本文先是介绍了按天切割日志的方法,然后给出了分析访问状态码的脚本,需要的朋友可以参考下 一.首先将apache日志按天切割 复制代码 ...

  6. linux|shell脚本|有趣的知识---格式化输出日志和脚本调试方法以及kubernetes集群核心服务重启和集群证书备份脚本

    前言: shell脚本的功能十分强大,这一点毋庸置疑的.那么,平常的工作中总是免不了和脚本打交道,也免不了要自己编写一些脚本. 每个人都希望自己编写的脚本强壮,简单,易用,功能多,并且总是希望脚本运行 ...

  7. linux日志手机,通过 shell 脚本 自动发送 log日志 文件内容 到手机邮箱

    该楼层疑似违规已被系统折叠 隐藏此楼查看此楼 需要用到 mail 命令 如果你的系统中没有安装需要执行 (yum install -y mail sendmail) 安装 sendmail 是因为需要 ...

  8. shell脚本 定期删除日志

    定期删除日志: 然后建立清除日志文件的shell脚本,文件名为clean_log 只保留最近三天的日志     #! /bin/bash logdir=/var/log/httpd cd ${logd ...

  9. Liunx下的日志清理shell脚本实战之日志备份

    Liunx下的日志清理shell脚本实战 一.脚本实现功能以及要求 二.shell脚本内容 一.脚本实现功能以及要求 二.shell脚本内容 一.脚本实现功能以及要求 1.日志备份目录,将日志备份到/ ...

最新文章

  1. shell语法以及监控进程不存在重启
  2. 16-Storm-control //GNS3 2.1.5
  3. C++笔记函数重载函数模板
  4. Coverage analysis in AIE
  5. 【洛谷 2661】信息传递
  6. pcb钻孔披锋改善报告_高速高频PCB技术 || 玻纤效应对高速信号的影响
  7. 研华数据采集卡如何采集压力信号转化为数字信号_厦门信号发生器-泰华仪表...
  8. Fragment的生命周期同一Activity下不同Fragment之间的通信
  9. java随机10位随机数 random.uuid_一文详解编程中的随机数
  10. 私塾在线精华课程汇总贴(含源码和PPT)
  11. 三菱FX Q FX5U PLC 程序加密,使用ST结构化文
  12. vueAdmin-template-master十次方后台项目前端(已经完成初始化)下载地址
  13. 题目 1842: 对局匹配
  14. 二叉树的非递归遍历实现
  15. 戴尔服务器r720矩阵卡无响应,戴尔r720阵列卡驱动
  16. 简单网络管理协议SNMP通讯基础篇-熊健-专题视频课程
  17. 第三代酷睿i3处理器_轻薄本CPU谁更强?英特尔21款低功耗处理器大排行!
  18. 货币战争悲壮的英雄:帕潘德里欧
  19. ionic platform add android环境搭建之难产【i1】【小白-2016.11.5】
  20. 网易163邮箱配置-iOS、OS X邮箱客户端

热门文章

  1. 使用VSccde上传文件到Git时报错:fatal:Custom certificate bundle not found at path: F:/python错图墩铝?git娴狂球糕减裱镑勒惊/Gi
  2. Bin Packing Problem
  3. 1985年的图灵奖获得者-Richard Manning Karp
  4. 遗忘爱GhostXP SP2个人收藏版2007
  5. Aspose.Words for .NET使用表格教程之水平和垂直合并表格中单元格
  6. Arduino音乐代码《卡农》(简易版)
  7. Interview Vocabulary Summary
  8. 使用这10个随机网站生成器来丰富浏览器的首页
  9. 计算几何:正多边形的滚动与旋轮线…
  10. 《软件方法》第三章 自测题