在CentOS和RHEL 5上构建中央Loghost使用rsyslog
收集日志消息很重要。 在很多情况下,您需要将所有条目的日志文件存储在另一个服务器上。 如果服务器崩溃或被黑客攻击,您可以通过本机浏览日志文件,并确保这些日志文件不会以任何方式进行更改。 这可以使用从所有其他主机接收消息的中央日志服务器来实现。 系统日志工具可以从UNIX和Linux主机接收消息,但也可以接收网络设备,肯定是Windows主机。 这样的系统日志主机应该使这些日志文件可以使用只读接口提供给审计人员和系统管理员,除非事件发生,否则这些日志文件不应该可供任何人使用。
技术上的区别在于如何存储消息:
- 在文件系统中的纯文本
- 在具有Web界面的sql数据库中
这个方法描述了每个远程主机每天将日志消息放在一个文件中的rsyslog。 Rsyslog是RHEL6中的当前标准,可以作为RHEL 5.5(和CentOS 5.5)当前包流中的包。 设置rsyslog很简单。 这一切都归结为一个单一的配置文件,但是(总有一个但是)每一个设置都需要一些规划。
问你自己:
谁应该访问数据,每天(周,月,年)多少次?
主机每分钟/小时处理多少邮件?
我要存储数据需要多长时间?
这一切都与存储规格有关....
我们的主持人:
任何可以正常运行RHEL 5.5的机器
在这种情况下,单独的文件系统: / var / opt / syslog_data
概述
- 停止sysklogd(RHEL 5.5上的标准syslog)
- 安装rsyslog
- 配置rsyslog在启动时运行(并删除sysklogd)
- 配置rsyslog保存纯文本文件并添加一个cronjob来压缩文件
- 描述getcha(总是有一个但是)
让我们的手脏:
第1步
停止sysklogd:
# service syslog stop
第2步
安装rsyslog:
# yum install rsyslog
第3步
配置rsyslog在启动时运行(并删除sysklogd):
# chkconfig syslog off
# chkconfig rsyslog on
# yum erase sysklogd
第4步
配置rsyslog保存纯文本文件并添加一个cronjob来压缩文件。
首先编辑rsyslog的启动选项以在某种兼容性模式下运行,这在文件/ etc / sysconfig / rsyslog中完成
。 如果不这样做,您将获得有关兼容性模式的消息。 这个文件应该是这样的:
# Options to syslogd # -m 0 disables 'MARK' messages. # -rPortNumber Enables logging from remote machines. The listener will listen to the specified port. # -x disables DNS lookups on messages recieved with -r # See syslogd(8) for more details SYSLOGD_OPTIONS="-c3" # Options to klogd # -2 prints all kernel oops messages twice; once for klogd to decode, and # once for processing with 'ksymoops' # -x disables all klogd processing of oops messages entirely # See klogd(8) for more details KLOGD_OPTIONS="-x"
然后我们从/ etc
目录中删除rsyslog.conf
文件(或使用其他名称保存)。 不要担心这个传递一个完整的文件。
# rm /etc/syslog.conf
现在我们创建一个新的/etc/rsyslog.conf
文件,其中需要为本身的消息编写本地文件。 Rsyslog与模块配合使用,这意味着普通安装只能做到这一点。 我们可以通过加载大多数安装在原始RPM中的模块来添加功能。
(您可以在man文件中获得正确的解释,使用:
man rsyslog.conf
)
我们添加一些这样的行:
#load the kernel logger module $ModLoad imklog #load the UNIX sockets module to receive local messages from processen $ModLoad imuxsock #load UDP powers, to receive messages via the UDP protocol $ModLoad imudp #make rsyslog listen on all ip addresses, you could specify an address $UDPServerAddress 0.0.0.0 #make rsyslog listen on UDP port 514 $UDPServerRun 514 #repeated lines will be reduced $RepeatedMsgReduction on ()
我们可以添加一些这样的行:
*.info;mail.none;authpriv.none;cron.none /var/log/messages
结果将是:所有已处理的信息,信息严重性和所有邮件,authpriv,cron工具将被记录在文件/ var / log / messages中
。 所有消息,包括来自其他主机的消息。 这不是我们想要的,幸运的是rsyslog让我们进行评估(如果...):
请确保您使用您的loghost的主机名替换主机名 :
if \ $source == 'hostname' \ and \ $syslogseverity <= '6' \ and ( \ $syslogfacility-text != 'mail' \ and \ $syslogfacility-text != 'authpriv' \ and \ $syslogfacility-text != 'cron' \ ) \ then /var/log/messages;TraditionalFormat
以上行将过滤主机本身的消息。 现在接收来自其他主机的消息。 这是非常基本的,但是您可以使这非常困难。 您可以使用原始文件将每个主机的所有邮件保存在单独的文件中,而不是让logrotate根据时间或文件大小轮换它们。 一旦logrotate完成,您还需要向rsyslog进程发送-HUP信号。 理论上,rsyslog守护进程应该使用基于主机名的新文件名,并在kill -HUP之后启动一个新的文件。
相反,我们可以将日期添加到文件名,使rsyslog每天都使用一个新的文件。 然后我们可以添加一个基于时间的查询查询的cronjob,将结果发送到bzip2。 美丽的简单性:
$template DailyPerHostLogs,"/var/opt/syslog/%HOSTNAME%/%HOSTNAME%.%$YEAR%-%$MONTH%-%$DAY%.log" *.* -?DailyPerHostLogs;TraditionalFormat
在这种语法中,我们创建一个模板,指定使用变量存储文件的位置。 然后我们指定什么动作应该采取什么消息; 应使用模板存储所有消息,包括本地主机中的模板。
这应该是一样的。 作为一个正确的masterchef,我已经为您准备好了,可以将以下内容粘贴到/etc/rsyslog.conf中。 结果与原始sysklogd设置完全相同。
确保您使用主机名替换主机名 !
$ModLoad imuxsock.so $ModLoad imklog.so $ModLoad imudp.so #load the network stuff $UDPServerAddress 0.0.0.0 $UDPServerRun 514 #reduce any duplicates $RepeatedMsgReduction on # The template that wil format the message as it is writen to the file # you can edit this line if you want to customize te message format $template TraditionalFormat,"%timegenerated% %HOSTNAME% %syslogtag%%msg:::drop-last-lf%\n" # Log anything (except mail) of level info or higher. # Don't log private authentication messages! #*.info;mail.none;authpriv.none;cron.none /var/log/messages if \ $source == 'hostname' \ and \ $syslogseverity <= '6' \ and ( \ $syslogfacility-text != 'mail' \ and \ $syslogfacility-text != 'authpriv' \ and \ $syslogfacility-text != 'cron' \ ) \ then /var/log/messages;TraditionalFormat #authpriv.* /var/log/secure;TraditionalFormat # The authpriv file has restricted access. #authpriv.* /var/log/secure if \ $source == 'hostname' \ and \ $syslogfacility-text == 'authpriv' \ then /var/log/secure;TraditionalFormat # Log anything (except mail) of level info or higher. # Don't log private authentication messages! # mail.* /var/log/maillog;TraditionalFormat if \ $source == 'hostname' \ and \ $syslogfacility-text == 'mail' \ then /var/log/maillog;TraditionalFormat # Log cron stuff #cron.* /var/log/cron;TraditionalFormat if \ $source == 'hostname' \ and \ $syslogfacility-text == 'cron' \ then /var/log/cron;TraditionalFormat # Everybody gets emergency messages #*.emerg * if \ $source == 'hostname' \ and \ $syslogseverity-text == 'emerg' \ then * # this line creates a template that will store the messages for each host in a seperate file. # a new file will ben created daily because of the date in the filename. $template DailyPerHostLogs,"/var/opt/syslog/%HOSTNAME%/%HOSTNAME%.%$YEAR%-%$MONTH%-%$DAY%.log" *.* -?DailyPerHostLogs;TraditionalFormat
您可以使用记录器轻松测试:
# logger “this is a test”
# tail /var/log/messages
你应该看到你的消息。
和cronjob:
将此内容放在新文件/etc/cron.hourly/compress-syslog.cron中
:
# Compressing remote syslog messagefiles, older then one day using bzip2 find /var/opt/syslog -type f -mtime 1 -name "*.log" -exec bzip2 '{}' \;
这就是你完成了 您可以通过将此行添加到/etc/syslog.conf
来使远程主机登录到此服务器:
# logger "this is a test" # tail /var/log/messages
您可以为您拥有的每个sysloghost重复此行(用实际数据替换ipaddress或dnsname)。
*.* @ipaddress or dnsname
第5步,Gotchas:
- 存储提示:正常的ext3文件系统为紧急情况预留了一定的空间(只有root可以使用这个保留的空间),这对您的根文件系统来说是很好的,但它是令人讨厌的大文件系统,用于存储数据,如logfiles。 不能保留特殊空间,一般百分比是正常的设置。 您可以通过以下方式使此空间可用:
tune2fs -m 0 blockdevice
- 性能提示:如果您的系统被邮件超载,您可以使用rsyslog对其执行的每个操作的缓冲系统。 您可以使用rsyslog.conf中的以下行启用mainqueue
$WorkDirectory /tmp # default location for work (spool) files $MainMsgQueueFileName mainq # set file name, also enables disk mode
此howto是使用以下内容创建的:
http://wiki.rsyslog.com/index.php/DailyLogRotation (了解logrotation和comressing)
http://www.rsyslog.com/ (丰富的rsyslog信息)
http://wiki.rsyslog.com/index.php/Sysklogd_drop-in_with_remote_logs_separated_by_dynamic_directory (将本地邮件与远程邮件分开)