如何利用负逻辑配置logcheck规则,仅接收指定日志?
实现Logcheck仅接收指定日志(无需忽略规则)
当然可以!这种“只保留我关心的日志、其余全部过滤”的需求,完全可以通过类似egrep的匹配逻辑来实现,甚至不需要写任何忽略规则。下面给你两种实用的方案:
方案1:直接用egrep预过滤日志(最直观)
Logcheck的核心是处理日志并发送符合条件的内容,我们可以在它处理之前,先把日志过滤成仅包含你想要的条目,剩下的直接丢弃。
具体步骤:
- 第一步:创建你的自定义规则文件,比如
/etc/logcheck/wanted.d/my-important-patterns,每一行写一个匹配目标日志的正则表达式,比如:# 匹配SSH成功登录日志 ^sshd\[[0-9]+\]: Accepted publickey for .* from # 匹配root用户的CRON任务执行日志 ^CRON\[[0-9]+\]: \((root)\) CMD # 匹配系统启动成功的日志 ^systemd\[1\]: Started User Manager for UID - 第二步:修改Logcheck的执行脚本(比如
/etc/cron.daily/logcheck,如果是按天运行的话),把原来的日志读取逻辑替换成预过滤后的内容:
这里的# 先过滤出匹配规则的日志,再传给logcheck处理 cat /var/log/syslog /var/log/auth.log | egrep -f /etc/logcheck/wanted.d/my-important-patterns | /usr/sbin/logcheck -o-o参数让Logcheck只输出未被忽略的内容,而我们已经提前过滤掉了不需要的,所以最终只会收到你定义的日志。
方案2:利用Logcheck自带的violations级别(更贴合原生流程)
Logcheck默认有不同的报告级别,其中violations是最高优先级的日志类别。我们可以把所有想要接收的日志都标记为violations,然后让Logcheck只发送这个级别的内容:
- 第一步:清空或移走默认的
violations规则(比如/etc/logcheck/violations.d/下的默认文件),然后在该目录下创建自己的规则文件,比如/etc/logcheck/violations.d/my-custom-rules,内容和方案1的规则一致。 - 第二步:编辑
/etc/logcheck/logcheck.conf,把REPORTLEVEL参数改成:
这样Logcheck会忽略所有非REPORTLEVEL="violations"violations级别的日志,只发送你定义的那些条目。
关于egrep -v的补充
你提到的egrep -v是排除匹配内容的逻辑,刚好和我们的需求相反——我们需要的是保留匹配内容,所以直接用egrep(不带-v)就可以实现“只留符合规则的日志”。如果非要用-v的话,理论上可以先定义“所有不需要的日志规则”,然后用egrep -v排除,但这显然不如直接定义需要的规则高效,毕竟你要的日志肯定比不需要的少得多。
测试建议
不管用哪种方案,先手动运行过滤命令测试效果,比如:
cat /var/log/syslog | egrep -f /etc/logcheck/wanted.d/my-important-patterns
确认输出的日志都是你想要接收的,再集成到Logcheck的定时任务里。
内容的提问来源于stack exchange,提问作者pitazzo
相关产品推荐
相关产品推荐

