Linux错误日志按天归档核心是分离stderr、日期命名、定期清理:1.重定向2>>到date命名文件;2.cron每日切分归档并touch新文件;3.logrotate实现压缩/保留/通知等健壮轮转。

Linux运维脚本实现错误日志按天自动归档,核心是“分离错误输出 + 按日期命名 + 定期清理”,不需要复杂框架,用 shell 基础命令就能稳定运行。
1. 重定向 stderr 到带日期的文件
脚本执行时,把标准错误(stderr)单独捕获并写入当天日期命名的文件,是最直接的方式:
#!/bin/bash
LOG_DIR="/var/log/myapp"
DATE=$(date +\%Y\%m\%d)
ERR_LOG="$LOG_DIR/error_${DATE}.log"
<h1>确保目录存在</h1><p>mkdir -p "$LOG_DIR"</p><h1>执行主逻辑,仅将错误输出追加到当日错误日志</h1><p>your_main_command 2>>"$ERR_LOG"</p>说明:使用 2>> 追加错误流,避免覆盖;$(date +\%Y\%m\%d) 格式稳定、可排序、无特殊字符。
2. 配合 cron 每日零点触发归档(适合已有日志文件)
如果错误日志是持续写入的单一文件(如 error.log),可在每天凌晨做一次“切分归档”:
# 加入 crontab:每天 00:00 执行 0 0 * * * /bin/bash -c 'cd /path/to/script && ./rotate_errors.sh'
rotate_errors.sh 示例:
#!/bin/bash
LOG_FILE="/var/log/myapp/error.log"
ARCHIVE_DIR="/var/log/myapp/archive"
DATE=$(date -d 'yesterday' +\%Y\%m\%d) # 归档昨日内容
ARCHIVE_LOG="$ARCHIVE_DIR/error_${DATE}.log"
<p>mkdir -p "$ARCHIVE_DIR"</p><div class="aritcle_card flexRow">
<div class="artcardd flexRow">
<a class="aritcle_card_img" href="/xiazai/skill3817" title="onewo-rtlinux"><img
src="https://img.php.cn/upload/skill/000/000/081/178980860444696.jpg" alt="onewo-rtlinux" onerror="this.onerror='';this.src='/static/lhimages/moren/morentu.png'" ></a>
<div class="aritcle_card_info flexColumn">
<a href="/xiazai/skill3817" title="onewo-rtlinux">onewo-rtlinux</a>
<p>Linux 实时编程助手。生成、审查并修改用于周期性控制任务和中断驱动程序的 C 代码。强制实施实时调度策略。</p>
</div>
<a href="/xiazai/skill3817" title="onewo-rtlinux" class="aritcle_card_btn flexRow flexcenter"><b></b><span>下载</span> </a>
</div>
</div><h1>若原日志非空,则移动为昨日归档文件</h1><p>if [ -s "$LOG_FILE" ]; then
mv "$LOG_FILE" "$ARCHIVE_LOG"
fi</p><h1>立即重建空日志文件,保证后续写入不失败</h1><p>touch "$LOG_FILE"</p>注意:必须 touch 新日志,否则后续程序可能因文件丢失而报错或静默丢日志。
3. 用 logrotate 实现更健壮的托管归档
生产环境推荐用系统级工具 logrotate,它支持压缩、保留天数、轮转前/后执行命令等:
# /etc/logrotate.d/myapp-errors
/var/log/myapp/error.log {
daily
missingok
rotate 30
compress
delaycompress
notifempty
create 644 root root
sharedscripts
postrotate
# 可选:通知监控或触发告警
[ -x /usr/bin/systemctl ] && systemctl try-restart myapp.service > /dev/null 2>&1 || true
endscript
}
配置说明:
- daily:每天轮转一次
- rotate 30:最多保留30个归档(含当前)
- compress:归档后自动 gzip 压缩
- create:轮转后重建日志文件,权限和属主明确
- postrotate:适合在归档后 reload 服务或发送通知
4. 补充建议:让错误日志自带时间戳 & 可读性更强
单纯重定向 stderr 缺少时间信息。可在脚本中统一处理:
exec 2> >(while IFS= read -r line; do
echo "[$(date '+%Y-%m-%d %H:%M:%S')] ERROR: $line" >> "/var/log/myapp/error_$(date +\%Y\%m\%d).log"
done)
这样所有 stderr 输出都会自动带上精确到秒的时间戳,排查问题更高效。注意该方式需放在脚本开头,且依赖 bash 的进程替换功能。
实际部署时,优先用 logrotate 管理长期运行的服务日志;临时脚本或单次任务可用 date + 重定向组合;需要高精度上下文时再叠加时间戳封装。三者可混合使用,关键在保持归档路径清晰、命名一致、不留空洞。

















