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[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脚本实现分日志级别输出相关推荐
- Android系统10 RK3399 init进程启动(十八) isLoggable日志级别输出控制
配套系列教学视频链接: 安卓系列教程之ROM系统开发-百问100ask 说明 系统:Android10.0 设备: FireFly RK3399 (ROC-RK3399-PC-PLUS) 前言 在编写 ...
- 宝塔linux shell定时访问url,bt(宝塔)面板添加shell 脚本通过nginx日志封访问频率过高的IP...
额,这篇文章是bt(宝塔)面板来写的文章,其他的程序如果是wdcp管理面板也有添加shell脚本的功能,大鸟自己用的是bt(宝塔)面板,所以说说如何添加shell 脚本通过nginx日志封访问频率过高 ...
- python定时任务执行shell脚本切割Nginx日志-慎用
Python定时任务执行shell脚本切割Nginx日志(慎用) 缘起 我们有一个Nginx服务用来接收埋点上报数据,输出的日志文件比较大,Nginx没有自带日志分割组件,这样输出的日志文件就比较大, ...
- shell脚本使得nginx日志每天定时切割压缩
Linux下添加shell脚本使得nginx日志每天定时切割压缩 对于nginx的日志文件,特别是access日志,如果我们不做任何处理的话,最后这个文件将会变得非常庞大 这时,无论是出现异常时查日志 ...
- linux查询日志中页面返回状态码,[linux shell] Shell脚本实现apache日志中的状态码分析...
这篇文章主要介绍了Shell脚本实现apache日志中的状态码分析,本文先是介绍了按天切割日志的方法,然后给出了分析访问状态码的脚本,需要的朋友可以参考下 一.首先将apache日志按天切割 复制代码 ...
- linux|shell脚本|有趣的知识---格式化输出日志和脚本调试方法以及kubernetes集群核心服务重启和集群证书备份脚本
前言: shell脚本的功能十分强大,这一点毋庸置疑的.那么,平常的工作中总是免不了和脚本打交道,也免不了要自己编写一些脚本. 每个人都希望自己编写的脚本强壮,简单,易用,功能多,并且总是希望脚本运行 ...
- linux日志手机,通过 shell 脚本 自动发送 log日志 文件内容 到手机邮箱
该楼层疑似违规已被系统折叠 隐藏此楼查看此楼 需要用到 mail 命令 如果你的系统中没有安装需要执行 (yum install -y mail sendmail) 安装 sendmail 是因为需要 ...
- shell脚本 定期删除日志
定期删除日志: 然后建立清除日志文件的shell脚本,文件名为clean_log 只保留最近三天的日志 #! /bin/bash logdir=/var/log/httpd cd ${logd ...
- Liunx下的日志清理shell脚本实战之日志备份
Liunx下的日志清理shell脚本实战 一.脚本实现功能以及要求 二.shell脚本内容 一.脚本实现功能以及要求 二.shell脚本内容 一.脚本实现功能以及要求 1.日志备份目录,将日志备份到/ ...
最新文章
- shell语法以及监控进程不存在重启
- 16-Storm-control //GNS3 2.1.5
- C++笔记函数重载函数模板
- Coverage analysis in AIE
- 【洛谷 2661】信息传递
- pcb钻孔披锋改善报告_高速高频PCB技术 || 玻纤效应对高速信号的影响
- 研华数据采集卡如何采集压力信号转化为数字信号_厦门信号发生器-泰华仪表...
- Fragment的生命周期同一Activity下不同Fragment之间的通信
- java随机10位随机数 random.uuid_一文详解编程中的随机数
- 私塾在线精华课程汇总贴(含源码和PPT)
- 三菱FX Q FX5U PLC 程序加密,使用ST结构化文
- vueAdmin-template-master十次方后台项目前端(已经完成初始化)下载地址
- 题目 1842: 对局匹配
- 二叉树的非递归遍历实现
- 戴尔服务器r720矩阵卡无响应,戴尔r720阵列卡驱动
- 简单网络管理协议SNMP通讯基础篇-熊健-专题视频课程
- 第三代酷睿i3处理器_轻薄本CPU谁更强?英特尔21款低功耗处理器大排行!
- 货币战争悲壮的英雄:帕潘德里欧
- ionic platform add android环境搭建之难产【i1】【小白-2016.11.5】
- 网易163邮箱配置-iOS、OS X邮箱客户端
热门文章
- 使用VSccde上传文件到Git时报错:fatal:Custom certificate bundle not found at path: F:/python错图墩铝?git娴狂球糕减裱镑勒惊/Gi
- Bin Packing Problem
- 1985年的图灵奖获得者-Richard Manning Karp
- 遗忘爱GhostXP SP2个人收藏版2007
- Aspose.Words for .NET使用表格教程之水平和垂直合并表格中单元格
- Arduino音乐代码《卡农》(简易版)
- Interview Vocabulary Summary
- 使用这10个随机网站生成器来丰富浏览器的首页
- 计算几何:正多边形的滚动与旋轮线…
- 《软件方法》第三章 自测题