我们的环境由多个工作站和服务器组成,全部是 RHEL(CentOS 7)并安装了 logwatch(当前为 v7.4.0)。自定义 cron 作业通过电子邮件发送每日 logwatch 报告。用于生成报告的命令很简单:/usr/sbin/logwatch --format text
如果它很重要。所有系统都由我们的管理员定期更新和重新启动,但我们的用户也可以手动重新启动他们的工作站。当然有who -b
,last -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 配置中,如前面的回复中所述。
请注意,这是一个基本脚本,您可能需要根据特定环境和日志文件格式对其进行调整。此外,在将脚本部署到生产环境之前,您应该彻底测试该脚本,以确保其按预期运行。