您如何在服务器上实现日志管理?

您如何在服务器上实现日志管理?

我试图弄清楚其他人如何实现他们的日志管理系统。

我有 20-30 台 Linux 服务器和一些 Windows 机器(其中大部分是虚拟化的)。我们使用大量 Perl 和 Bash 脚本来完成大部分自动化作业,我正在尝试标准化它们的日志记录。

我一直在研究 log4perl 和 log4sh 来记录脚本,以及使用 syslog-ng 来获取集中日志服务器上的所有日志。我还阅读了 splunk,尽管听起来企业版相当昂贵,而且我的所有服务器可能会超出免费许可证的限制。

我见过其他工具,例如 swatch 和 logcheck,但我不太确定所有这些部分是如何组合在一起的......如能提供任何建议我将不胜感激!

答案1

我有大约 30 台服务器,我直接使用 syslog 将所有日志发送到单个日志服务器。为了备份,所有机器还配置为在本地存储自己的日志几天,使用 logrotate 来处理旧日志的轮换和删除。

我的每个应用程序服务器都运行一个小型 perl 脚本,将其日志发送到 syslog,然后转发到日志主机(下面的 perl 脚本)。

然后在日志主机上我们有一些类似于日志检查的自定义脚本,基本上监视传入的日志中是否有任何可疑内容。

我们还将来自每个主机的所有电子邮件集中到一个地方,这样如果有任何程序以这种方式投诉,我们就会收到所有邮件。理论上,这些邮件可以集中到一个邮箱,程序可以对其采取行动并进行分析。

这是我的日志记录 perl 脚本。它的工作原理是将程序的输出通过管道传输到其中,然后它将输出记录到系统日志中并将其吐出,以便您可以将其发送到其他地方(我发送到 multilog)。您还可以为其提供 -q 选项以直接转到系统日志。

#!/usr/bin/perl

use Sys::Syslog;
use Getopt::Long;

$SERVER_NAME = `hostname`;
chomp $SERVER_NAME;
$FACILITY = 'local0';
$PRIORITY = 'info';

GetOptions ('s=s' => \$SERVER_NAME, 'f=s' => \$FACILITY, 'p=s' => \$PRIORITY, 'q+' => \$quiet);

#print "$SERVER_NAME\n$FACILITY\n$PRIORITY\n";

#Sys::Syslog::setlogsock('unix');
openlog ($SERVER_NAME,'ndelay',$FACILITY);

if (!($quiet)) {syslog($PRIORITY,"Logging Started -- Logger version 1.1");}

$| = 1;

while (<>) {
    if (!($quiet)) {print $_ unless $_ =~ /^\s+$/};
    chomp;
    syslog($PRIORITY,$_) if $_;
}

closelog;

$| = 0;

答案2

虽然我还没有实现它,但我计划将所有日志生成机器移至 rsyslog,并实现一个堡垒型服务器,用作系统日志的收集器。从那里开始,我认为 Splunk 的免费版本可以满足我提取信息的所有需求。

现在只需实现它...

答案3

我使用中央系统日志主机。每个边缘系统都会将 *.debug 发送到中央日志主机。中央系统日志主机运行 syslog-ng,并有规则来拆分日志,以便每台机器生成以当天命名的自己的文件。它还将所有内容转储到一个文件中,我针对该文件运行 logcheck.sh 的后代。

我每天运行一次日志压缩程序,它会压缩超过 7 天的日志,并删除超过 28 天的日志。两者合计,日志在服务器上的预期寿命为 35 天,这意味着所有日志都应进行每月备份,最多可恢复两年。

虽然它需要大量存储,但似乎是确保覆盖的最佳方式。

答案4

我们使用 LogLogic 的设备进行企业日志记录。它基于 syslog,因此所有 *nix 设备都可以毫无问题地使用它;有一个小应用程序需要安装在 Windows 服务器上。我可以搜索任何我想要的内容,包括 REGEX 查询,它似乎能够处理相当多的负载(仅我们的 Active Directory 设置就产生了令人难以置信的流量)。

相关内容