Linux系统拥有非常灵活和强大的日志功能,可以保存几乎所有的操作记录,并可以从中检索出我们需要的信息。大部分Linux发行版默认的日志守护进程为syslog,位于/etc/syslog或/etc/syslogd,默认配置文件为/etc/syslog.conf,任何希望生成日志的程序都可以向syslog发送信息。Linux系统内核和许多程序会产生各种错误信息、警告信息和其他的提示信息,这些信息对管理员了解系统的运行状态是非常有用的,所以应该把它们写到日志文件中去。完成这个过程的程序就是syslog。syslog可以根据日志的类别和优先级将日志保存到不同的文件中。例如,为了方便查阅,可以把内核信息与其他信息分开,单独保存到一个独立的日志文件中。默认配置下,日志文件通常都保存在“/var/log”目录下。日志类型下面是常见的日志类型,但并不是所有的Linux发行版都包含这些类型:类型说明auth用户认证时产生的日志,如login命令、su命令。authpriv与auth类似,但是只能被特定用户查看。console针对系统控制台的消息。cron系统定期执行计划任务时产生的日志。daemon某些守护进程产生的日志。ftpFTP服务。kern系统内核消息。local0.local7由自定义程序使用。lpr与打印机活动有关。mail邮件日志。mark产生时间戳。系统每隔一段时间向日志文件中输出当前时间,每行的格式类似于May2611:17:09rs2--MARK--,可以由此推断系统发生故障的大概时间。news网络新闻传输协议(nntp)产生的消息。ntp网络时间协议(ntp)产生的消息。user用户进程。uucpUUCP子系统。日志优先级常见的日志优先级请见下标:优先级说明emerg紧急情况,系统不可用(例如系统崩溃),一般会通知所有用户。alert需要立即修复,例如系统数据库损坏。crit危险情况,例如硬盘错误,可能会阻碍程序的部分功能。err一般错误消息。warning警告。notice不是错误,但是可能需要处理。info通用性消息,一般用来提供有用信息。debug调试程序产生的信息。none没有优先级,不记录任何日志消息。常见日志文件所有的系统应用都会在/var/log目录下创建日志文件,或创建子目录再创建日志文件。例如:文件/目录说明/var/log/boot.log开启或重启日志。/var/log/cron计划任务日志/var/log/maillog邮件日志。/var/log/messages该日志文件是许多进程日志文件的汇总,从该文件可以看出任何入侵企图或成功的入侵。/var/log/httpd目录ApacheHTTP服务日志。/var/log/samba目录samba软件日志/etc/syslog.conf文件/etc/syslog.conf是syslog的配置文件,会根据日志类型和优先级来决定将日志保存到何处。典型的syslog.conf文件格式如下所示:*.err;kern.debug;auth.notice/dev/consoledaemon,auth.notice/var/log/messageslpr.info/var/log/lpr.logmail.*/var/log/mail.logftp.*/var/log/ftp.logauth.*@see.xidian.edu.cnauth.*root,amroodnetinfo.err/var/log/netinfo.loginstall.*/var/log/install.log*.emerg**.alert|program_namemark.*/dev/console第一列为日志类型和日志优先级的组合,每个类型和优先级的组合称为一个选择器;后面一列为保存日志的文件、服务器,或输出日志的终端。syslog进程根据选择器决定如何操作日志。对配置文件的几点说明:日志类型和优先级由点号(.)分开,例如kern.debug表示由内核产生的调试信息。kern.debug的优先级大于debug。星号(*)表示所有,例如*.debug表示所有类型的调试信息,kern.*表示由内核产生的所有消息。可以使用逗号(,)分隔多个日志类型,使用分号(;)分隔多个选择器。对日志的操作包括:将日志输出到文件,例如/var/log/maillog或/dev/console。将消息发送给用户,多个用户用逗号(,)分隔,例如root,amrood。通过管道将消息发送给用户程序,注意程序要放在管道符(|)后面。将消息发送给其他主机上的syslog进程,这时/etc/syslog.conf文件后面一列为以@开头的主机名,例如@see.xidian.edu.cn。logger命令logger是Shell命令,可以通过该命令使用syslog的系统日志模块,还可以从命令行直接向系统日志文件写入一行信息。logger命令的语法为:logger[-i][-ffilename][-ppriority][-ttag][message...]每个选项的含义如下:选项说明-ffilename将filename文件的内容作为日志。-i每行都记录logger进程的ID。-ppriority指定优先级;优先级必须是形如facility.priority的完整的选择器,默认优先级为user.notice。-ttag使用指定的标签标记每一个记录行。message要写入的日志内容,多条日志以空格为分隔;如果没有指定日志内容,并且-ffilename选项为空,那么会把标准输入作为日志内容。例如,将ping命令的结果写入日志:$ping192.168.0.1|logger-itlogger_test-plocal3.notice&$tail-f/var/log/userlogOct612:48:43keveinlogger_test[22484]:PING192.168.0.1(192.168.0.1)56(84)bytesofdata.Oct612:48:43keveinlogger_test[22484]:64bytesfrom192.168.0.1:icmp_seq=1ttl=253time=49.7msOct612:48:44keveinlogger_test[22484]:64bytesfrom192.168.0.1:icmp_seq=2ttl=253time=68.4msOct612:48:45keveinlogger_test[22484]:64bytesfrom192.168.0.1:icmp_seq=3ttl=253time=315msOct612:48:46keveinlogger_test[22484]:64bytesfrom192.168.0.1:icmp_seq=4ttl=253time=279msOct612:48:47keveinlogger_test[22484]:64bytesfrom192.168.0.1:icmp_seq=5ttl=253time=347msOct612:48:49keveinlogger_test[22484]:64bytesfrom192.168.0.1:icmp_seq=6ttl=253time=701msOct612:48:50keveinlogger_test[22484]:64bytesfrom192.168.0.1:icmp_seq=7ttl=253time=591msOct612:48:51keveinlogger_test[22484]:64bytesfrom192.168.0.1:icmp_seq=8ttl=253time=592msOct612:48:52keveinlogger_test[22484]:64bytesfrom192.168.0.1:icmp_seq=9ttl=253time=611msOct612:48:53keveinlogger_test[22484]:64bytesfrom192.168.0.1:icmp_seq=10ttl=253time=931msping命令的结果成功输出到/var/log/userlog文件。命令logger-itlogger_test-plocal3.notice各选项的含义:-i:在每行都记录进程ID;-tlogger_test:每行记录都加上“logger_test”这个标签;-plocal3.notice:设置日志类型和优先级。日志转储日志转储也叫日志回卷或日志轮转。Linux中的日志通常增长很快,会占用大量硬盘空间,需要在日志文件达到指定大小时分开存储。syslog只负责接收日志并保存到相应的文件,但不会对日志文件进行管理,因此经常会造成日志文件过大,尤其是WEB服务器,轻易就能超过1G,给检索带来困难。大多数Linux发行版使用logrotate或newsyslog对日志进行管理。logrotate程序不但可以压缩日志文件,减少存储空间,还可以将日志发送到指定E-mail,方便管理员及时查看日志。例如,规定邮件日志/var/log/maillog超过1G时转储,每周一次,那么每隔一周logrotate进程就会检查/var/log/maillog文件的大小:如果没有超过1G,不进行任何操作。如果在1G~2G之间,就会创建新文件/var/log/maillog.1,并将多出的1G日志转移到该文件,以给/var/log/maillog文件瘦身。如果在2G~3G之间,会继续创建新文件/var/log/maillog.2,并将/var/log/maillog.1的内容转移到该文件,将/var/log/maillog的内容转移到/var/log/maillog.1,以保持/var/log/maillog文件不超过1G。可以看到,每次转存都会创建一个新文件(如果不存在),命名格式为日志文件名加一个数字(从1开始自动增长),以保持当前日志文件和转存后的日志文件不超过指定大小。logrotate的主要配置文件是/etc/logrotate.conf,/etc/logrotate.d目录是对/etc/logrotate.conf的补充,或者说为了不使/etc/logrotate.conf过大而设置。可以通过cat命令查看它的内容:$cat/etc/logrotate.conf#seemanlogrotatefordetails//可以查看帮助文档#rotatelogfilesweeklyweekly//设置每周转储一次#keep4weeksworthofbacklogsrotate4//最多转储4次#createnew(empty)logfilesafterrotatingoldonescreate//当转储后文件不存储时创建它#uncommentthisifyouwantyourlogfilescompressed#compress//以压缩方式转储#RPMpackagesdroplogrotationinformationintothisdirectoryinclude/etc/logrotate.d//其他日志文件的转储方式,包含在该目录下#nopackagesownwtmp--we'llrotatethemhere/var/log/wtmp{//设置/var/log/wtmp日志文件的转储参数monthly//每月转储create0664rootutmp//转储后文件不存在时创建它,文件所有者为root,所属组为utmp,对应的权限为0664rotate1//最多转储一次}注意:include允许管理员把多个分散的文件集中到一个,类似于C语言的#include,将其他文件的内容包含进当前文件。include非常有用,一些程序会把转储日志的配置文件放在/etc/logrotate.d目录,这些配置文件会覆盖或增加/etc/logrotate.conf的配置项,如果没有指定