`
hongliangpan
  • 浏览: 319747 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

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

阅读更多
下一代系统日志工具(syslog-ng)

来源:Linux技术中坚站 等级:默认等级
发布于2005-05-28 22:17 被读1356次 【字体:大 中 小】

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 <identifier> { 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设备,从其中读取日志消息

在下一章中,我们将详细介绍每个日志消息源驱动器。



过滤器

在syslog-ng中,过滤器执行日志路由。你可以使用syslog-ng的内部函数编写布尔表达式,来决定日志信息是否通过。

过滤器也都有唯一的标志符,语法如下:


fileter <identifier> { 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 <identifier> { 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); ... };


日志路径中的成员是顺序执行的。


选项

你可以通过设置一些选项来改变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。




3.参考


本章,将详细介绍配置文件中使用的驱动器和选项。


消息源驱动器


internal()

所有syslog-ng内部产生的日志消息都来自这个日志消息源。如果你需要syslog-ng自身山城的警告、错误和提醒信息,就需要在配置文件中加入以下声明:


Declaration: internal()


如果这个消息源驱动器没有被引用,syslog-ng会向你输出报警信息。


例3-1.使用inernal()日志消息源驱动器



source s_local { internal(); };



unix-stream()和unix-dgram()

这 两个日志消息源驱动器比较相似,都打开AF_UNIX类型的套接字,在套接字上监听日志消息。unix-stream()主要用在Linux,使用 SOCK_STREAM参数,是面向连接的,不会造成日志消息的丢失;unix-dgram()用在BSD系统上,使用SOCK_DGRAM参数,是无连 接的,如果系统过载,会造成日志消息丢失。

在使用面向连接的协议时,为了避免造成拒绝服务攻击,需要对同时接受的连接数量进行闲置。这由max-connections()参数实现。


Declaration:
unix-stream(filename [options]);
unix-dgram(filename [options]);


以下选项可以用于unix-stream和unix-dgram日志消息源驱动器的声明:


名字 参数数据类型 描述
owner() 字符串 设置套接字的uid,默认是:root
group() 字符串 设置套接字的gid,默认是:root
perm() 数字 设置权限掩码。八进制数字以0开头,例如:0755表示rwxr-xr-x。
keep-alive() yes/no 当syslog-ng重启动,选择是否保持连接,只用于unix-stream()。默认是yes
max-connections()数字 同时打开的连接的数目限制,只用于unix-stream()日志消息源驱动器。默认是10。



例3-2.使用unix-stream()和unix-dgram()日志消息源驱动器



source s_stream { unix-stream("/dev/log" max-connections(10)); };
source s_dgram { unix-dgram("/var/run/log"); };



tcp()和udp()

使用这两个日志消息源驱动器,你可以使用TCP或者UDP协议从网络上接受日志消息。

UDP是一种简单的用户数据报协议,使用这种协议可能会发生日志消息的丢失,而且这种协议没有重传机制;TCP是一种面向连接的传输层协议,不会造成日志消息的丢失。

这两种消息源驱动器都不需要位置参数。默认情况下,syslog-ng会绑定到0.0.0.0:514,在所有有效的端口上监听。可以使用localip()参数来限制其接受连接的端口。

注意:514端口是rshell使用的端口,因此如果syslog-log和rshell同时使用,你需要为syslog-ng选择另外的端口。


Declaration:
tcp([options]);
udp([options]);


下面是udp()和tcp()可用的选项:


选项名 数据类型 描述 默认值
ip或者iplocalip 字符串 绑定的IP地址 0.0.0.0


udp()和tcp()使用示例:


source s_tcp { tcp(ip(127.0.0.1) port(1999); max-connections(10); };
source s_udp { udp(); };



file()

通 常,内核会把自己的消息送到一个特殊的文件(BSD系统是/dev/kmsg,Linux系统是/proc/kmsg),因此你需要使用file()日志 消息源驱动器来指定这个文件。在Linux中,klogd会读取内核信息,并转发到syslogd进程,klogd在转发之前会对内核消息进行处理,使用 /boot/System.map文件中的符号名代替原来的地址。如果你不需要这种功能,可以使用-x参数运行klogd。


Declaration:
file(filename);


file()日志消息源驱动器示例:


source s_file { file("/proc/kmsg"); };



pipe()

pipe日志消息源驱动器打开一个命名管道,在这个命名管道监听日志消息。在HP-UX系统中,它用于内部日志消息的获得。


Declaration:
pipe(filename);


注意首先你需要使用mkfifo建立命名管道。

例3-6.使用pipe()日志消息源驱动器


source s_pipe { pipe("/dev/log"); );



sun-streams()

solaris使用STREAMS API把日志消息发送到syslogd进程。你必须在编译syslog-ng时加入这个特征。

新版solaris(>=2.51)中,STREAMS使用一个新的IPC调用门来投递日志消息。syslog-ng支持这种IPC机制。


日志消息目的驱动器

日志目的驱动器把日志消息从syslog-ng输出到其它地方:一个文件或者一个网络套接字。


file()

file是syslog-ng最重要的日志消息目的驱动器之一。使用它,你可以把日志消息定向到一些文件中。

$开头。 在设置日志目的文件时,可以使用宏,从而使用一个简单的file日志消息目的驱动器就可以设置很多目的文件。和PHP/PERL一样,宏也是以

如果文件所在的目录不存在,则由create_dirs()来决定是否创建这个目录。

警 告:由于syslog-ng必须跟踪建立的每个文件,因此会消耗一些内存。如果在60秒钟内(也可以由time_reap选项设置)没有新的消息到达某个 文件,syslog-ng就会关闭这个文件,释放占用的资源。如果目的文件数和所需内存超出日志服务器的的能力,就会造成拒绝服务攻击。

$PROGRAM,因此在不可信的环境中不要使用这个宏。 最危险的宏是

以下是可以用于扩展file的宏:


HOST 日志消息的源发主机名。如果日志消息穿过几个主机,并且chain_hostname()功能已经打开,就使用第一个主机名。
FACILITY 日志消息来自的日志设备
PRIOPRITY/LEVEL 日志消息的优先级
PROGRAM 发送日志消息的程序
YEAR 发送日志消息的年份,这个宏既可以指定日志消息送出的时间,也可以指定日志消息收到的时间。这由use_time_recvd()选项控制
MONTH 发送日志消息的月份
DAY 发送日志消息的日子
HOUR 顾名思义,嘿嘿:)
MIN 同上
SEC 当然是秒了^_^


file()日志消息目的驱动器的选项:


选项 数据类型 描述 默认值
log_file_size() 数字 输出文件的条目数 使用全局设定
sync_freq() 数字 当日志消息达到一定数目就写入文件 使用全局设定
encrypt() yes/no 给日志文件加密 使用全局设定
compress() yes/no 压缩日志文件 使用全局设定
owner() 字符串 指定日志文件的所有者 root
group() 字符串 指定日志文件所有者的组 root
perm() 数字 建立时日志文件的权限掩码 0600
dir_per() 数字 建立目录时的权限掩码 0600
create_dirs() yes/no 如果目录不存在就建立 no



pipe()

syslog-ng通过pipe()日志消息目的驱动器把日志消息发送到/dev/xconsole之类的命名管道。


unix-stream()和unix0dgram()

syslog-ng通过这两个日志消息目的驱动器把日志消息发送到一个SOCK_STREAM或者SOCK_DGRAM模式的UNIX套接字。


udp()和tcp()

使用TCP或者UDP协议把日志消息送到本地网络上或者internet上的另外的主机。


usertty()

syslog-ng使用这个日志消息目的驱动器把日志消息送到一个登录用户使用的终端。


program()

program()驱动器fork出一个进程,使用给定的参数执行一个特定的程序,然后把日志消息送到这个进程的标准输入设备。



4.优化syslog-ng


syslog-ng的默认设置是针对单服务器或者工作站的,而对于一个网络的中央日志主机却远远不够。因此,需要对其进行一些调整和优化。


设置垃圾收集参数

syslog-ng有自己的垃圾收集器,而且一旦进入垃圾收集状态就不再接受日志消息。从而造成非连接的传输协议的信息丢失。因此,需要对syslog-ng的垃圾收集状态进行控制,你可以通过以下两个选项来控制其垃圾收集状态。


gc_idle_threshold()

这 个选项能够设置垃圾收集器在syslog-ng处于空闲状态时的阀值。如果分配的的对象达到这个数字,而且系统处于空闲状态(100msec内没有日志消 息到达),syslog-ng就启动垃圾收集器。此时系统处于空闲状态,因此基本不会造成日志信息的丢失。这个值应该比较小,不过要大于已分配对象的最小 值。已分配对象的最小值取决于你的配置,也可以通过-v命令行参数指定。


gc_busy_threshold()

如果syslog-ng正忙于接受日志消息(日志消息的间隔小于100msec),为了防止其吃掉所有内存,也应该运行垃圾收集器。这个值应该比较高,以便在正常情况下不打断日志消息的接收。



设置输出队列的大小

为了防止发送日志的daemon程序阻塞,syslog-ng一直在读取其向内的日志通道。如果输出队列已满,就可能造成日志消息的丢失。因此,设置输出队列的大小非常重要,你可以设置全局输出队列的大小,也可以为每个日志消息驱动器设置输出队列的大小。


options { log_fifo_size(1000); };


或者


destination d_dmessages { file("/var/log/messages" log_fifo_size(1000); };


输出队列的大小应该合理,这对于大量的日志消息涌来特别重要。如果蜂拥而至的日志信息占据了目标通道的所有带宽,syslog-ng能够把日志消息消息保存到输出队列中,等高峰过去再发出。

当然,syslog-ng不能测试你的网络带宽,因此如果目的主机在一个噪音很大的网络上,而且日志流量超过网络带宽,syslog-ng也无能为力。



设置同步(sync)参数

syslog-ng一般先对日志消息进行缓存。当达到一定的数量,就写入磁盘。注意syslog-ng是对每条日志消息分别使用write()系统调用,而不是成匹写入(why?I can't understand*_*)。

分享到:
评论

相关推荐

    syslog-ng_3.5.6.tar.gz

    syslog-ng是syslog协议的下一代实现,它是一个强大的日志管理和分析工具,尤其在系统监控、故障排查、安全审计等方面有着广泛的应用。syslog-ng_3.5.6.tar.gz这个压缩包文件正是syslog-ng的3.5.6版本源代码,为用户...

    syslog-ng-3.7.3 源码

    syslog-ng是syslog协议的下一代实现,它是一个开源的日志管理系统,用于收集、解析、过滤、存储和转发来自网络中各种设备的日志信息。syslog-ng 3.7.3版本是其发展中的一个重要里程碑,提供了丰富的功能和优化,使得...

    syslog-ng-2.0.10.tar.gz

    syslog-ng是syslog协议的下一代实现,它在传统的syslog基础上进行了扩展和改进,为系统日志管理和分析提供了更为强大的功能。syslog-ng 2.0.10版本是该软件的一个历史版本,虽然可能不如最新版本功能全面,但对于...

    syslog收集:eventlog+syslog-ng+mongodb

    syslog-ng是syslog的下一代版本,它不仅提供了基本的syslog功能,还增加了许多高级特性,如日志重定向、过滤、转换和分发。syslog-ng可以通过自定义配置文件(如`scl.conf`和`modules.conf`)实现复杂的数据收集策略...

    syslog-ng+phpmyadmin+mysqlforcentos.pdf

    syslog-ng是下一代syslog守护进程,它扩展了传统的syslog功能,提供了更强大的日志路由、过滤、转换和存储能力。syslog-ng通过网络接收、处理和转发系统日志,支持多种协议和数据源。在本文中,syslog-ng的安装需要...

    syslog-ng+phpmyadmin+mysqlforcentos.rar

    syslog-ng是下一代syslog守护进程,它扩展了传统的syslog协议,提供了更强大的日志收集、过滤、解析和转发功能。在 CentOS 上安装syslog-ng,可以确保系统日志被正确处理和存储,以便于故障排查和分析。配置syslog-...

    linux+cacti+syslog-ng+snare实现日志集中管理

    3. syslog-ng:syslog-ng是syslog协议的下一代版本,用于收集、过滤、转换和转发系统日志。它可以跨多个主机收集日志,支持多种数据源和目的地,提供强大的日志管理能力。在本方案中,syslog-ng作为日志收集器,将...

    libol-0.3.18.tar.gz

    syslog-ng是syslog协议的下一代实现,它提供了更加强大、灵活的日志管理和分发功能,适用于各种规模的企业环境。在本文中,我们将深入探讨如何利用libol-0.3.18库来搭建和优化syslog-ng服务器,以及libol在这个过程...

    sqlsyslogd.tgz

    SQLSyslogd是这样一款工具,它与syslog-ng和eventlog紧密关联,用于高效地收集、存储和分析系统日志。在本文中,我们将深入探讨SQLSyslogd的核心功能、工作原理以及它如何与syslog-ng和eventlog协同工作,以帮助你更...

    flume-ng-1.6.0-cdh5.10.1.tar.gz的下载

    `flume-ng-1.6.0-cdh5.10.1.tar.gz` 是一个针对Cloudera Distribution Including Apache Hadoop (CDH) 5.10.1 版本优化的Flume NG的打包文件,Flume NG是Flume的下一代版本,提供更先进的特性和性能。 Flume的核心...

    D1-H_Tina_Linux_syslog_使用指南1

    syslog-ng是syslog的下一代版本,提供了更强大的日志转发、过滤和解析功能,支持多种数据源和目的地。 #### 2.4 logrotate logrotate是用于定期执行日志文件轮转的系统服务,配置灵活,可以自动处理日志文件的备份...

    flume-ng-1.6.0-cdh5.16.2.tar.gz

    Flume NG(下一代Flume)引入了更灵活的API和模块化设计,使得扩展和定制更加便捷。 总的来说,Flume作为日志收集框架,其主要优点在于它的易用性、可靠性和可扩展性,使得企业能够有效地管理和分析海量的日志数据...

    深入剖析Linux下的进程(下).pdf

    - **syslog-ng**:下一代syslog守护进程,提供更高级的日志管理和转发功能。 - **mysqld** / **postgresql**:数据库服务器守护进程,支持SQL查询的数据库管理系统。 - **sshd**:Secure Shell Daemon,提供远程...

    Flume1.8安装部署

    1. Flume-Ng:Flume 的下一代版本,提供了更好的性能和可扩展性。 2. Flume-Ng 组件:包括 Agent、Channel、Sink 等组件,每个组件都有其特定的功能和配置项。 六、应用场景 1. 日志收集:使用 Flume 收集各种日志...

    flume-chd版本

    这个文件是Flume-chd的一个具体版本,包含了Flume-ng(下一代Flume)1.5.0,针对CDH5.3.6进行了优化。解压后,用户可以找到Flume的可执行文件、配置文件、库文件等,以便在Linux环境中部署和运行Flume服务。 4. **...

    scoja-开源

    Scoja是一个基于Java实现的开源系统日志收集器,其设计目标是对syslogd(Unix系统中的日志守护进程)和syslog-ng(下一代syslog守护进程)进行多线程重写。该项目旨在提供一个高效、可扩展的日志收集解决方案,特别...

    Apache Hadoop---Flume.docx

    Flume OG 是早期版本,由 agent、collector 和 master 组成,而 Flume NG(下一代)简化了架构,仅包含 Agent 和 Client 组件,代码更简洁,架构更清晰。Flume NG 更加轻量级,适应性强,支持故障切换和负载均衡。 ...

    实战Flume基础

    Flume是一种分布式、高可靠和高...总的来说,Flume作为日志数据采集和传输的工具,具有分布式架构、高可靠性、高可用性、灵活的配置和插件扩展能力等特点,使其非常适合在大规模分布式系统中用于日志数据的管理和分析。

Global site tag (gtag.js) - Google Analytics