免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 1123 | 回复: 1
打印 上一主题 下一主题

Sysklogd 系统日志记录器 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2010-03-24 16:34 |只看该作者 |倒序浏览
概述
日志对于系统的重要性不言而喻,比如对于故障诊断和入侵检测,没有日志几乎寸步难行。Linux系统当中最流行的日志记录器是 Sysklogd ,当前最新版本是 1.5 。

Sysklogd 日志记录器由两个守护进程(klogd syslogd)和一个配置文件(syslog.conf)组成。klogd 不使用配置文件,它负责截获内核消息,它既可以独立使用也可以作为 syslogd 的客户端运行。syslogd 默认使用 /etc/syslog.conf 作为配置文件,它负责截获应用程序消息,还可以截获 klogd 向其转发的内核消息。支持 internet/unix domain sockets 的特性使得这两个工具可以用于记录本地和远程的日志。



重要信息
syslogd 守护进程默认情况下并不从 syslog/udp 端口接受任何消息,除非在命令行上使用了"-r"选项。此外,你还应当仔细看看"-l"和"-s"命令行选项。
syslogd 守护进程默认情况下并不转发任何来自远程主机的消息,这是为了避免可能导致的日志无限循环。"-h"选项可以开启转发功能。
syslogd 会剥除来自同一个域范围内的主机中的每条消息中的本地域(local domain)信息。如果你使用了日志分析程序,请将这一特性牢记在心。
syslogd 不会更改任何文件的属性,所以由它创建的文件将是全局可读的。如果你不想这样(比如"auth.*"被进行了记录),你必须手动事先创建这些文件并设置相应的权限。
如果某些程序发送了大量的日志消息并且导致硬盘非常忙碌,你可以考虑在每一行后面关闭fsync()特性。不过这样可能会导致系统崩溃以后丢失一些日志消息。
如果你使用 init 来直接启动 klogd 或 syslogd ,那么需要在命令行上使用"-n"选项。
如果 System.map 文件存在并且在 klogd 命令行上使用了"-k"的话,那么它可以解码 EIP 地址。这个特性对于诊断系统崩溃非常有用,但是你必须确保 System.map 文件正确无误。
这两个守护进程都会尝试在收到退出信号时删除他们的 .pid 文件,不过如果系统崩溃或者进程被"kill -9"结束,那么可能就会来不及清理。这样,下次启动时就有可能会获得与以前残留的 .pid 文件中的进程号相同的PID,从而导致无法启动(进程号冲突)。解决这个问题的最佳方案是系统的启动脚本(rc.*)自身能够在系统启动的最初就对这些 .pid 文件进行清理(通常是清空 /var/run 目录)。
大文件支持(可以写入大于 2 GB 的日志)并不是 syslogd 的功能,而是 glibc 的功能(使用不同的内核API进行调用)。要启用大文件支持,你必须将 Makefile 中的相应注释取消(两个含有"-D_FILE_OFFSET_BITS"的行中的一个)。
内核的控制台日志等级
内核的控制台日志等级控制哪些内核消息会在控制台上显示。有两种途径可以修改这个等级,不过建议的途径是通过 sysctl 来控制,通常这个设置位于 /etc/sysctl.conf 中。比如:

  kernel/printk = 4 4 1 7安装注意事项
仔细阅读 README 和 man page 会减少你不少痛苦。目前所有文档都已经放在man page中了。
按照你的需求修改 Makefile 然后再进行编译。如果你没有认真对待第一步,那么可能会编译出不合格的二进制程序。
FSSTND(Linux文件系统标准)要求二进制文件和其配置文件必须位于不同的目录。这个包默认情况下遵守FSSTND的约定。你可以通过修改 Makefile 文件和源代码来修改配置文件的位置。
建议让这两个守护进程都以root身份运行,如果你想了解更多安全方面的问题,请阅读 man page 。
下面是 Makefile 文件开头的一部分节选,这部分是在安装是可能需要改动的:

CC= gcc
SKFLAGS= $(RPM_OPT_FLAGS) -O3 -DSYSV -fomit-frame-pointer -Wall -fno-strength-reduce
# 启用大文件支持,根据你的系统是32位还是64位进行选择
# -D_FILE_OFFSET_BITS=64 -D_LARGEFILE_SOURCE
# -D_FILE_OFFSET_BITS=64 -D_LARGEFILE64_SOURCE
# $(shell getconf LFS_SKFLAGS)
LDFLAGS= -s

# 指定 install 程序的位置
INSTALL = /usr/bin/install

# 安装目录
BINDIR = $(prefix)/usr/sbin
MANDIR = $(prefix)/usr/share/man

# 有bug报告说在一个纯 ELF 系统上需要明确指定连接到 libresolv.a 库。
# 如果你在连接 syslogd 时失败,可以试一试取消下面的注释。
# LIBS = /usr/lib/libresolv.a

# 如果你在 ALPHA 平台上连接失败,可以试一试取消下面的注释。
# LIBS = ${LIBS} -linux

# 取消下面的注释可以让 klogd 实现启动延迟,这在 klogd 和 syslogd 并行启动或启动顺序靠的非常近的时候很有用。
# KLOGD_START_DELAY = -DKLOGD_DELAY=5

# 下面的定义表示文件位置遵守FSSTND标准。
FSSTND = -DFSSTND

# 下面的定义指定了 man page 的宿主和权限。
MAN_USER = root
MAN_GROUP = root
MAN_PERMS = 644

# 下面的定义指定了 syslogd 守护进程的 .pid 文件名,
# 源代码(paths.h)中默认的文件名是"syslog.pid",但很多人认为应当叫"syslogd.pid"。
# 你可以在这里指定你喜欢的名字。
SYSLOGD_PIDNAME = -DSYSLOGD_PIDNAME=\"syslogd.pid\"
syslog.conf
syslog.conf 是 syslogd 进程的配置文件,将在程序启动时读取,默认位置是 /etc/syslog.conf 。它指定了一系列日志记录规则。规则的格式如下:

facility.level    action这个配置文件中的空白行和以"#"开头的行将被忽略。"facility.level"部分也被称为选择符(seletor)。 seletor 和 action 之间使用一个或多个空白分隔。

选择符(seletor)
选择符由 facility 和 level 两部分组成,之间用一个句点(.)连接。这两部分将在后面 syslogd 小节中详细描述。下面提到的名字和 /usr/include/syslog.h 中的 LOG_-values 相一致。

facility 指定了产生日志的子系统,可以是下面的关键字之一:

auth                由 pam_pwdb 报告的认证活动。
authpriv        包括私有信息(如用户名)在内的认证活动
cron                与 cron 和 at 有关的信息。
daemon                与 inetd 守护进程有关的信息。
ftp                与 FTP 有关的信息
kern                内核信息,首先通过 klogd 传递。
lpr                与打印服务有关的信息。
mail                与电子邮件有关的信息
mark                syslog 内部功能用于生成时间戳
news                来自新闻服务器的信息
syslog                由 syslog 生成的信息
user                由用户程序生成的信息
uucp                由 uucp 生成的信息
local0 ~ local7        由自定义程序使用,例如使用 local5 做为 ssh 功能
*                通配符代表除了 mark 以外的所有功能
在大多数情况下,任何程序都可以通过任何 facility 发送日志消息,但是一般都遵守约定俗成的规则。比如,只有内核才能使用"kern" facility 。

level 指定了消息的优先级,可以是下面的关键字之一(降序排列,严重性越来越低):

emerg        系统不可用
alert        需要立即被修改的条件
crit        阻止某些工具或子系统功能实现的错误条件
err        阻止工具或某些子系统部分功能实现的错误条件
warning        预警信息
notice        具有重要性的普通条件
info        提供信息的消息
debug        不包含函数条件或问题的其他信息
none        没有优先级,通常用于排错
*        除了none之外的所有级别
facility 部分可以是用逗号(,)分隔的多个子系统,而多个 seletor 之间也可以通过分号(组合在一起。需要注意的是,多个组合在一起的选择符,后面的会覆盖前面的,这样就允许从模式中排除一些优先级。

默认将对指定级别以及更严重级别的消息进行操作,但是可以通过下面2个操作符进行修改。

等于操作符(=)表示仅对这个级别的消息进行操作,不等操作符(!)表示忽略这个级别以及更严重级别的消息。这两个操作符可以同时使用,不过"!"必须出现在"="的前面。

动作(action)
这个字段定义了对符合条件的消息进行何种操作,可以选择下列操作之一:

普通文件
将消息记录到这个文件中,必须使用绝对路径。如果在文件名之前加上减号(-),则表示不将日志信息同步刷新到磁盘上(使用写入缓存),这样可以提高日志写入性能,但是增加了系统崩溃后丢失日志的风险。
命名管道
在绝对路径表示的FIFO文件(使用mkfifo命令创建)前加上管道符号(|)即可。通常用于调试。比如:|/usr/adm/debug
终端或者控制台
比如:/dev/tty1 或 /dev/console
远程主机
syslogd 能够将消息发送到远程主机或从远程主机接收消息,不过默认并不转发接收到的消息。要将消息发送到远程主机,可以在主机名前加一个"@"即可。
逗号分隔的用户名列表
critical 级别的消息除了记录到日志之外,通常还转发到root用户。
所有当前登录的用户
如果写上一个星号(*)则表示向当前所有登录的用户显示这条消息。
实例
下面的例子来自于实践,希望能够对上面的内容做一个很好的示范以帮助理解。

              # 将所有 crit 级别的消息(排除所有内核消息)记录在 critical 文件中
              #
              *.=crit;kern.none            /var/adm/critical

              # 首先记录所有内核消息到 kernel 文件,
              # crit 级别以上的消息转发到远程同时在本地控制台也显示
              # 最后将info(包含)~err(不含)范围的内核消息记录到kernel-info文件(err和更高的级别被忽略)
              #
              kern.*                       /var/adm/kernel
              kern.crit                    @finlandia
              kern.crit                    /dev/console
              kern.info;kern.!err          /var/adm/kernel-info

              # 将恰好等于mail.info的消息显示在第12个终端(tcpd默认使用mail.info)
              #
              mail.=info                   /dev/tty12

              # 将除mail.info之外的所有mail子系统消息记录到mail文件
              #
              mail.*;mail.!=info           /var/adm/mail

              # 将所有mail.info和news.info消息记录到info文件
              #
              mail,news.=info              /var/adm/info

              # 记录所有info和notice级别的消息,来自mail子系统的除外
              #
              *.=info;*.=notice;mail.none  /var/log/messages

              # 记录所有info级别的消息,来自mail和news子系统的除外
              #
              *.=info;mail,news.none       /var/log/messages

              # 向所有登录用户通知emerg级别的消息
              #
              *.=emerg                     *

              # 将所有alert以及更高级别的消息转发到root,joey用户的终端上(如果他们已经登录)
              #
              *.alert                      root,joey

              # 将所有子系统的所有消息都发送到远程名为"finlandia"的主机
              *.*                          @finlandia

                  浦华众诚培训网技术学院 转载

论坛徽章:
34
亥猪
日期:2015-03-20 13:55:11戌狗
日期:2015-03-20 13:57:01酉鸡
日期:2015-03-20 14:03:56未羊
日期:2015-03-20 14:18:30子鼠
日期:2015-03-20 14:20:14丑牛
日期:2015-03-20 14:20:31辰龙
日期:2015-03-20 14:35:34巳蛇
日期:2015-03-20 14:35:56操作系统版块每日发帖之星
日期:2015-11-06 06:20:00操作系统版块每日发帖之星
日期:2015-11-08 06:20:00操作系统版块每日发帖之星
日期:2015-11-19 06:20:00黄金圣斗士
日期:2015-11-24 10:43:13
2 [报告]
发表于 2010-03-24 17:19 |只看该作者
就开过 cron ……
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP