Logwatch 解决的是一个否则根本无人解决的问题:它替你把服务器的全部日志读一遍,然后发来前一天的摘要。没有人会每天翻 auth.log 和 Web 服务器日志,而早上读一封邮件是做得到的。

已知的问题是:第一封信带着几百行来了,第二封被扫了一眼,一周后邮件客户端的某条规则把它们扔进了单独的文件夹,盯着看这件事就此结束。原因几乎总是默认设置,而修好它要十分钟。

安装,以及在哪里改设置

sudo apt install logwatch

你把自己的值放在哪里很重要。文件 /usr/share/logwatch/default.conf/logwatch.conf 不能动——包更新时它会被覆盖。你的文件是 /etc/logwatch/conf/logwatch.conf。它可以是空的;只加上你要改的那些就够了。

Output = mail
Format = html
MailTo = admin@example.com
Detail = Low
Range = yesterday

详细程度决定一切

Detail 接受 0 到 10 的数值,或者 LowMedHigh 这几个词。差别巨大:在 High 下报告会包含每一个连接和每一个请求;在 Low 下只有汇总和异常。

实践做法是:整体用 Low,只为你真正关心的那些服务有选择地提高详细程度。按服务的设置放进 /etc/logwatch/conf/services/——例如一个含有 Detail = High 一行的 sshd.conf

检验的标尺是:报告应当能放进一屏到一屏半。再长的东西就会不再被读——不是因为懒,而是因为在三百行的日常里,一处偏差根本看不出来。

不必等到早上就想看结果:

sudo logwatch --detail Low --range today --output stdout

Debian 12 上空掉的 SSH 一节

较新系统上的一个单独陷阱。Logwatch 读的是 /var/log 里的文本文件,而 Debian 12 和 Ubuntu 24.04 默认不再安装 rsyslog——文件 /var/log/auth.log 干脆就不存在,一切都进了 systemd 的日志。报告照旧准时到来,但最要紧的一节——SSH 登录——却是空的,或者干脆没有。

检查只需一秒:

ls -l /var/log/auth.log

文件不在的话,要么装上 rsyslog,要么承认在这台机器上 Logwatch 给出的是一幅不完整的图景。而把空掉的一节读成「什么也没发生」太容易了,而那正是最危险的后果。

邮件去了哪里

「报告收不到」的第二个常见原因是:服务器上根本没有配置好邮件投递。Logwatch 把信交给系统的代理,代理哪儿也不送,于是信就躺在 root 的本地邮箱里,而那里从来没人去看:

sudo cat /var/mail/root | tail -50

有两条路。要么通过外部 SMTP 中继配置好投递,要么干脆不用邮件,把报告写进一个文件:

Output = file
Filename = /var/log/logwatch/report.txt

第二种更诚实:一封谁也送不出去的邮件制造的是「有人在盯着」的错觉,而磁盘上的一个文件至少还能打开。

报告里该读什么

按有用程度递减排列:

  • sshd。成功的登录——谁、从哪里。恰恰是成功的那些,而不是成千上万次失败:失败是背景噪声,而来自陌生地址的一次登录则需要解释;
  • sudo 与 pam_unix。谁提升了权限、谁创建了用户;
  • Disk Space。一行字,提前警告磁盘正在被填满;
  • cron新出现的任务,以及失败的任务;
  • http。404 响应的激增通常意味着有人在试探路径;而 500 的激增意味着你的某个东西坏了;
  • postfix,如果服务器发邮件的话:外发队列不断增长,是服务器被拿去当垃圾邮件中继的典型信号。

它的边界

Logwatch 是前一天的摘要,不是告警。它不会在夜里叫醒你,而且按定义就是滞后的:它由凌晨的每日任务运行,覆盖的是昨天。对于「此刻正在发生什么」,它既不适合也不是为此而生的。

它的长处在别处——它让你看到一个普通日子的形状。读上一个月,你就知道正常情况下有多少次失败登录、站点接多少请求、发出去多少邮件;而当其中某个数字翻倍时,它会立刻显现出来,不需要任何阈值和任何规则。正因如此,这份报告值得放在会映入眼帘的地方,而不是某个邮件文件夹里。它在一个页面上是什么样子,见下面的演示。