1 Linux 的日志文件
一般情况下,Linux 的软件包大多将它们的日志信息记录到 /var/log 目录下的文件里,在有些发行版本上,个别日志也保存在 /var/adm 里。
现如今,大多数程序将它们的日志项发到一个称为 rsyslogd (如果你在其他旧的资料中看到 syslog 的关键词,请根据您所使用的发行版系统作相应的调整,因为在我的 Ubuntu 10.10 和 Fedora 17 系统上默认安装的都是 rsyslogd 并且我在系统的包管理器上再也找不到 syslog 的踪影了)的中央清理系统。默认的 rsyslogd 配置一般将这些信息的大部分转储到 /var/log 中的某个地方。下表是一份主要发行系统中较为常见的日志文件的有关信息。除非特别说明,否则文件名都相对于 /var/log 目录而言的。
文件 | 程序 | 发行版本 | 内容 |
---|---|---|---|
auth.log | su 等 | DU | 授权 |
apache2/* | apache2 | SDU | Apache2 http server log |
boot.log | rc 脚本 | 所有 | 系统启动脚本的输出 |
cron | cron | RF(DU要手动修改) | cron 的执行情况和出错信息 |
cups/* | CUPS | 所有 | 与打印有关的信息(CUPS) |
daemon.log | 许多 | DU | 所有守护进程功能的消息 |
debug | 许多 | DU | 调试输出 |
dmesg | 内核 | DU | 内核消息缓冲的转储 |
dpkg.log | dpkg | DU | 软件包管理日志 |
failog | login | SDU | 不成功的登录企图 |
httpd/log/* | httpd | RF | Apache http server log |
kern.log | 内核 | DU | 所有 kern 功能的消息 |
lastlog | login | 所有 | 每个用户上次登录的时间(二进制) |
mail. | mail 相关 | 所有 | 所有 mail 功能的消息 |
message | 许多 | 所有 | 经常是主要的系统日志文件 |
rpmpkgs | cron.daily/rpm | RF | 已安装的 RPM 软件包清单 |
samba/* | smbd 等 | - | Samba(Windows/CIFS 文件夹共享) |
secure | sshd, sudo 等 | RF | 保密的授权信息 |
syslog | 许多 | DU | 经常是主要的系统日志文件 |
warn | 许多 | S | 所有的警告、出错级的信息 |
wtmp | login | 所有 | 登录记录(二进制) |
Xorg.n.log | Xorg | 所有 | X window server 的出错信息 |
yum.log | yum | RF | 软件包管理日志 |
发行版本:
- R = Red Hat Enterprise Linux
- F = Fedora
- D = Debian
- U = Ubuntu
- S = SUSE
1.1 特殊的日志文件
/var/log/wtmp 中包含用户登录系统和退出系统的记录,也包含了表明系统何时重启或者关机的记录项。不过 wtmp 文件是以二进制形式保存的。只有使用 last 命令来解读这些信息:
/var/log/lastlog 包含信息类似于 /var/log/wtmp 中的信息,但是它只记录每个用户上次登录的时间。它也是一个二进制文件,使用 lastlog 命令来读取:
2 logrotate: 管理日志文件
Erik Troan 提供了一种优秀的工具 logrotate,它实现了多种多样的日志管理策略,而且在大多数的发行版本都是标准应用。当你查看你的 /var/log 目录下发现好多以类似 “.log.1”,“.log.2.gz” 形式结尾的项的时候,那么很多都是 logrotate 干的好事了。
logrotate 的配置文件由一系列规范组成,它们说明了要管理的日志文件组。默认情况下,配置文件处在 /etc/logrotate.conf 的位置,我们先来看下 Ubuntu 10.10 下默认情况下这个文件是长啥样的:
weekly rotate 4 create include /etc/logrotate.d /var/log/wtmp { missingok monthly create 0664 root utmp rotate 1 } /var/log/btmp { missingok monthly create 0660 root utmp rotate 1 }
这一配置每周转换一次,包含 /etc/logrotate.d 目录下的所有配置文件。并且指定每月轮换一次 /var/log/wtmp 文件,它保持这个文件的 1 个转换版本,新建文件的属主为 root 属组为 utmp,权限设为 0664。
下表列出 logrotate.conf 最有用的选项,同样适用于 /etc/logrotate.d 下的配置文件
选项 | 含义 |
---|---|
compress | 压缩日志文件的所有非当前版本 |
daily | 每日轮换日志文件 |
weekly | 每周轮换日志文件 |
monthly | 每月轮换日志文件 |
delaycompress | 压缩除了当前和最近之外的所有其他版本 |
endscript | 标记 prerotate 或者 postrotate 脚本结束 |
errors emailaddr | 向指定的 emailaddr 发送出错通知邮件 |
missingok | 如果日志不存在,不会发出报怨 |
notifempty | 如果日志为空,则不轮换它 |
olddir dir | 指定要放入 dir 里的日志文件老版本 |
postrotate | 引入在轮换过日志之后要运行的脚本 |
prerotate | 引入在进行任何发动之前运行的脚本 |
rotate n | 在轮换方案中包括 n 个版本的日志 |
sharedscripts | 只为整个日志组运行一次的脚本 |
size=logsize | 如果日志文件大于 logsize(例如 100k, 4M)才轮换 |
logrotate 一般每天由 cron 运行一次,而在膝上机或者并非总是开着机的环境中则由 anacron 来运行。关于 cron 和 anacron 的介绍可以参考前面的学习笔记(八)周期性进程或者阅读关于该两款工具的权威文章,man 是一个不错的选择,当然如果您手头上也有一本《Linux 系统管理技术手册》的书的话那样最好。
3 rsyslogd: 系统事件的日志程序
如果您正在使用的是比较旧的发行版本,那么可能您需要将 rsyslog 替换成 syslog 来看待,比如在文章中看到 rsyslogd 那么在您的头脑中就将它翻译成 syslogd 这样。不过很幸运地,在 Ubuntu 10.10 和 Fedora 17 这两款具有代表性的发行版本上所使用的均是 rsyslogd 系统日志程序。
我查阅了一下资料,在 RHEL 5.5 的发行版本上使用的似乎就是 syslogd,所以在阅读以下文字的时候需要根据系统所使用的相应的程序来进行阅读。
古人言:尽信书不如无书。
3.1 syslog 的体系结构
(这里的 syslog 是一个概念,并非对应一个具体的程序,除非字体被加粗,否则只是一个系统日志(syslog)的概念)
syslog 包括 3 个部分:
- rsyslogd 日志守护进程(及其配置文件 /etc/rsyslog.conf)
- logger 一条从 shell 提交日志记录项的用户级命令。
- 库例程 openlog, syslog, closelog 用于在程序中使用 syslog
3.2 配置 rsyslogd
配置文件 /etc/rsyslog.conf 控制着 rsyslogd 的行为。在文件的开头部分指明了您可以参考的文档的路径,在 Ubuntu 10.10 里是 /usr/share/doc/rsyslog-doc/html/rsyslog_conf.html,不过 Ubuntu 10.10 默认情况下并没有安装该文档的,所以你在查阅之前可能需要先安装
而在 Fedora 17 系统很幸运地默认已经安装好了,路径为 /usr/share/doc/rsyslog-5.8.10/rsyslog_conf.html。具体路径根据不同系统会有些少差别,需要根据自身使用系统的特点进行查阅。
/etc/rsyslog.conf 是一个格式相当简单的文本文件。# 为注释符。基本格式为:
selector action
例如,下面的一行:
mail.* /var/log/mail.log
将把来自电子邮件系统的信息保存在文件 /var/log/mail.log 中。
selector 用语法 [facility.level] 指明正在发送日志消息的程序和消息的严重级别。
selector 可以包含特殊的关键字 * 和 none,其含义分别为“所有的”和“什么都没有”。selector 可以包括多个用逗号分开的设备。多个 selector 可以用分号组合起来。
一般而言,selector 相互之间为“or”的关系,和某个 selector 匹配的消息将由同一行的 action 处理。但是,不管同一行中其他的 selector 是如何定义的,只要有一个带有 none 级别的,selector 就会排除列出的设备。比如下面这句
*.*;auth,authpriv.none -/var/log/syslog
意思就是将所有的系统信息记录到 /var/log/syslog 中但除了 auth 和 authpriv 的信息。
下表列出了有效的设备名。
设备(facility) | 使用该设备的程序 |
---|---|
* | 除了“mark”以外的所有设备 |
auth | 与安全和授权有关的命令 |
authpriv | 敏感、保密的授权信息 |
cron | 守护进程 cron |
daemon | 系统守护进程 |
ftp | FTP 守护进程,*ftpd* |
kern | 内核 |
local0-7 | 本地消息的 8 种类型 |
lpr | 行式打印机的假脱机系统 |
mail 相关软件 | |
mark | 定期产生的时间戳 |
news | Usernet 新闻系统 |
syslog | rsyslogd 内部消息 |
user | 用户进程 |
uucp | 为 UUCP 保留,并未使用 |
syslog 的严重性级别按照重要性递减的顺序排列如下表:
级别 | 大致含义 |
---|---|
emerg | 恐慌状态 |
alert | 紧急状态 |
crit | 临界状态 |
err | 错误情况 |
warning | 警告消息 |
notice | 需要调查的事项 |
info | 提供信息的消息 |
debug | 仅供调试 |
Linux 版的 syslog 对基本语法做了改进,它也允许在优先级前面加上字符 = 和 !,分别表示“仅此优先级”和“除此优先级及其以上级别”的意思。下表给出了一些例子:
选择符 | 含义 |
---|---|
mail.info | 选择与邮件相关的优先级为 info 或者更高的消息 |
mail.=info | 只选择优先级为 info 的消息 |
mail.info;mail.!err | 只选择优先级为 info 以上,err 以下的消息 |
mail.debug;mail.!=warning | 选择除 warning 之外的所有优先级 |
action 字段说明如何处理一则消息。下表列出可以选择的处理方法:
动作(Action) | 含义 |
---|---|
filename | 把消息写入本地机器上的一个文件里 |
@hostname | 把消息转发给主机 hostname 上的 rsyslogd |
@ipaddress | 把消息转发给 IP 地址为 ipaddress 的主机 |
fifoname | 把消息写入有名管道 fifoname |
user1,user2 | 如果用户登录到了系统上,那么就把消息写在用户的屏幕上 |
* | 把消息写给目前已经登录的所有用户 |
您可以在 filename 动作之前加一个短划线“-”,表示在写完每条日志记录项后,不应该对文件系统执行 sync 操作,执行 sync 有助于在发生崩溃的时候尽可能多地保留日志信息,但是从磁盘吞吐上来看,代价又太大了。
3.3 调试 syslog
logger 命令用于从 shell 脚本提交日志项。用户也可以用它来检测 rsyslogd 的配置文件的变化。例如,如果已经添加了一行:
local5.warning /tmp/evi.log
而且想看看它是否正常工作,则运行:
含有“test message”的一行记录项应该写到 /tmp/evi.log 文件中,如果没有写入,那么可能是忘记了给 rsyslogd 发送挂起信号。
3.4 在程序中使用 syslog
库例程 openlog,syslog 和 closelog 能够让程序使用 syslog 系统。这些库例程有 C、Perl、Python 和 PHP 版本,我在这里以 python 做个示例:
#! /usr/bin/python
# -*- coding: utf-8 -*-
import syslog
syslog.openlog('logdemo', syslog.LOG_PID | syslog.LOG_CONS, syslog.LOG_USER)
syslog.syslog(syslog.LOG_INFO, "This is a logdemo test for syslog")
syslog.closelog()
选择你喜爱的编辑器,emacs 或者 vi,将上面的代码添加上去,然后将文件保存成 logdemo 并修改它的执行权限
运行之后就应该在 /var/log/messages 或者 /var/log/syslog(Ubuntu)文件中看到产生的日志记录:
Dec 22 22:23:34 bluebird-system logdemo[8109]: This is a logdemo test for syslog
Enjoy & Have fun.