当前位置:Linux教程 - Linux综合 - 下一代系统日志工具(syslog-ng)

下一代系统日志工具(syslog-ng)

  1.syslog-ng简介 在UNIX系统的维护中,经常会忽略系统事件的处理。经常检查系统日志对于保持系统的安全和正常运行是至关重要的。但是,系统日志中有太多的噪音,一些不是很重要的信息会掩盖重要的信息。目前的工具很难甄别出系统管理者感兴趣的信息。 用户可以通过指定facility/priority,把消息发到不同的地方。系统预先定义了12+8个(mail、news、auth等)facility,八个不同的优先级(alert到debug)。 这其中存在一个问题,大量的程序使用同样的facility(daemon),把日志都保存到一个文件中(messages),即使它们毫无关联。这样就造成用户很难筛选出自己感兴趣的东西。 第二个问题是,大多数的程序无法改变日志配置,只能修改软件的源代码。 因此,使用facility作为过滤不是一个好办法。最好能够有一些runtime选项,使用这些选项指定日志facility,建立新的facility。 syslog-ng的一个设计原则就是建立更好的消息过滤粒度。syslog-ng能够进行基于内容和优先权/facility的过滤。另一个设计原则是更容易进行不同防火墙网段的信息转发,它支持主机链,即使日志消息经过了许多计算机的转发,也可以找出原发主机地址和整个转发链。最后的一个设计原则就是尽量使配置文件强大和简洁。 2.消息路径 一个消息路径是由一个或者多个日志消息源、一个或者多个过滤规则以及一个或者多个日志消息目的组成的。来自某个日志消息源的消息进入syslog-ng,如果消息命中某条规则,syslog-ng就把它发送到对应的日志消息目的。 消息源 一些日志消息源驱动器(source driver)组成一个消息源,这些驱动器使用给定的方法收集日志消息。譬如,有的syslog()系统调用使用的AF_UNIX、SOCK_STREAM风格的套接字源驱动器。 在配置文件中,你可以使用下面的语法声明一个日志消息源: source { source-driver(params); source-driver(params); ... }; identifier是给定消息源的唯一标志,但是这个标志符不能和保留字有冲突。 你可以控制使用哪个驱动器来收集日志消息,因而你需要知道你的系统和他的内部syslogd是如何通讯的。下面介绍一下某些平台中,syslogd是如何工作的。 Linux 一个叫作/dev/log的SOCK_STREAM unix套接字 BSD 一个叫作/var/run/log的SOCK_STREAM unix套接字 Solaris(2.5或以下) 一个叫做/dev/log的SVR4风格的STREAMS设备 solaris(2.6或以上) 除了2.6之前版本使用的STREAMS设备之外,使用了一种新的多线程IPC方法调用门。默认情况下,这个调用门是/etc/syslog_door,由syslogd使用。 在syslog-ng中,每个可能的通讯机制都有对应的日志消息源驱动器。例如:如果要打开一个SOCK_DGRAM风格的UNIX套接字进行通讯,你就会用到unix-dgram驱动器,同样SOCK_STREAM式的通讯需要unix-stream驱动器。 例2-1.Linux中的一个源指令 source src { unix-stream("/dev/log"); internal(); udp(ip(0.0.0.0) port(514)); }; 驱动器可以使用参数,参数有些是必需的,有些是可选的。必需的参数一般在前面。上面的指令中,/dev/log就是必需参数。 下面是可用的源驱动器: internal syslog-ng内部产生的消息 unix-stream 打开指定的SOCK_STREAM模式的unix套接字,接收日志消息 unix-dgram 打开指定的SOCK_DGRAM模式的unix套接字,接收日志消息 file 打开指定的文件读取日志信息 pipe,fifo 打开指定的管道或者FIFO设备,读取日志信息 tcp 在指定的TCP端口接收日志消息 udp 在指定的UDP端口接收日志消息 sun-stream(s) 在solaris系统中,打开一个(多个)指定的STREAM设备,从其中读取日志消息 在下一章中,我们将详细介绍每个日志消息源驱动器。
[1] [2] [3] 下一页 

过滤器 在syslog-ng中,过滤器执行日志路由。你可以使用syslog-ng的内部函数编写布尔表达式,来决定日志信息是否通过。 过滤器也都有唯一的标志符,语法如下: fileter { eXPression;}; 表达式中可以包含逻辑操作符(and、or、not)和函数。 例2-2.一个搜索来自blurp主机,包含deny的日志消息的过滤指令 filter f_blurp_deny { host("blurp") and match("deny"); }; 下面是syslog-ng的过滤函数: facility() 根据设备选择日志消息 level()或者priority() 根据优先级选择日志消息 program() 日志消息的程序名是否匹配一个正则表达式 host() 日志消息的主机名是否和一个正则表达式匹配 match() 对日志消息的内容进行正则匹配 filter() 调用另一条过滤规则并判断它的值 关于这些函数,后面的章节中将有更为详细的介绍。 有一个特殊的过滤器标志符DEFAULT,用于捕获所有没有处理的日志消息。例如: options { keep_hostname(yes); }; source src { unix-stream("proba2"); internal(); }; destination FTPd { file("ftplog"); }; destination named { file("namedlog"); }; destination daemon { file("daemonlog"); }; filter f_ftpd { match("ftp"); }; filter f_named { match("named"); }; filter f_daemon { facility(daemon); }; log { source(src); filter(f_ftpd); destination(ftpd); }; log { source(src); filter(f_named); destination(named); }; log { source(src); filter(f_daemon); filter(DEFAULT); destination(daemon); }; 在这个例子中,default过滤器捕获所有没有被f_ftpd和f_named过滤器捕获的facility是daemon的日志消息。 日志消息目的 destination指定匹配过滤规则的日志消息的去处。和日志消息源类似,日志消息目的可以包括一些目的驱动器,指定日志的派发方向。你需要使用如下语法来声明日志消息目的: destination { destination-driver(params); destination-driver(params); ... }; 下面是syslog-ng支持的日志消息目的驱动器: file 日志消息写到指定的文件 fifo,pipe 把日志消息写到指定的管道 unix-stream 把日志消息发送到给定的SOCK_STREAM类型的UNIX套接字(Linux) unix-dgram 把日志消息发送到给定的SOCK_DGRAM类型的UNIX套接字(BSD) udp 把日志消息发送到指定主机的UDP端口 TCP 把日志消息发送到指定主机的TCP端口 usertty 如果用户登录,把日志发送到指定的终端 program fork并启动指定的程序,把日志消息发送到这个进程的标准输出。 详情请参考下面的章节。 日志路径 前面的章节中,我们学习了如何定义消息源、过滤器和消息目的。现在我们要把这些结合起来形成一条完整的指令。凡是来源于指定的消息源,匹配所有指定的过滤器,并送到指定的地址。其语法如下: log { source(s1); source(s2); ... filter(f1); filter(f2); ... destination(d1); destination(d2); ... };
上一页 [1] [2] [3] 下一页 

日志路径中的成员是顺序执行的。 选项 你可以通过设置一些选项来改变syslog-ng的行为。设置选项的语法一般是: options { option1(params); option2(params); ... }; 每个选项也可以有自己的参数。 以下是syslog-ng支持的参数: 名字 参数类型 描述 time_reopen() 数字 一个断开的连接重新连接之前需要等待的时间 time_reap() 数字 一个闲置的目标文件关闭之前需要等待的时间 sync_freq() 数字 在写入文件之前,可以缓冲的日志消息行数 mark_freq() 数字 目前尚未实现 log_fifo_size() 数字 输出队列的行数 chain_hostnames() yes/no 打开/关闭主机名链(用于日志转发) use_time_recvd() yes/no 使用收到日志消息的时间,不用日志消息中指定的时间 use_dns() yes/no 打开/关闭DNS查询功能。因为DNS查询无法返回会造成syslog-ng处于阻塞状态,从而造成拒绝服务攻击。为了避免这种情况的出现,应该使用防火墙严格保护使用syslog-ng的网络节点,并确认syslog-ng使用的所有主机都是可以解析的。 use_fqdn() yes/no 使用完整的域名 gc_idle_threshold() 数字 当syslog-ng空闲时,设置其进入垃圾信息收集状态的阀值。一旦分配的对象数达到了这个数字,syslog-ng就启动垃圾信息收集状态。默认值是1000。 gc_busy_threshold() 数字 当syslog-ng忙时,设置其进入垃圾信息收集状态的阀值。一旦分配的对象数达到这个数字,syslog-ng就启动垃圾信息收集状态。默认值是3000。 每个选项也可以有自己的参数。 以下是syslog-ng支持的参数: 名字 参数类型 描述 time_reopen() 数字 一个断开的连接重新连接之前需要等待的时间 time_reap() 数字 一个闲置的目标文件关闭之前需要等待的时间 sync_freq() 数字 在写入文件之前,可以缓冲的日志消息行数 mark_freq() 数字 目前尚未实现 log_fifo_size() 数字 输出队列的行数 chain_hostnames() yes/no 打开/关闭主机名链(用于日志转发) use_time_recvd() yes/no 使用收到日志消息的时间,不用日志消息中指定的时间 use_dns() yes/no 打开/关闭DNS查询功能。因为DNS查询无法返回会造成syslog-ng处于阻塞状态,从而造成拒绝服务攻击。为了避免这种情况的出现,应该使用防火墙严格保护使用syslog-ng的网络节点,并确认syslog-ng使用的所有主机都是可以解析的。 use_fqdn() yes/no 使用完整的域名 gc_idle_threshold() 数字 当syslog-ng空闲时,设置其进入垃圾信息收集状态的阀值。一旦分配的对象数达到了这个数字,syslog-ng就启动垃圾信息收集状态。默认值是1000。 gc_busy_threshold() 数字 当syslog-ng忙时,设置其进入垃圾信息收集状态的阀值。一旦分配的对象数达到这个数字,syslog-ng就启动垃圾信息收集状态。默认值是3000。