答案:通过脚本预处理实现按错误级别分离日志。利用grep提取Error和WARN级别日志到独立文件,logrotate按配置每日轮转并压缩,关键日志保留14天,结合postrotate执行分离脚本,确保日志高效管理与排查。

在linux系统中,日志文件会随着时间不断增长,影响系统性能和排查问题的效率。logrotate 是 Linux 下用于自动轮转、压缩和清理日志的标准工具。虽然 logrotate 本身不能直接按“错误级别”(如 ERROR、WARN)切割日志,但可以通过结合脚本过滤日志内容,实现按错误级别分离日志并进行轮转。
logrotate 基本原理
logrotate 通过配置文件定义日志的轮转策略,比如轮转周期、保留份数、是否压缩等。默认配置位于 /etc/logrotate.conf,而具体服务的配置通常放在 /etc/logrotate.d/ 目录下。
按错误级别切割日志的思路
由于 logrotate 不解析日志内容,无法直接按 ERROR、WARN 等级别分离。但可以借助外部脚本,在轮转前将原始日志按级别拆分出多个文件,再由 logrotate 分别处理这些文件。
示例场景:
假设应用日志位于 /var/log/app.log,格式包含日志级别,例如:
2025-04-05 10:00:00 ERROR User login failed
2025-04-05 10:01:00 WARN Disk usage high
我们希望分离出:/var/log/app.error.log 和 /var/log/app.warn.log,并分别轮转。
配置实例:按错误级别切割并轮转
1. 编写日志分离脚本
创建脚本 /usr/local/bin/split_app_log.sh:
#!/bin/bash LOG_FILE="/var/log/app.log" ERROR_LOG="/var/log/app.error.log" WARN_LOG="/var/log/app.warn.log" <h1>提取 ERROR 级别日志追加到 error 文件</h1><p>grep " ERROR " "$LOG_FILE" >> "$ERROR_LOG"</p><h1>提取 WARN 级别日志追加到 warn 文件</h1><p>grep " WARN " "$LOG_FILE" >> "$WARN_LOG"</p><h1>清空原日志或备份后清空</h1><p>> "$LOG_FILE"</p>
赋予执行权限:
chmod +x /usr/local/bin/split_app_log.sh
2. 配置 logrotate 规则
/var/log/app.log { daily missingok rotate 7 compress delaycompress notifempty postrotate /usr/local/bin/split_app_log.sh endscript } <p>/var/log/app.error.log /var/log/app.warn.log { daily missingok rotate 14 compress delaycompress notifempty create 644 root root }</p>
说明:
- daily:每天轮转一次
- rotate 7:保留最近 7 个轮转文件
- postrotate … endscript:在轮转后执行脚本,分离日志内容
- app.error.log 和 app.warn.log 保留 14 天,因错误日志更关键
- create:确保分离出的日志文件权限正确
测试与验证
使用以下命令测试配置语法:
logrotate -d /etc/logrotate.d/app
-d 表示调试模式,不会真正执行。
强制执行一次轮转:
logrotate -f /etc/logrotate.d/app
检查 /var/log/app.error.log 和 /var/log/app.warn.log 是否生成对应内容。
基本上就这些。通过脚本预处理日志内容,再配合 logrotate 的轮转机制,就能实现按错误级别切割和管理日志。关键是分离逻辑要清晰,避免重复或遗漏日志条目。