shell脚本实现分日志级别输出的方法
发布时间 - 2026-01-11 00:13:31 点击率:次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脚本实现分日志级别输出的方法就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持。
# shell脚本输出日志
# shell将脚本输出结果记录到日志文件的实现
# 输出执行操作和打印日志的shell脚本实例
# Linux shell脚本输出日志笔记整理(必看篇)
# 行号
# 调用者
# 给大家
# 我就
# 就像
# 让我们
# 会在
# 你想
# 这是一个
# 之路
# 错了
# 我用
# 用了
# 希望能
# 写了
# 再去
# 一个问题
# 就想
# 这篇
# 不能用
相关栏目:
【
网站优化151355 】
【
网络推广146373 】
【
网络技术251813 】
【
AI营销90571 】
相关推荐:
北京网页设计制作网站有哪些,继续教育自动播放怎么设置?
高性能网站服务器部署指南:稳定运行与安全配置优化方案
Laravel如何与Docker(Sail)协同开发?(环境搭建教程)
Python面向对象测试方法_mock解析【教程】
如何在阿里云完成域名注册与建站?
如何用AI帮你把自己的生活经历写成一个有趣的故事?
再谈Python中的字符串与字符编码(推荐)
javascript中的数组方法有哪些_如何利用数组方法简化数据处理
Android使用GridView实现日历的简单功能
google浏览器怎么清理缓存_谷歌浏览器清除缓存加速详细步骤
laravel怎么用DB facade执行原生SQL查询_laravel DB facade原生SQL执行方法
佐糖AI抠图怎样调整抠图精度_佐糖AI精度调整与放大细化操作【攻略】
猪八戒网站制作视频,开发一个猪八戒网站,大约需要多少?或者自己请程序员,需要什么程序员,多少程序员能完成?
详解Android——蓝牙技术 带你实现终端间数据传输
Laravel怎么写单元测试_PHPUnit在Laravel项目中的基础测试入门
Laravel如何构建RESTful API_Laravel标准化API接口开发指南
如何在Windows虚拟主机上快速搭建网站?
QQ浏览器网页版登录入口 个人中心在线进入
今日头条AI怎样推荐抢票工具_今日头条AI抢票工具推荐算法与筛选【技巧】
网页设计与网站制作内容,怎样注册网站?
浅析上传头像示例及其注意事项
学生网站制作软件,一个12岁的学生写小说,应该去什么样的网站?
香港服务器网站测试全流程:性能评估、SEO加载与移动适配优化
php打包exe后无法访问网络共享_共享权限设置方法【教程】
Gemini怎么用新功能实时问答_Gemini实时问答使用【步骤】
Laravel中Service Container是做什么的_Laravel服务容器与依赖注入核心概念解析
HTML 中动态设置元素 name 属性的正确语法详解
Laravel Admin后台管理框架推荐_Laravel快速开发后台工具
EditPlus 正则表达式 实战(3)
如何快速搭建虚拟主机网站?新手必看指南
如何用PHP工具快速搭建高效网站?
胶州企业网站制作公司,青岛石头网络科技有限公司怎么样?
北京网站制作的公司有哪些,北京白云观官方网站?
如何确保西部建站助手FTP传输的安全性?
WEB开发之注册页面验证码倒计时代码的实现
详解MySQL数据库的安装与密码配置
Laravel怎么设置路由分组Prefix_Laravel多级路由嵌套与命名空间隔离【步骤】
今日头条微视频如何找选题 今日头条微视频找选题技巧【指南】
Python文件流缓冲机制_IO性能解析【教程】
Android利用动画实现背景逐渐变暗
关于BootStrap modal 在IOS9中不能弹出的解决方法(IOS 9 bootstrap modal ios 9 noticework)
Laravel Eloquent性能优化技巧_Laravel N+1查询问题解决
LinuxShell函数封装方法_脚本复用设计思路【教程】
如何快速上传自定义模板至建站之星?
原生JS实现图片轮播切换效果
网站制作价目表怎么做,珍爱网婚介费用多少?
Laravel如何操作JSON类型的数据库字段?(Eloquent示例)
Win10如何卸载预装Edge扩展_Win10卸载Edge扩展教程【方法】
品牌网站制作公司有哪些,买正品品牌一般去哪个网站买?
哪家制作企业网站好,开办像阿里巴巴那样的网络公司和网站要怎么做?

