debian分卷如何进行日志分析
小樊
35
2026-01-01 09:42:04
Debian 分卷日志分析指南
一 场景与原则
- 在 Debian 中,“分卷日志”通常有两种形态:
- 基于文件的轮转:由 logrotate 按时间或大小将日志切分为多个历史文件,如 /var/log/syslog.1、syslog.2.gz、kern.log.1、kern.log.2.gz 等,当前日志为 /var/log/syslog。这类文件需要一次性或批量读取并合并分析。
- 基于 systemd 的 journal:日志由 journald 集中管理,支持按时间、服务、优先级等条件检索,并可导出为结构化格式(如 JSON),便于程序化分析。
二 基于文件的轮转日志分析
- 快速定位与查看
- 列出并查看当前与历史分卷:ls -lh /var/log | egrep ‘syslog|kern|auth’; less /var/log/syslog; tail -f /var/log/syslog
- 实时跟踪最新日志:tail -f /var/log/syslog
- 跨分卷检索关键字(含压缩文件)
- 当前与未压缩历史:grep -H ‘error’ /var/log/syslog*
- 包含已压缩历史:zgrep -H ‘error’ /var/log/syslog*
- 全目录递归搜索:sudo find /var/log -type f ( -name “.gz" -o -name ".[0-9]” ) -exec zgrep -H ‘error’ {} ;
- 按时间窗口筛选
- 仅今天:grep “$(date ‘+%b %d’)” /var/log/syslog*
- 指定日期(例:2025-04-01):grep “Apr 1” /var/log/syslog* 或使用 journalctl(见下节)
- 统计与定位
- 统计错误数:zgrep -c ‘error’ /var/log/syslog*
- 按进程统计错误:zgrep -h ‘error’ /var/log/syslog* | awk ‘{print $5}’ | sort | uniq -c | sort -nr
- 查看某进程最近错误:zgrep -h ‘error’ /var/log/syslog* | grep ‘myservice’ | tail -50
- 实用组合示例
- 近 1 小时内的错误并按服务汇总:
- journalctl --since “1 hour ago” -p err | awk ‘{print $5}’ | sort | uniq -c | sort -nr
- 若必须仅用文件:zgrep -h ‘error’ /var/log/syslog* | awk -v d=“$(date -d ‘1 hour ago’ ‘+%b %d %H’)” ‘$0 ~ d {print $5}’ | sort | uniq -c | sort -nr
三 基于 journal 的集中式分析
- 基本检索
- 查看全部:journalctl
- 实时跟踪:journalctl -f
- 按服务:journalctl -u nginx.service
- 按时间:journalctl --since “2025-04-01 00:00:00” --until “2025-04-30 23:59:59”
- 按优先级:journalctl -p err
- 仅本次启动:journalctl -b
- 内核日志:journalctl -k
- 结构化与导出
- JSON 导出便于后续分析:journalctl -o json --since “2025-04-01” | jq ‘select(.PRIORITY<=3) | {__REALTIME_TIMESTAMP, _SYSTEMD_UNIT, MESSAGE}’ > errors.json
- 与文件方式互补
- 若 journal 未持久化或需回溯更早历史,可回到上一节的文件检索方法覆盖 /var/log 下的轮转分卷。
四 高效检索与统计命令模板
- 按时间窗口统计错误数(文件方式)
- zgrep -ch ‘error’ /var/log/syslog* | awk ‘{sum+=$1} END {print “Total errors:”, sum}’
- Top N 报错来源(服务/进程)
- zgrep -h ‘error’ /var/log/syslog* | awk ‘{print $5}’ | sort | uniq -c | sort -nr | head
- 某服务在指定日期的错误趋势
- zgrep -h ‘error’ /var/log/syslog* | grep ‘sshd’ | grep “Apr 10” | awk ‘{print $3}’ | sort | uniq -c
- 内核错误并按设备归类
- zgrep -h ‘error’ /var/log/kern.log* | awk ‘{print $6}’ | sort | uniq -c | sort -nr
- 将检索结果导出为文件
- zgrep -h ‘error’ /var/log/syslog* > errors.txt
- journalctl -o short-iso-precise --since “2025-04-01” > journal.tsv
五 日志轮转与保留策略建议
- 使用 logrotate 管理分卷:主配置 /etc/logrotate.conf,服务配置在 /etc/logrotate.d/。常用策略:
- 按大小或时间轮转:size 100M 或 daily/weekly/monthly
- 保留份数:rotate 7
- 压缩:compress(历史文件多为 .gz)
- 创建新文件:create 0644 syslog adm
- 空文件不轮转:notifempty
- 缺失不报错:missingok
- 建议为高频服务(如 nginx、postgresql、rsyslog)单独配置轮转与保留,避免历史过久占用磁盘。