就象其它复杂的操作系统那样,Linux也是由很多不同的子系统组成的。有些叫做daemon的程序一直在后台运行(daemon:守护神之意。也就是 说,他们"默默无闻",不需要和用户交互),处理一些象打印、发送邮件、建立Internet连接,等等日常工作。每一个子系统发出日志消息的时候都会给 消息指定一个类型。一个消息分成两个部分:"设备(facility)"和"级别(level)"。"设备"标识发出消息的子系统,可以把同一类型的消息组合在一起,"级别"表示消息的重要性,其范围从debug(最不重要)到emerg(最重要),facility和level组合起来称为priority。(详细解释参照5.3) /usr/include/sys/syslog.h中对此有相关的定义。 用户看不到daemon程序,因为它们没有窗口和用户界面。但是,这些程序有时候也要给用户传递一些信息。为了实现这个目的,就需要一个特殊的机制。syslogd就是daemon的一个很好的例子,它在后台运行并且把消息从日志区转移到日志文件中去。 函数接口 #include void openlog( char * , int , int ) 其中,可以是以下值的OR组合: LOG_CONS : 如果消息无法送到syslogd,直接输出到系统console。 LOG_NDELAY : 立即打开到syslogd的连接,默认连接是在第一次写入讯息时才打开的。 LOG_PERROR : 将消息也同时送到stderr 上 LOG_PID : 将PID记录到每个消息中 void syslog( int , char * ) 其中,是facility和level的OR组合 void closelog( void ) 一般只需要用syslog()函数,其他函数可以不用。 3.3 syslog.conf 这是一个非常重要的文件。位于"/etc/"目录下。通知 syslogd 如何根据设备和信息重要级别来报告信息。 该文件使用下面的形式: facility.level action syslog.conf 的第一列facility.level用来指定日志功能和日志级别,中间用.隔开,可以使用*来匹配 所有的日志功能和日志级别。第二列action是消息的分发目标。 空白行和以#开头的行是注释,可以忽略。 Facility.level 字段也被称做选择域(seletor)。 n facility 指定 syslog 功能,主要包括以下这些: auth 由 pam_pwdb 报告的认证活动。 authpriv 包括特权信息如用户名在内的认证活动 cron 与 cron 和 at 有关的信息。 daemon 与 inetd 守护进程有关的信息。 kern 内核信息,首先通过 klogd 传递。 lpr 与打印服务有关的信息。 mail 与电子邮件有关的信息 mark syslog 内部功能用于生成时间戳 news 来自新闻服务器的信息 syslog 由 syslog 生成的信息 user 由用户程序生成的信息 uucp 由 uucp 生成的信息 local0----local7 与自定义程序使用,例如使用 local5 做为 ssh 功能 * 通配符代表除了 mark 以外的所有功能 level 级别,决定讯息的重要性。 与每个功能对应的优先级是按一定顺序排列的,emerg 是最高级,其次是 alert,依次类推。缺省时,在 /etc/syslog.conf 记录中指定的级别为该级别和更高级别。如果希望使用确定的级别可以使用两个运算符号!(不等)和=。 例如:user.=info 表示告知 syslog 接受所有在 info 级别上的 user 功能信息。 n 以下的等级重要性逐次递减: emerg 该系统不可用 alert 需要立即被修改的条件 crit 阻止某些工具或子系统功能实现的错误条件 err 阻止工具或某些子系统部分功能实现的错误条件 warning 预警信息 notice 具有重要性的普通条件 info 提供信息的消息 debug 不包含函数条件或问题的其他信息 none 没有重要级,通常用于排错 * 所有级别,除了none n action 字段为动作域,所表示的活动具有许多灵活性,特别是,可以使用名称管道的作用是可以使 syslogd 生成后处理信息。 syslog 主要支持以下活动: file 将消息追加到指定的文件尾 terminal 或 print 完全的串行或并行设备标志符 @host 远程的日志服务器 username 将消息写到指定的用户 named pipe 指定使用 mkfifo 命令来创建的 FIFO 文件的绝对路径。 * 将消息写到所有的用户 选择域指明消息的类型和优先级;动作域指明syslogd接收到一个与选择标准相匹配的消息时所执行的动作。每个选项是由设备和优先级组成。当指明一个优先级时,syslogd将纪录一个拥有相同或更高优先级的消息。比如如果指明"crit",则所有标为crit、alert和emerg的消息将被纪录。每行的行动域指明当选择域选择了一个给定消息后应该把他发送到什么地方。 以下是一个实际站点的配置(syslog.conf)文件: # Store critical stuff in critical # *.=crit;kern.none /var/adm/critical 这个将把所有信息以优先权的crit保存在/var/adm/critical文件中,除了一些内核信息 # Kernel messages are first, stored in the kernel # file, critical messages and higher ones also go # to another host and to the console # kern.* /var/adm/kernel kern.crit @finlandia kern.crit /dev/console kern.info;kern.!err /var/adm/kernel-info 第一条代码指引一些内核设备访问文件/var/adm/kernel的信息。 第二条代码直接引导所有拥有crit和更高优先权的内核信息访问远程主机。如果它们也存储在远程主机上,仍旧可以试着找到毁坏的原因。 第四行说明syslogd 保存了所有拥有info 到warning优先级的内核信息在/var/adm/kernel-info文件夹下。所有err和更高优先级的被排除在外。 # The tcp wrapper loggs with mail.info, we display # all the connections on tty12 # mail.=info /dev/tty12 这个引导所有使用mail.info (in source LOG_MAIL | LOG_INFO)的信息到/dev/tty12下,第12 个控制台。例如tcpwrapper tcpd (8)载缺省时使用这个 # Store all mail concerning stuff in a file mail.*;mail.!=info /var/adm/mail 模式匹配了所有具有mail功能的信息,除了拥有info优先级的。他们将被保存在文件/var/adm/mail中 # Log all mail.info and news.info messages to info # mail,news.=info /var/adm/info 提取所有具有mail.info 或news.info 功能优先级的信息存储在文件/var/adm/info中 # Log info and notice messages to messages file # *.=info;*.=notice;\ mail.none /var/log/messages 使所有syslogd日志中具有info 或notice功能的信息存储在文件/var/log/messages中,除了所有mail功能的信息 # Log info messages to messages file # *.=info;\ mail,news.none /var/log/messages 这个声明使syslogd日志中所有具有info优先权的信息存储在/var/log/messages文件中。但是一些有mail 或news功能的信息不能被存储。 # Emergency messages will be displayed using wall # *.=emerg * 这行代码告诉syslogd写所有紧急信息到所有当前登陆用户日志中。这个将被实现 # Messages of the priority alert will be directed # to the operator # *.alert root,joey *.* @finlandia 这个代码指引所有具有alert 或更高级权限的信息到终端操作。 第二行代码引导所有信息到叫做finlandia的远程主机。这个代码非常有用,特别是在所有syslog信息将被保存到一台机器上的群集计算机。 3.4 klogd 守护进程 klog是一个从UNIX内核接受消息的设备 klogd 守护进程获得并记录 Linux 内核信息。通常,syslogd 会记录 klogd 传来的所有信息。也就是说,klogd会读取内核信息,并转发到syslogd进程。然而,如果调用带有 -f filename 变量的 klogd 时,klogd 就在 filename 中记录所有信息,而不是传给 syslogd。当指定另外一个文件进行日志记录时,klogd 就向该文件中写入所有级别或优先权。Klogd 中没有和 /etc/syslog.conf 类似的配置文件。使用 klogd 而避免使用 syslogd 的好处在于可以查找大量错误。 总结 其中,箭头代表发送消息给目标进程或者将信息写入目标文件。
图1 Linux日志系统 日志管理及日志保护
logrotate程序用来帮助用户管理日志文件,它以自己的守护进程工作。logrotate周期性地旋转日志文件,可以周期性地把每个日志文件重命名 成一个备份名字,然后让它的守护进程开始使用一个日志文件的新的拷贝。在/var/log/下产生如maillog、maillog.1、 maillog.2、boot.log.1、boot.log.2之类的文件。它由一个配置文件驱动,该文件是 /etc/logroatate.conf。 以下是logroatate.conf文件例子: # see "man logrotate" for details # rotate log files weekly weekly #以7天为一个周期 # keep 4 weeks worth of backlogs rotate 4 #每隔4周备份日志文件 # send errors to root errors root #发生错误向root报告 # 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 lastlog or wtmp -- we'll rotate them here /var/log/wtmp { monthly create 0664 root utmp rotate 1 } # system-specific logs may be configured here