日志的工作原理及配置
syslog
syslog同closelog、openlog共同给system logger发送消息
Linux由许多子系统构成,例如网络、内存文件访问等,这些子系统需要给用户发送一些消息,这些消息内容包括消息的来源及重要性等。所有的子系统都会把消息发送到一个可以维护的公用区域,于是就有了syslog程序。
syslog负责接收消息,这些消息包含了内核和程序产生的错误信息、警告信息及其他信息。并把这些消息发送到日志文件中,如/var/log/messages.一些重要信息也会显示在用户的窗口上。
syslog有两个重要文件:syslogd和syslog.conf
syslog能够接受访问系统的日志信息并且根据“/etc/syslog.conf”配置文件中的指令处理这些信息。守护进程和内核提供了访问系统的日志信息。所有的希望生成日志信息的程序都可以向syslog接口请求生成该信息。
syslog守护进程
Linux由许多子系统组成的,在后台中由许多daemon程序运行,这些程序处理一些日常的工作。每一个子系统发出日志消息的时候都会给消息指定一个类型。一个消息分成两部分:“设备”和“级别”,“设备”标识发出消息的子系统,可以把同一类型的消息组合在一起,“级别”标识消息的重要程度,其范围从debug(最不重要)到emerg(最重要),设备和级别组合起来称为priority。
syslog在后台运行,并把消息从日志区转移到日志文件中。
syslog.conf文件
这个文件告诉了syslog程序如何根据消息的来源和级别来报告消息
该文件使用如下形式
factility.level action
syslog.conf的第一列facility。level用来指定日志功能和日志级别,中间用.隔开,可以使用*来匹配所有的日志功能和日志的级别。第二列action是消息的分发目标。
facility.levle字段也被称为选择域(seletor)
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功能信息。
下面的等级重要性逐级递减:
emerg 系统不可用
alert 需要立即被修改的条件
crit 阻止某些工具或子系统功能实现的错误条件
err 阻止工具或某些子系统实现的错误条件
warning 预警信息
notice 具有重要性的普通条件
info 提供信息的消息
debug 不包含函数条件或问题的其他信息
none 没有重要级别,通常用于拍错
* 所有级别,除了none
action 字段作为动作域,所表示的活动具有许多灵活性,特别是,可以使用名称管道的作用是可以使syslog生成后处理信息。
syslog主要支持以下活动:
file 将信息追加到指定的文件尾
terminal 完全的串行或并行设别标志符
@host 远程的日志服务器
username 将消息写到指定的用户
named pipe 指定使用mkfifo命令来创建FIFO文件的绝对路径
* 将消息写到所有的用户
选择域指明消息的类型和优先级;动作域指明syslog接收到一个与选择标准相匹配的消息时所执行的动作。每个选项是由设备和优先级组成。当指明一个优先级时,syslog将记录一个拥有相同或更高优先级的消息。比如如果指明"crit",则所有标志为crit、alert和emerg的消息将被记录。每行的行动域指明当选择域选择了一个给定消息后应该把他发送到什么地方。
klogd 守护进程
klog是一个从UNIX内核接受消息的设备
klogd
守护进程获得并记录 Linux 内核信息。通常,syslogd 会记录 klogd
传来的所有信息。也就是说,klogd会读取内核信息,并转发到syslogd进程。然而,如果调用带有 -f filename 变量的 klogd
时,klogd 就在 filename 中记录所有信息,而不是传给 syslogd。当指定另外一个文件进行日志记录时,klogd
就向该文件中写入所有级别或优先权。Klogd 中没有和 /etc/syslog.conf 类似的配置文件。使用 klogd 而避免使用
syslogd 的好处在于可以查找大量错误。
日志管理及日志保护
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
}
在网络应用中,有一种保护日志的方式,在网络中设定一台秘密的syslog主机,把这台主机的网卡设为混杂模式,用来监听子网内所有的syslog包,这
样把所有需要传送日志的主机配置为向一台不存在的主机发送日志即可。这样即使黑客攻陷了目标主机,也无法通过syslog.conf文件找到备份日志的主
机,那只是一个不存在的主机。实际操作中还可以辅以交换机的配置,以确保syslog包可以被备份日志主机上的syslog进程接受到。比如把
syslog.conf中的传送日志主机设为
@192.168.0.13,但实际网络中不存在这个日志主机,实际可能是192.168.0.250或者其他主机正在接受syslog包。