温馨提示×

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)单独配置轮转与保留,避免历史过久占用磁盘。

0