如何优雅地记录Shell脚本的执行日志
创作时间:
作者:
@小白创作中心
如何优雅地记录Shell脚本的执行日志
引用
CSDN
1.
https://blog.csdn.net/zhangkunls/article/details/141730779
在日常的Shell脚本开发中,我们经常需要运行脚本来监测系统数据。虽然能够通过控制台实时查看这些数据,但盯着屏幕看总是让人感到无聊且耗费时间。那么,有没有一种方式能够让我们在执行脚本时自动记录运行日志,方便后续分析呢?今天我们就来聊聊如何通过一个简单的日志记录函数来实现这一目标。
需求分析:把日志搞得明明白白
我们需要一个功能强大的日志函数,能够实现以下几个目标:
- 记录脚本的运行情况:这包括脚本输出的各种信息,无论是字符串、变量值,还是命令的执行结果。
- 记录时间戳:每条日志信息都应该带有精确的时间戳,方便我们追溯脚本的执行过程。
- 控制日志文件的大小:日志文件随着时间的推移会不断增大,所以需要在日志达到一定行数时,删除最早的日志记录,以避免日志文件无限制地增长。
实现思路:三天三夜后的优雅代码
经过不懈的努力,我们写出了一个简单而实用的日志记录函数 log(),它可以轻松地集成到任何Shell脚本中。下面是代码的核心部分:
#!/bin/bash
log(){
local fileName="./$(basename $0 .sh).log" # log文件名
local fileMaxLen=100 # log文件最大行数
local fileDeleteLen=10 # 达到最大行数后删除的行数
if test $fileName; then
echo "[`date +%y/%m/%d-%H:%M:%S`]:$*" >> $fileName
loglen=`grep -c "" $fileName`
if [ $loglen -gt $fileMaxLen ]; then
sed -i '1,'$fileDeleteLen'd' $fileName
fi
else
echo "[`date +%y/%m/%d-%H:%M:%S`]:$*" > $fileName
fi
}
这个函数非常简洁,但功能却很强大。它自动生成一个与脚本同名的日志文件,并且会在日志行数超过设定的最大值时,从文件顶部开始删除旧的日志记录。
实战演练:给脚本加点“料”
假设我们需要实时监控CPU温度,并记录每次监控的结果。通常我们会使用如下脚本:
echo CPU temperature is $[`cat /sys/class/thermal/thermal_zone0/temp`/1000]
通过watch
命令可以每秒自动运行这个脚本,并实时查看温度变化:
watch -n 1 ./cputemp.sh
但是,这种方式虽然可以实时监控,却无法保存历史数据,稍不留神就错过了关键的温度变化。于是我们把之前写的 log()
函数加到脚本中,修改后的脚本如下:
#!/bin/bash
log(){
local fileName="./$(basename $0 .sh).log"
local fileMaxLen=100
local fileDeleteLen=10
if test $fileName; then
echo "[`date +%y/%m/%d-%H:%M:%S`]:$*" >> $fileName
loglen=`grep -c "" $fileName`
if [ $loglen -gt $fileMaxLen ]; then
sed -i '1,'$fileDeleteLen'd' $fileName
fi
else
echo "[`date +%y/%m/%d-%H:%M:%S`]:$*" > $fileName
fi
}
echo CPU temperature is $[`cat /sys/class/thermal/thermal_zone0/temp`/1000]
log "CPU temperature is $[`cat /sys/class/thermal/thermal_zone0/temp`/1000]"
现在,你只需要运行脚本,日志文件就会自动生成并记录每次的温度信息。通过cat ./cputemp.log
可以查看日志,发现温度变化一目了然。
遇到的“坑”:挖坑容易填坑难
当然,开发过程中也遇到了一些“坑”,例如:
watch
命令的限制:你可能会想到直接在脚本里使用watch
命令来实现监控,但这会导致监控数据固定化,无法实时更新。最好的办法还是让watch
命令单独运行,而脚本负责记录日志。- 单引号里的变量引用问题:在使用
sed
命令时,如果需要在单引号内引用变量,需要对变量进行单引号嵌套处理,不然会报错。比如:
sed -i '1,'$fileDeleteLen'd' $fileName
总结:日志记录,其实可以很简单
通过简单的Shell函数,我们可以轻松实现日志记录功能,不仅解放了双眼,也让脚本的运行情况尽在掌握。虽然代码并不复杂,但却解决了一个实际的问题。如果你也有类似的需求,不妨试试这种方法,相信会给你的开发工作带来不少便利。
热门推荐
一周精通:ChatGPT AI绘画全攻略,从零基础到数字艺术家
论中国古代经济结构与封建社会的长期延续
垃圾焚烧炉自动燃烧控制系统设计与实现
两版《仙剑》角色对比:主角团全军覆没,配角有一人超越老版
反向和错位图灵测试:GPT-4比人类更「人性化」
同一定时器输出4路不同频率且占空比可调的PWM
猎奇是什么意思 探索未知的欲望与好奇心驱动
脑炎诊断方法
金铲铲之战S13赛季外交飞机阵容攻略:两套变阵玩法详解
年轻人抛弃搜索引擎
《思考,快与慢》:认清自我,避免陷入思维误区
简单易读的租房合同格式:让您的租房过程更轻松
4类人最容易发生“鬼压床”!3招教你快速破解
如何制定高效的实施方案?
两大民营银行新动向:网商发力交易银行方向,微众布局金融科技出海赛道
波音787 vs 空客A380:全球最大客机与最先进宽体机的全方位对比
为什么要买带有熄火保护装置的灶具?为什么不能使用超期服役的灶具?
Auto.js获取坐标的方法详解
如何使用 WinSAT 查看「Windows 体验指数」硬件评分
中国无犯罪记录证明详解:资格、要求和流程
nvidia-smi查看无进程,但GPU占用率100%问题解决
燃气热水器的升数选多大?内行人青睐的“16L”,并非谁都能用
倚天屠龙记中,她是来历神秘的黄衫女,真实身份或是最大谜团
什么是钙华现象?高考地理中的地形地貌地质作用过程
如何提升新能源汽车产业链的创新能力?
《偷听我心声后皇帝帮我去宫斗》短剧:浓缩精华,触动心弦
精细化推进老旧供水管网改造,助力管网漏损综合整治
送禮也是一種社交能力?觀察收到禮物後的三大反應,判斷禮物是否送到心坎裡!
权威专家谈:南禅寺保护历程的回顾、认知与展望
社保卡是否等同于医保卡?——2025年最新解析