在维护Linux服务器时,常常须要查看系统中各类服务的日志,以检查服务器的运行状态。 如登录历史、邮件、软件安装等日志。系统管理员一个个去检查会十分不方便;且大多时候,这会是一种被动的检查,即只有在发现系统运行异常时才会想到去查看日志以获取异常的信息。那么如何主动、集中的分析这些日志,并产生报告,定时发送给管理员就会显得十分重要。html
logwatch 是一款用 Perl 语言编写的开源日志解析分析器。它能对原始的日志文件进行解析并转换成结构化格式的文档,也能根据您的使用状况和需求来定制报告。logwatch 的主要目的是生成更易于使用的日志摘要,并非用来对日志进行实时的处理和监控的。正由于如此,logwatch 一般被设定好时间和频率的自动定时任务来调度运行或者是有须要日志处理的时候从命令行里手动运行。一旦日志报告生成,logwatch 能够经过电子邮件把这报告发送给您,您能够把它保存成文件或者直接显示在屏幕上。linux
Logwatch 报告的详细程度和报告覆盖范围是彻底可定制化的。Logwatch 的日志处理引擎也是可扩展的,从某种意义上来讲,若是您想在一个新的应用程序中使用 logwatch 功能的话,只须要为这个应用程序的日志文件编写一个日志处理脚本(使用 Perl 语言),而后挂接到 logwatch 上就行。bash
logwatch 有一点很差的就是,在它生成的报告中没有详细的时间戳信息,而原来的日志文件中是存在的。您只能知道被记录下来的一段时间以内的特定事件,若是想要知道精确的时间点的信息,就不得不去查看原日志文件了。服务器
不管在Debian系仍是Redhat系上,安装logwatch都很是简单:dom
# apt-get install logwatch //Debian、Ubuntu.etc # yum install logwatch -y //Redhat、Centos.etc
如下内容基于 CentOS 6.x,其他系统相差不大。ssh
安装后的目录文件说明:ide
/usr/share/logwatch default.conf/ # 配置目录 logwatch.conf # 主配置文件,收件人,级别等 logfiles/ # 定义待分析服务的日志文件组路径,相对于/var/log(*.conf) services/ # 自定义需分析日志的Service目录(*.conf) scripts/ # 可执行脚本 logwatch.pl # 启动分析的perl脚本,/usr/sbin/logwatch的源连接 logfiles/ # 可包含多个logwatch日志文件组的子目录,对应的日志服务运行的时候,子目录下的脚本会自动被调用 services/ # logwatch日志服务的过滤脚本,一一对应 shared/ # 可被多个logwatch日志服务引用的脚本 dist.conf/ logfiles/ services/ lib/
默认状况下使用的是/usr/share/logwatch/default.conf/logwatch.conf
做为主配置文件,但在/etc/logwatch/conf/logwatch.conf
中的存在配置选项会覆盖前一个(/usr/share/logwatch
下的logwatch.conf
仍是会起做用,好比在/etc/logwatch
的logwatch.conf
中没有的选项)。但优先级最高的是在执行命令行中指定的选项。工具
在/etc/logwatch
下也存在一个与/usr/share/logwatch
相似的目录结构,能够在这里添加自定义的监控日志信息。post
从上面的目录结构划分大概能够了解到 logwatch 的原理:logwatch 首先要知道针对哪个服务, 从这个服务中获得须要处理的 log 文件信息, 而后这个文件送给过滤脚本处理,以后把处理后格式化的信息展示出。内部细节请看第3篇参考。ui
在/usr/share/doc/logwatch-7.3.6/HOWTO-Customize-LogWatch
文件中有这里的详细的配置说明。
我的仍是习惯在/etc/logwatch/
下管理配置文件,但又不太但愿同时两个配置文件生效,因此对/usr/share/logwatch/default.conf/logwatch.conf
备份,而后软连接/etc/logwatch/conf/logwatch.conf
:
ln -s /usr/share/logwatch/default.conf/logwatch.conf /etc/logwatch/conf/logwatch.conf
试着执行logwatch --service sshd --print
感觉一下处理的结果。接下来修改/etc/logwatch/conf/logwatch.conf
文件的默认配置来作些个性化设置。
修改日志分析级别
Detail = <Low, Med, High, or a number>
“Detail” 配置指令控制着 logwatch 报告的详细程度。它能够是个正整数,也能够是分别表明着十、5和0数字的 High、Med、Low 几个选项。这里设置成High
。(配置文件中是不区分大小写的)
指定报告收件人
MailTo = youremailaddress@yourdomain.com MailFrom = youremailaddress@yourdomain.com
MailTo
指定logwatch日志报告接收人,要把一份报告发送给多个用户,只须要把他们的邮件地址用空格或逗号隔开,可是logwatch认为你已经配置好本地邮件服务器(sendmail或postfix),并能正确传递给用户邮箱。
MailFrom
,顾名思义,指定发件人。邮件地址能够说完整的收件人地址,也能够是服务器上的本地用户如root(有的邮件服务器不支持显示发件人别名)。
指定发送邮件的客户端
mailer = "sendmail -t"
默认采用的是sendmail(不是sendmail服务器),并且通常没什么问题。在个人环境下有点特殊,邮件服务器必须经过smtp认证才能发送邮件,不支持匿名和其余本地MTA投递的邮件,而sendmail我一直没有找到设置smtp用户和密码认证的地方(知道的烦请告知),因此就改用了mailer = "mailx -t"
,而后在/etc/mail.rc
中设置from
、smtp
、smtp-auth-user
、smtp-auth-password
、smtp-auth
参数,但使用mailx带来的问题是后面设置邮件报告格式为html时,没法设置header信息从而foxmail不能解析html正文。尝试了 sendEmail 也没很好的解决。
大部分人状况可能没这么复杂,其实就是一个发件客户端的功能,网上得知有 mutt 结合 msmtp 能够解决该问题:
# yum install -y mutt //mutt其实能够不安装 # tar jxvf msmtp-1.4.16.tar.bz2 && cd msmtp-1.4.16 # ./configure && make && make install # vi ~/.msmtprc account default host your.smtp-server.com from username@smtp-server.com auth login user username password your_auth_pwd logfile ~/msmtp.log # 若是使用mutt发送,还须要设置~/.muttrc
将 mailer 改为mailer = "msmtp -t"
。
输出格式
Output = <mail, html or unformatted>
默认不指定输出格式(plain text),系统管理员经过邮件客户端(如foxmail)看到的邮件内容是文本形式,比较简单、节省带宽;能够指定为html
,此时看到的是可点击连接的友好的页面。
当同时设定了Save = /tmp/logwatch
时,便不会发送邮件报告了,将会根据Output
指定的格式保存到一个Save
文件中。
另外在有的文章里指定Format
选项,通过本人试验在7.3.6版本中无效。
收集日志的范围
Range = <Yesterday|Today|All>
Range
配置指令定义了生成 logwatch 报告的时间段信息。这个指令一般可选的值是 Yesterday、Today、All。看成用了Rang = All
时,Archive = yes
这个指令项也必须配置上,那么全部的已存档的日志文件 (好比,/var/log/maillog、/var/log/maillog-20150111)都会被处理到。
若是咱们是经过 crontab 天天收集的话,能够只报告昨天或今天的日志状况。
收集哪些服务的日志
Service = <service-name-1> Service = <service-name-2> . . .
Service
选项指定想要监控的一个或多个服务。在/usr/share/logwatch/scripts/services
目录下列出的服务都能被监控,它们已经涵盖了重要的系统服务(例如:pam,secure,iptables,syslogd 等),也涵盖了一些像 sudo、sshd、http、fail2ban、samba等主流的应用服务。若是您想添加新的服务到列表中,得编写一个相应的日志处理 Perl 脚本,并把它放在这个目录中。
对于一个综合日志分析工具,logwatch推荐大多数人使用Service = "All"
,而后经过继续添加Service = "-service_name"
等来去掉那些不监控的日志。固然在服务器上,并非全部script下的服务都有启动,有些并无日志。
命令行指定logwatch选项
若是您不想个性化 /etc/logwatch/conf/logwatch.conf
,您能够不修改此文件让其默认,而后在命令行里运行以下所示的命令:
# logwatch --detail 10 --mailto youremailaddress@yourdomain.com --range today \ > --service sshd --service postfix --service zz-disk_space --service -zz-network \ > --output mail
logwatch.conf
完整示例
LogDir = /var/log TmpDir = /var/cache/logwatch Print = No Range = yesterday Detail = High MailTo = zhouxiao@example.com MailFrom = itsection@example.com mailer = "msmtp -t" Output = html Service = All Service = "-zz-network" Service = "-zz-sys" Service = "-eximstats"
咱们能够看到在 crontab 定时任务设定目录下存在/etc/cron.daily/0logwatch
:
#!/bin/bash DailyReport=`grep -e "^[[:space:]]*DailyReport[[:space:]]*=[[:space:]]*" /usr/share/logwatch/default.conf/logwatch.conf | head -n1 | sed -e "s|^\s*DailyReport\s*=\s*||"` if [ "$DailyReport" != "No" ] && [ "$DailyReport" != "no" ] then logwatch fi
若是在logwatch.conf
中显式设置了选项DailyReport = No
,则会取消logwatch每日执行任务。若是你要修改cron.daily
的执行时间,能够删掉这个0logwatch
而后添加到/etc/crontab
里,或者修改/etc/anacrontab
的START_HOURS_RANGE
。
因此 logwatch 的工做不是监控日志异常后及时报警的工具,由于默认它是天天一封整合的邮件,并不具备及时性(安装perl的CPAN
模块后能够更精确的控制logwatch时间,详见第一份参考)。
用一个简单的例子介绍自定义logwatch的配置方法。
首先建立logwatch日志文件组/etc/logwatch/conf/logfiles/test.conf
:
LogFile = /path/to/your/logfile LogFile = /path/to/your/second/logfile
而后建立logwatch服务配置文件/etc/logwatch/conf/services/test.conf
:
Title = test title # 日志文件里的标题 LogFile = test # logwatch日志文件组的名字,一般是对应的配置文件的文件名部分
建立logwatch服务过滤器脚本/etc/logwatch/scripts/services/test
:
#!/bin/bash grep -i ERROR
上面的脚本会从日志文件里过滤出包含ERROR的行。最后,为新建的脚本添加执行权限:
chmod +x /etc/logwatch/scripts/services/test
参考