linux syslog日志统计分析需先提取关键字段(时间、服务、等级、内容),再通过awk/grep等工具去重聚合,实现ip频次、级别分布、时段趋势统计,并可导出csv供外部工具分析。

Linux 系统中,Syslog(如 rsyslog 或 syslog-ng)默认将日志写入本地文件(如 /var/log/messages、/var/log/auth.log 等),要进行统计分析,需先导出结构化数据,再用命令行工具或脚本处理。核心思路是:提取关键字段 → 去重/聚合 → 统计计数或分布。
提取关键字段(时间、服务、等级、内容)
Syslog 日志格式较固定,但不同版本略有差异。以 rsyslog 默认格式为例:
May 12 10:24:32 server01 sshd[1234]: Failed password for root from 192.168.1.100 port 54322 ssh2可用 awk、cut 或正则提取字段。例如,提取所有失败登录的源 IP:
awk '/Failed password/ {print $11}' /var/log/auth.log | sort | uniq -c | sort -nr
说明:
• $11 对应 IP 字段(位置可能因日志格式变动,建议先用 head -1 /var/log/auth.log | awk '{print NF; print $0}' 查看字段数)
• sort | uniq -c 实现频次统计
• sort -nr 按数字逆序排列,高频在前
按日志级别(LEVEL)统计分布
常见级别有 INFO、WARNING、ERROR、CRIT 等,通常出现在日志行中靠前位置:
- 用
grep -oE '\b(INFO|WARNING|ERROR|CRIT|DEBUG|NOTICE)\b' /var/log/messages | sort | uniq -c提取并计数 - 若日志含 facility(如
auth、daemon),可组合统计:awk '{print $5}' /var/log/messages | grep -E '^\[.*\]$' | cut -d'[' -f2 | cut -d']' -f1 | sort | uniq -c(适用于带 [facility.level] 格式)
按时间段聚合(小时/天级访问趋势)
利用时间字段做粗粒度分组,适合观察异常高峰:
- 提取“月-日 小时”并统计每小时条数:
awk '{print $1,$2,$3}' /var/log/messages | cut -d: -f1 | sort | uniq -c - 更准确方式(适配年份缺失问题):用
date配合awk转换为标准时间戳再截取,但对单机日志,直接切分已够用 - 查看某天错误峰值:
awk '$1=="May" && $2=="12" && /ERROR|CRIT/ {print $3}' /var/log/messages | cut -d: -f1 | sort | uniq -c | sort -nr
导出为 CSV 供外部工具分析
如需导入 Excel、Python 或 Grafana,可生成带分隔符的结构化输出:
awk '/sshd.*Failed/ {
ip = $11
time = $1 " " $2 " " $3
printf "%s,%s,\"%s\"\n", time, ip, $0
}' /var/log/auth.log > ssh_failed.csv
说明:
• 使用逗号分隔,双引号包裹原始日志避免字段内逗号干扰
• 可后续用 csvkit 或 Python 的 pandas.read_csv() 加载分析
• 若需时间标准化(如补全年份),可在 awk 中加逻辑,或用 sed 预处理











