如何让 logwatch 在报告中显示重启事件?

如何让 logwatch 在报告中显示重启事件?

我们的环境由多个工作站和服务器组成,全部是 RHEL(CentOS 7)并安装了 logwatch(当前为 v7.4.0)。自定义 cron 作业通过电子邮件发送每日 logwatch 报告。用于生成报告的命令很简单:/usr/sbin/logwatch --format text如果它很重要。所有系统都由我们的管理员定期更新和重新启动,但我们的用户也可以手动重新启动他们的工作站。当然有who -blast -x但我们希望将重新启动事件添加到每日 logwatch 报告中,而不是添加分析上述命令输出的脚本。

如何配置 logwatch 以检测重启(无论出于何种原因)并将事件添加到生成的报告中?

答案1

检测系统重启并将其添加到 Logwatch 报告中并不是 Logwatch 的初始设计功能。但是,您可以创建自定义 Logwatch 筛选脚本来提取重启事件并将其包含在您的每日报告中。
您需要创建一个自定义筛选脚本,以便从系统日志中提取重启事件。您可以使用 Perl 或您选择的其他脚本语言编写此脚本。该脚本应在日志文件(例如 /var/log/wtmp、/var/log/lastlog 或 /var/log/messages)中搜索与重启相关的条目。
这是一个简单的 Perl 脚本,您可以将其用作起点,在 /var/log/wtmp 文件中检测系统重启并将信息包含在您的 Logwatch 报告中。请注意,此脚本是一个基本示例,可能需要进一步定制才能满足您的特定需求。

#!/usr/bin/perl

use strict;
use warnings;

my $wtmp_file = "/var/log/wtmp";  # Adjust the path if necessary

# Get the current date
my $date = `date "+%Y-%m-%d %H:%M:%S"`;
chomp($date);

# Open the wtmp file for reading
open my $wtmp, $wtmp_file or die "Failed to open $wtmp_file: $!";

# Search for reboot events and collect relevant information
my @reboot_events;
my $reboot_event = 0;
while (my $line = <$wtmp>) {
    my ($user, $tty, $host, $boot_time) = unpack("A32A32A256I", $line);
    next unless defined $user and $user ne '';  # Skip empty entries

    if ($boot_time == 2) {
        # This is a reboot event
        push @reboot_events, "User: $user, TTY: $tty, Host: $host, Boot Time: " . scalar localtime($boot_time);
        $reboot_event = 1;
    }
}

close $wtmp;

# Generate Logwatch output
if ($reboot_event) {
    print "Reboot Events (from $wtmp_file):\n";
    print join("\n", @reboot_events) . "\n";
}

exit 0;

$wtmp_file如果您的 wtmp 文件位于其他路径,请自定义变量。如果您有记录重启事件的其他日志,您还可以修改脚本以搜索其他日志文件。

将此脚本保存到文件(例如,/usr/local/bin/custom_reboot_report.pl),使其可执行(chmod +x /usr/local/bin/custom_reboot_report.pl),然后将其包含在您的 Logwatch 配置中,如前面的回复中所述。

请注意,这是一个基本脚本,您可能需要根据特定环境和日志文件格式对其进行调整。此外,在将脚本部署到生产环境之前,您应该彻底测试该脚本,以确保其按预期运行。

相关内容