大多数程序将它们的日志信息输出到syslog服务。传统的syslogd守护进程等待消息的到来,并根据它们的类型将她们输出到文件、屏幕、用户或者其它地方,有的干脆忽略。
一 系统日志
系统日志是系统中最重要的部分之一。如果系统出现用户不清楚的错误,查看系统日志文件是一个好选择。大多数Linux系统使用的是syslogd的一个新版本,名字叫rsyslogd。它的功能不仅仅局限于记录日志信息。比如用户可以让它加载一个将日志信息写到数据库的模块。
日志一般被记录在/var/log目录当中,一般日志文件的内容就显示了它们来自哪里。/var/log目录中的很多文件都不是系统日志来维护的。要知道哪些日志属于rsyslogd,需要查看它们的配置文件。
二 配置文件
rsyslog的基础配置文件是/etc/rsyslog.conf,但是在其他地方(比如/etc/rsyslogd.d)也可能会发现另外的配置文件。其内容包括传统的规则和rsyslogd扩展。任何以$开头的都是扩展。
传统的规则包括一个选择符(selector)和一个操作(action),分别代表从哪里获得日志和将其写到哪里,如下:
*.err;kern.debug;auth.notice /dev/console daemon,auth.notice /var/log/messages lpr.info /var/log/lpr.log mail.* /var/log/mail.log ftp.* /var/log/ftp.log auth.* @see.xidian.edu.cn auth.* root,amrood netinfo.err /var/log/netinfo.log install.* /var/log/install.log *.emerg * *.alert |program_name mark.* /dev/console
左边是选择符,右边是操作。上例大部分操作都是将日志写入文件,也有一些例外(/dev/console)。还有root表示如果root登录的话,将消息发送给他,*代表发送消息给系统中的所有用户。@see.xidian.edu.cn表示将消息发送给网络上名为see.xidian.edu.cn的主机。
设施和优先级
选择符用来匹配日志信息的设施和优先级。设施是指消息的大致分类(在rsyslog.conf(5)帮助手册中查看完整的设施列表)。设施的功能很容易通过它们的名称得知。*是一个通配符,表示在所有设施中获得输出。设施后面的点号(.)表示优先级,由高到低分别是:
优先级 | 说明 |
---|---|
emerg | 紧急情况,系统不可用(例如系统崩溃),一般会通知所有用户。 |
alert | 需要立即修复,例如系统数据库损坏。 |
crit | 危险情况,例如硬盘错误,可能会阻碍程序的部分功能。 |
err | 一般错误消息。 |
warning | 警告。 |
notice | 不是错误,但是可能需要处理。 |
info | 通用性消息,一般用来提供有用信息。 |
debug | 调试程序产生的信息。 |
none | 没有优先级,不记录任何日志消息。 |
为选择符设置了优先级之后,rsyslogd将该优先级及其以上优先级的消息发送到指定目的地。
常见的的日志文件:
文件/目录 | 说明 |
---|---|
/var/log/boot.log | 开启或重启日志。 |
/var/log/cron | 计划任务日志 |
/var/log/maillog | 邮件日志。 |
/var/log/messages | 该日志文件是许多进程日志文件的汇总,从该文件可以看出任何入侵企图或成功的入侵。 |
/var/log/httpd 目录 | Apache HTTP 服务日志。 |
/var/log/samba 目录 | samba 软件日志 |
三 logger
以下来自:http://c.biancheng.net/cpp/html/2783.html
logger 是Shell命令,可以通过该命令使用 syslog 的系统日志模块,还可以从命令行直接向系统日志文件写入一行信息。
logger命令的语法为:
logger [-i] [-f filename] [-p priority] [-t tag] [message...]每个选项的含义如下:
选项 | 说明 |
---|---|
-f filename | 将 filename 文件的内容作为日志。 |
-i | 每行都记录 logger 进程的ID。 |
-p priority | 指定优先级;优先级必须是形如 facility.priority 的完整的选择器,默认优先级为 user.notice。 |
-t tag | 使用指定的标签标记每一个记录行。 |
message | 要写入的日志内容,多条日志以空格为分隔;如果没有指定日志内容,并且 -f filename 选项为空,那么会把标准输入作为日志内容。 |
例如,将ping命令的结果写入日志:
$ ping 192.168.0.1 | logger -it logger_test -p local3.notice& $ tail -f /var/log/userlog Oct 6 12:48:43 kevein logger_test[22484]: PING 192.168.0.1 (192.168.0.1) 56(84) bytes of data. Oct 6 12:48:43 kevein logger_test[22484]: 64 bytes from 192.168.0.1: icmp_seq=1 ttl=253 time=49.7 ms Oct 6 12:48:44 kevein logger_test[22484]: 64 bytes from 192.168.0.1: icmp_seq=2 ttl=253 time=68.4 ms Oct 6 12:48:45 kevein logger_test[22484]: 64 bytes from 192.168.0.1: icmp_seq=3 ttl=253 time=315 ms Oct 6 12:48:46 kevein logger_test[22484]: 64 bytes from 192.168.0.1: icmp_seq=4 ttl=253 time=279 ms Oct 6 12:48:47 kevein logger_test[22484]: 64 bytes from 192.168.0.1: icmp_seq=5 ttl=253 time=347 ms Oct 6 12:48:49 kevein logger_test[22484]: 64 bytes from 192.168.0.1: icmp_seq=6 ttl=253 time=701 ms Oct 6 12:48:50 kevein logger_test[22484]: 64 bytes from 192.168.0.1: icmp_seq=7 ttl=253 time=591 ms Oct 6 12:48:51 kevein logger_test[22484]: 64 bytes from 192.168.0.1: icmp_seq=8 ttl=253 time=592 ms Oct 6 12:48:52 kevein logger_test[22484]: 64 bytes from 192.168.0.1: icmp_seq=9 ttl=253 time=611 ms Oct 6 12:48:53 kevein logger_test[22484]: 64 bytes from 192.168.0.1: icmp_seq=10 ttl=253 time=931 msping命令的结果成功输出到 /var/log/userlog 文件。
命令 logger -it logger_test -p local3.notice 各选项的含义:
- -i:在每行都记录进程ID;
- -t logger_test:每行记录都加上“logger_test”这个标签;
- -p local3.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 # see "man logrotate" for details //可以查看帮助文档 # rotate log files weekly weekly //设置每周转储一次 # keep 4 weeks worth of backlogs rotate 4 //最多转储4次 # create new (empty) log files after rotating old ones create //当转储后文件不存储时创建它 # uncomment this if you want your log files compressed #compress //以压缩方式转储 # RPM packages drop log rotation information into this directory include /etc/logrotate.d //其他日志文件的转储方式,包含在该目录下 # no packages own wtmp -- we'll rotate them here /var/log/wtmp { //设置/var/log/wtmp日志文件的转储参数 monthly //每月转储 create 0664 root utmp //转储后文件不存在时创建它,文件所有者为root,所属组为utmp,对应的权限为0664 rotate 1 //最多转储一次 }
注意:include 允许管理员把多个分散的文件集中到一个,类似于C语言的 #include,将其他文件的内容包含进当前文件。
include 非常有用,一些程序会把转储日志的配置文件放在 /etc/logrotate.d 目录,这些配置文件会覆盖或增加 /etc/logrotate.conf 的配置项,如果没有指定相关配置,那么采用 /etc/logrotate.conf 的默认配置。
所以,建议将 /etc/logrotate.conf 作为默认配置文件,第三方程序在 /etc/logrotate.d 目录下自定义配置文件。
logrotate 也可以作为命令直接运行来修改配置文件。