电脑指南
第二套高阶模板 · 更大气的阅读体验

日志系统重复日志过滤:几招搞定烦人的刷屏记录

发布时间:2026-03-29 17:31:11 阅读:2 次

你有没有遇到过这样的情况?打开系统日志一看,满屏都是同一行报错,比如 Failed to connect to database,一秒刷十几条,根本找不到真正的问题点。这不光是看着闹心,还会快速占满磁盘空间,影响排查效率。

为什么日志会疯狂重复?

常见原因有几种:程序没做异常兜底,一出错就反复重试又不加延时;监控脚本每5秒轮询一次服务状态,失败就记一条日志;还有就是某些中间件(比如旧版Log4j或rsyslog)默认不带去重逻辑,原始事件照单全收。

简单有效的过滤方法

不用上复杂方案,日常维护用这几招就够了:

1. 用 logrotate 配合时间+大小双控

/etc/logrotate.d/syslog 里加上:

/var/log/messages {
daily
missingok
rotate 7
compress
delaycompress
notifempty
create 0644 root root
sharedscripts
postrotate
/usr/bin/systemctl kill --signal=SIGHUP rsyslog.service
endscript
}

这不能直接去重,但能避免日志无限膨胀,给后续分析留出缓冲空间。

2. 实时过滤:用 awk 去掉连续重复行

调试时想实时看干净日志,终端里跑这句就行:

tail -f /var/log/syslog | awk '{if ($0 != prev) print; prev = $0}'

它只保留和上一行不一样的内容,适合盯屏观察。

3. 应用层加个“防抖”开关

以 Python 写的后台服务为例,在写日志前加个简易计数器:

import time
last_log_time = 0
same_log_count = 0

def safe_log(msg):
global last_log_time, same_log_count
now = time.time()
if msg == last_msg and (now - last_log_time) < 30:
same_log_count += 1
if same_log_count % 10 == 0: # 每10次只打1条,附带计数
logger.warning(f"{msg} (已连续出现 {same_log_count} 次)")
else:
logger.warning(msg)
last_msg = msg
last_log_time = now
same_log_count = 1

类似逻辑也能套用到 Shell 脚本或 Node.js 里,关键是别让错误一来就狂喷。

进阶提示

如果公司用 ELK 或 Loki 这类集中式日志平台,Elasticsearch 的 dedot 插件、Loki 的 line_format + label_values 组合都能按字段聚合去重;不过对普通用户来说,先从本地日志入手更实在——毕竟服务器不是天天崩,但日志刷屏真能让人午饭都吃不安生。