用 grep -c 统计错误日志行数需精准匹配标识、限定时间范围、区分错误类型并检查归档日志,避免误统计和遗漏,结合资源指标定位真实瓶颈。

直接用 grep -c 统计含错误标识的日志行数,是快速评估问题频次和潜在资源压力的常用手段。关键在于准确匹配、排除干扰,并结合上下文判断是否真与资源损耗相关。
精准匹配错误标识,避免误统计
错误标识不一定是完整单词,可能是片段(如 "OOM"、"timeout"、"ENOMEM"),也可能是带前缀的字段(如 "ERROR:" 或 "level=error")。盲目用 grep -c "error" 会把 "warning" 或 "errors" 甚至正常日志里的单词都算进去。
- 用
-w匹配整个单词:例如grep -wc "OOM" /var/log/syslog,只统计独立出现的OOM - 用
-E支持正则,区分大小写和边界:例如grep -cE "(OOM|ENOMEM|killed process)" /var/log/kern.log - 加
-i忽略大小写仅当标识本身不敏感时用,如"error",但对"OOM"通常不用
限定时间范围或日志段,反映真实负载压力
全量日志统计可能掩盖近期恶化趋势。资源损耗往往体现在短时间内的错误激增,建议配合 tail 或时间过滤使用:
- 查最近 1000 行中的错误:
tail -n 1000 /var/log/messages | grep -c "timeout" - 结合
awk按时间筛选(如最近 5 分钟):若日志含标准时间戳,可用awk '$0 ~ /^'"$(date -d '5 minutes ago' '+%b %d %H:%M')"'[0-9:]*$/ {p=1} p && /killed process/ {c++} END{print c+0}' /var/log/kern.log - 用
journalctl更规范:journalctl --since "5 minutes ago" | grep -c "Out of memory"
区分错误类型,关联资源指标
单纯计数不能说明资源损耗程度,需结合错误语义判断:
-
OOM、killed process直接指向内存耗尽,应立刻检查free -h、cat /proc/meminfo -
timeout、Connection refused可能是 CPU 过载或服务无响应,配合top或pidstat看 CPU 使用峰值 -
No space left on device明确是磁盘满,用df -h和du -sh /var/log/* | sort -hr | head -5定位大日志文件
避免重复计数与日志轮转干扰
系统日志常被 logrotate 轮转,grep -c 默认只查当前文件,容易漏掉归档日志中的历史错误:
- 同时检查当前 + 最近归档:
zgrep -c "OOM" /var/log/kern.log* 2>/dev/null(.gz文件用zgrep) - 用
gunzip -c解压后管道处理:gunzip -c /var/log/kern.log.1.gz | grep -c "killed process" - 注意通配符展开顺序,建议用
ls -t /var/log/kern.log*确认文件新旧顺序


















