syslog-ng 的主配置文件存放在: /etc/syslog-ng/syslog-ng.conf
系统自带版本:
引用
# rpm -qa|grep syslog-ng
syslog-ng-1.6.7-1
syslog官方网站:
最新版本是2.0.5。
为方便使用,暂以系统自带的版本1.6.7说明,以后再提供更新的
rpm包。
1、前提
使用syslog-ng前,建议先详细了解
syslog的概念。
例如,什么是facility(设备),level(等级)。可以参考这里:
否则,后面的说明可能会有点不知所云的。
2、使用
若不增加其他设定,可通过下面的简单命令即可替换原
syslog服务:
# service syslog stop
# service syslog-ng start
3、设计原则
syslog-ng替代
syslog是基于以下的设计原则的:
引用
c、支持强大的自定义配置,并且清晰、明了。
1
、架构
syslog-ng 的配置基于下面的架构:
引用
LOG STATEMENTS 『 SOURCES - FILTERS - DESTINATIONS 』
消息路径『消息源-过滤器-目的站』
也就是说,通过定义多个消息源,把匹配上若干个过滤器的消息导向到指定的目的地,从而组成一个消息路径。
2 、消息源SOURCES
定义格式为:
引用
source
{ sourcedriverparams; sourcedriverparams; ... };
含义:
引用
:一个消息源的标识
sourcedriver :消息源驱动器,可以支持若干参数,并使用分号 “ ; ” 隔离多个消息源驱动器
消息源驱动器有:
引用
file (filename) :从指定的文件读取日志信息
unix-dgram (filename) :打开指定的 SOCK_DGRAM 模式的 unix 套接字,接收日志消息
unix-stream (filename) :打开指定的 SOCK_STREAM 模式的 unix 套接字,接收日志消息
udp ( (ip),(port) ) :在指定的 UDP 端口接收日志消息
tcp ( (ip),(port) ) :在指定的 TCP 端口接收日志消息
sun-streams (filename) :在 solaris 系统中,打开一个(多个)指定的 STREAM 设备,从其中读取日志消息
internal() : syslog-ng 内部产生的消息
pipe(filename),fifo(filename) :从指定的管道或者 FIFO 设备,读取日志信息
例如:
引用
source s_sys {
file ("/proc/kmsg" log_prefix("kernel: "));
unix-stream ("/dev/log");
internal();
# udp(ip(0.0.0.0) port(514)); # 如果取消注释,则可以从 udp 的 514 端口获取消息
};
※linux 使用/dev/log 作为SOCK_STREAM unix 的套接字,BSD 使用/var/run/log ;
参数需要使用括号括住。
3 、过滤器 FILTERS
定义格式为:
引用
filter
{ expression; };
含义:
引用
:一个过滤器标识
expression :表达式
表达式支持:
引用
逻辑操作符: and (和)、 or (或)、 not (非);
函数:可使用正规表达式描述内容
过滤函数有:
引用
facility(,) :根据 facility (设备)选择日志消息,使用逗号分割多个 facility
level(,) :根据 level (优先级)选择日志消息,使用逗号分割多个 level ,或使用 “..” 表示一个范围
program(regexp) :日志消息的程序名是否匹配一个正则表达式
host(regexp) :日志消息的主机名是否和一个正则表达式匹配
match(regexp) :对日志消息的内容进行正则匹配
filter() :调用另一条过滤规则并判断它的值
例如:
引用
filter f_filter2 { level(info..emerg) and
not facility(mail,authpriv,cron); };
※ 这里的level 定义info ,相当于syslog 的.=info ,并不包括更低的等级;
若需要包括更低的等级,请使用“..” 表示一个等级范围;
另外,filter(DEFAULT) ,用于捕获所有没有匹配上的日志消息。filter(*) 是无效的。
4 、目的地DESTINATIONS
定义格式为:
引用
destination
{ destdriverparams; destdriverparams; ... ;};
含义:
引用
:一个目的地的标识
destdriver :目的地驱动器
目的地驱动器有:
引用
file (filename) :把日志消息写入指定的文件
unix-dgram (filename) :把日志消息写入指定的 SOCK_DGRAM 模式的 unix 套接字
unix-stream (filename) :把日志消息写入指定的 SOCK_STREAM 模式的 unix 套接字
udp (ip),(port) :把日志消息发送到指定的 UDP 端口
tcp (ip),(port) :把日志消息发送到指定的 TCP 端口
usertty(username) :把日志消息发送到已经登陆的指定用户终端窗口
pipe(filename),fifo(filename) :把日志消息发送到指定的管道或者 FIFO 设备
program(parm) :启动指定的程序,并把日志消息发送到该进程的标准输入
举例:
引用
destination d_mesg { file("/var/log/messages"); };
destination d_syslog { udp ("192.168.228.225" port(514)); };
※ 配合使用udp 或tcp 即可实现集中的日志服务器。注意,udp 函数的写法上和消息源驱动器中的定义不同。
5 、消息路径LOG STATEMENTS
定义格式为:
引用
log { source S1; source S2; ... filter F1; filter F2; ... destination
D1; destination D2; ... };
把消息源、过滤器、消息目的组合起来就形成一条完整的指令。日志路径中的成员是顺序执行的。凡是来源于指定的消息源,匹配所有指定的过滤器,并送到指定的地址。
※ 同样的,每条日志消息都会经过所有的消息路径,并不是匹配后就不再往下执行的,请留意。
三、选项参数
除了上述的消息路径定义外, syslog-ng 还可以设定一些选项参数以优化其操作。
全局的选项参数,定义在配置文件的开头位置:
六、参考资料
man syslog-ng.conf
man 8 syslog-ng
引用
options { opt1; opt2; ... };
选项有:
引用
chain_hostnames(yes|no) :是否打开主机名链功能,打开后可在多网络段转发日志时有效
long_hostnames(yes|no) :是 chain_hostnames 的别名,已不建议使用
keep_hostname(yes|no) :是否保留日志消息中保存的主机名称,否时,总是使用来源主机来作重写日志的主机名
use_dns(yes|no) :是否打开 DNS 查询功能,应使用防火墙保护使用 syslog-ng 的节点安全,并确认所有主机都是可以通过 dns 解释的,否则请关闭该选项。
use_fqdn(yes|no) :是否使用完整的域名
check_hostname(yes|no) :是否检查主机名有没有包含不合法的字符
bad_hostname(regexp) :可通过正规表达式指定某主机的信息不被接受
dns_cache(yes|no) :是否打开 DNS 缓存功能
dns_cache_expire(n) : DNS 缓存功能打开时,一个成功缓存的过期时间
dns_cache_expire_failed(n) : DNS 缓存功能打开时,一个失败缓存的过期时间
dns_cache_size(n) : DNS 缓存保留的主机名数量
create_dirs(yes|no) :当指定的目标目录不存在时,是否创建该目录
dir_owner(uid) :目录的 UID
dir_group(gid) :目录的 GID
dir_perm(perm) :目录的权限,使用八进制方式标注,例如 0644
owner(uid) :文件的 UID
group(gid) :文件的 GID
perm(perm) :文件的权限,同样,使用八进制方式标注
gc_busy_threshold(n) :当 syslog-ng 忙时,其进入垃圾信息收集状态的时间。一旦分派的对象达到这个数字, syslog-ng 就启动垃圾信息收集状态。默认值是: 3000 。
gc_idle_threshold(n) :当 syslog-ng 空闲时,其进入垃圾信息收集状态的时间。一旦被分派的对象到达这个数字, syslog-ng 就会启动垃圾信息收集状态,默认值是: 100
log_fifo_size(n) :输出队列的行数
log_msg_size(n) :消息日志的最大值( bytes )
mark(n) :多少时间(秒)写入两行 MARK 信息供参考,目前没有实现
stats(n) :多少时间(秒)写入两行 STATUS 信息供,默认值是: 600
sync(n) :缓存多少行的信息再写入文件中, 0 为不缓存,局部参数可以覆盖该值。
time_reap(n) :在没有消息前,到达多少秒,即关闭该文件的连接
time_reopen(n) :对于死连接,到达多少秒,会重新连接
use_time_recvd(yes|no) :宏产生的时间是使用接受到的时间,还是日志中记录的时间;建议使用 R_ 的宏代替接收时间, S_ 的宏代替日志记录的时间,而不要依靠该值定义。
例如:
引用
options {
sync (0);
time_reopen (10);
log_fifo_size (1000);
long_hostnames (off);
use_dns (no);
use_fqdn (no);
create_dirs (no);
keep_hostname (yes);
};
四、部分函数的参数
syslog-ng 除了有全局选项参数外,不同的函数还可以定义其参数,其中包括:
1 、扩展 file 的宏
引用
HOST 日志消息的源发主机名。如果日志消息穿过几个主机,并且 chain_hostname ()功能已经打开,就使用第一个主机名。
FACILITY :日志消息来自的日志设备
PRIOPRITY/LEVEL :日志消息的优先级
PROGRAM :发送日志消息的程序
YEAR :发送日志消息的年份,这个宏既可以指定日志消息送出的时间,也可以指定日志消息收到的时间。 这由 use_time_recvd ()选项控制
MONTH :发送日志消息的月份
DAY :发送日志消息的日子
HOUR :小时
MIN :分钟
SEC :秒
2 、 file 的参数
例如: log_file_size ()、 sync ()、 owner ()、 perm ()等,请参考上面的全局设定
3 、tcp 和upd 的参数
引用
ip ( xxx.xxx.xxx.xxx ):定义绑定的 IP 地址
port ( n ):定义绑定的端口
max-connections ( n ):定义最大连接数
※TCP 基于连接方式传输,不会造成日志丢失,而UDP 则不同。但因为传统的syslog 基于UDP 的514 端口,所以,UDP 方式也经常会使用到。
另外,514 也是rshell 的默认端口,请注意冲突。
举例:
引用
destination d_mail { file("/var/log/maillog" sync(10)); };
这里定义的 sync(10) 会覆盖全局配置,表示若写入的日志数量达到 10 ,才写入 maillog 文件。
五、关于垃圾收集状态
当满足一定的条件, syslog-ng 即会进入垃圾收集状态,而暂时不再接受日志信息。这时,会造成非连接的传输协议的日志丢失(例如 UDP )。通过设置下面两个
syslog-ng 的配置基于下面的架构:
引用
LOG STATEMENTS 『 SOURCES - FILTERS - DESTINATIONS 』
消息路径『消息源-过滤器-目的站』
也就是说,通过定义多个消息源,把匹配上若干个过滤器的消息导向到指定的目的地,从而组成一个消息路径。
2 、消息源SOURCES
定义格式为:
引用
source
引用
sourcedriver :消息源驱动器,可以支持若干参数,并使用分号 “ ; ” 隔离多个消息源驱动器
消息源驱动器有:
引用
file (filename) :从指定的文件读取日志信息
unix-dgram (filename) :打开指定的 SOCK_DGRAM 模式的 unix 套接字,接收日志消息
unix-stream (filename) :打开指定的 SOCK_STREAM 模式的 unix 套接字,接收日志消息
udp ( (ip),(port) ) :在指定的 UDP 端口接收日志消息
tcp ( (ip),(port) ) :在指定的 TCP 端口接收日志消息
sun-streams (filename) :在 solaris 系统中,打开一个(多个)指定的 STREAM 设备,从其中读取日志消息
internal() : syslog-ng 内部产生的消息
pipe(filename),fifo(filename) :从指定的管道或者 FIFO 设备,读取日志信息
例如:
引用
source s_sys {
file ("/proc/kmsg" log_prefix("kernel: "));
unix-stream ("/dev/log");
internal();
# udp(ip(0.0.0.0) port(514)); # 如果取消注释,则可以从 udp 的 514 端口获取消息
};
※linux 使用/dev/log 作为SOCK_STREAM unix 的套接字,BSD 使用/var/run/log ;
参数需要使用括号括住。
3 、过滤器 FILTERS
定义格式为:
引用
filter
引用
expression :表达式
表达式支持:
引用
逻辑操作符: and (和)、 or (或)、 not (非);
函数:可使用正规表达式描述内容
过滤函数有:
引用
facility(,) :根据 facility (设备)选择日志消息,使用逗号分割多个 facility
level(,) :根据 level (优先级)选择日志消息,使用逗号分割多个 level ,或使用 “..” 表示一个范围
program(regexp) :日志消息的程序名是否匹配一个正则表达式
host(regexp) :日志消息的主机名是否和一个正则表达式匹配
match(regexp) :对日志消息的内容进行正则匹配
filter() :调用另一条过滤规则并判断它的值
例如:
引用
filter f_filter2 { level(info..emerg) and
not facility(mail,authpriv,cron); };
※ 这里的level 定义info ,相当于syslog 的.=info ,并不包括更低的等级;
若需要包括更低的等级,请使用“..” 表示一个等级范围;
另外,filter(DEFAULT) ,用于捕获所有没有匹配上的日志消息。filter(*) 是无效的。
4 、目的地DESTINATIONS
定义格式为:
引用
destination
引用
destdriver :目的地驱动器
目的地驱动器有:
引用
file (filename) :把日志消息写入指定的文件
unix-dgram (filename) :把日志消息写入指定的 SOCK_DGRAM 模式的 unix 套接字
unix-stream (filename) :把日志消息写入指定的 SOCK_STREAM 模式的 unix 套接字
udp (ip),(port) :把日志消息发送到指定的 UDP 端口
tcp (ip),(port) :把日志消息发送到指定的 TCP 端口
usertty(username) :把日志消息发送到已经登陆的指定用户终端窗口
pipe(filename),fifo(filename) :把日志消息发送到指定的管道或者 FIFO 设备
program(parm) :启动指定的程序,并把日志消息发送到该进程的标准输入
举例:
引用
destination d_mesg { file("/var/log/messages"); };
destination d_syslog { udp ("192.168.228.225" port(514)); };
※ 配合使用udp 或tcp 即可实现集中的日志服务器。注意,udp 函数的写法上和消息源驱动器中的定义不同。
5 、消息路径LOG STATEMENTS
定义格式为:
引用
log { source S1; source S2; ... filter F1; filter F2; ... destination
D1; destination D2; ... };
把消息源、过滤器、消息目的组合起来就形成一条完整的指令。日志路径中的成员是顺序执行的。凡是来源于指定的消息源,匹配所有指定的过滤器,并送到指定的地址。
※ 同样的,每条日志消息都会经过所有的消息路径,并不是匹配后就不再往下执行的,请留意。
三、选项参数
除了上述的消息路径定义外, syslog-ng 还可以设定一些选项参数以优化其操作。
全局的选项参数,定义在配置文件的开头位置:
六、参考资料
man syslog-ng.conf
man 8 syslog-ng
引用
options { opt1; opt2; ... };
选项有:
引用
chain_hostnames(yes|no) :是否打开主机名链功能,打开后可在多网络段转发日志时有效
long_hostnames(yes|no) :是 chain_hostnames 的别名,已不建议使用
keep_hostname(yes|no) :是否保留日志消息中保存的主机名称,否时,总是使用来源主机来作重写日志的主机名
use_dns(yes|no) :是否打开 DNS 查询功能,应使用防火墙保护使用 syslog-ng 的节点安全,并确认所有主机都是可以通过 dns 解释的,否则请关闭该选项。
use_fqdn(yes|no) :是否使用完整的域名
check_hostname(yes|no) :是否检查主机名有没有包含不合法的字符
bad_hostname(regexp) :可通过正规表达式指定某主机的信息不被接受
dns_cache(yes|no) :是否打开 DNS 缓存功能
dns_cache_expire(n) : DNS 缓存功能打开时,一个成功缓存的过期时间
dns_cache_expire_failed(n) : DNS 缓存功能打开时,一个失败缓存的过期时间
dns_cache_size(n) : DNS 缓存保留的主机名数量
create_dirs(yes|no) :当指定的目标目录不存在时,是否创建该目录
dir_owner(uid) :目录的 UID
dir_group(gid) :目录的 GID
dir_perm(perm) :目录的权限,使用八进制方式标注,例如 0644
owner(uid) :文件的 UID
group(gid) :文件的 GID
perm(perm) :文件的权限,同样,使用八进制方式标注
gc_busy_threshold(n) :当 syslog-ng 忙时,其进入垃圾信息收集状态的时间。一旦分派的对象达到这个数字, syslog-ng 就启动垃圾信息收集状态。默认值是: 3000 。
gc_idle_threshold(n) :当 syslog-ng 空闲时,其进入垃圾信息收集状态的时间。一旦被分派的对象到达这个数字, syslog-ng 就会启动垃圾信息收集状态,默认值是: 100
log_fifo_size(n) :输出队列的行数
log_msg_size(n) :消息日志的最大值( bytes )
mark(n) :多少时间(秒)写入两行 MARK 信息供参考,目前没有实现
stats(n) :多少时间(秒)写入两行 STATUS 信息供,默认值是: 600
sync(n) :缓存多少行的信息再写入文件中, 0 为不缓存,局部参数可以覆盖该值。
time_reap(n) :在没有消息前,到达多少秒,即关闭该文件的连接
time_reopen(n) :对于死连接,到达多少秒,会重新连接
use_time_recvd(yes|no) :宏产生的时间是使用接受到的时间,还是日志中记录的时间;建议使用 R_ 的宏代替接收时间, S_ 的宏代替日志记录的时间,而不要依靠该值定义。
例如:
引用
options {
sync (0);
time_reopen (10);
log_fifo_size (1000);
long_hostnames (off);
use_dns (no);
use_fqdn (no);
create_dirs (no);
keep_hostname (yes);
};
四、部分函数的参数
syslog-ng 除了有全局选项参数外,不同的函数还可以定义其参数,其中包括:
1 、扩展 file 的宏
引用
HOST 日志消息的源发主机名。如果日志消息穿过几个主机,并且 chain_hostname ()功能已经打开,就使用第一个主机名。
FACILITY :日志消息来自的日志设备
PRIOPRITY/LEVEL :日志消息的优先级
PROGRAM :发送日志消息的程序
YEAR :发送日志消息的年份,这个宏既可以指定日志消息送出的时间,也可以指定日志消息收到的时间。 这由 use_time_recvd ()选项控制
MONTH :发送日志消息的月份
DAY :发送日志消息的日子
HOUR :小时
MIN :分钟
SEC :秒
2 、 file 的参数
例如: log_file_size ()、 sync ()、 owner ()、 perm ()等,请参考上面的全局设定
3 、tcp 和upd 的参数
引用
ip ( xxx.xxx.xxx.xxx ):定义绑定的 IP 地址
port ( n ):定义绑定的端口
max-connections ( n ):定义最大连接数
※TCP 基于连接方式传输,不会造成日志丢失,而UDP 则不同。但因为传统的syslog 基于UDP 的514 端口,所以,UDP 方式也经常会使用到。
另外,514 也是rshell 的默认端口,请注意冲突。
举例:
引用
destination d_mail { file("/var/log/maillog" sync(10)); };
这里定义的 sync(10) 会覆盖全局配置,表示若写入的日志数量达到 10 ,才写入 maillog 文件。
五、关于垃圾收集状态
当满足一定的条件, syslog-ng 即会进入垃圾收集状态,而暂时不再接受日志信息。这时,会造成非连接的传输协议的日志丢失(例如 UDP )。通过设置下面两个
syslog-ng是什么?
syslog-ng作为syslog的替代工具,可以完全替代syslog的服务,并且通过定义规则,实现更好的过滤功能。
选项可以控制:
引用
gc_idle_threshold(n) :
意思是,一旦被分派的对象到达这个数字,并且当 syslog-ng 空闲时( 100 微秒内没有日志消息到达)。此时, syslog-ng 就会启动垃圾信息收集状态。
已分配的对象可通过 -v 命令行参数指定其的最小值。而 syslog-ng 这个值应该比较小,但比已分配的对象要大即可。
例如,空闲状态, syslog-ng 会显示:
引用
Nov 13 16:35:35 syslogng syslog-ng[4510]: STATS: dropped 0
Nov 13 16:45:35 syslogng syslog-ng[4510]: STATS: dropped 0
当忙时:
引用
gc_busy_threshold(n) :当 syslog-ng 忙时,一旦分派的对象达到这个数字, syslog-ng 就进入垃圾信息收集状态的时间。该值应该比较高,以保证正常情况下不会打断日志消息的收取。
引用
gc_idle_threshold(n) :
意思是,一旦被分派的对象到达这个数字,并且当 syslog-ng 空闲时( 100 微秒内没有日志消息到达)。此时, syslog-ng 就会启动垃圾信息收集状态。
已分配的对象可通过 -v 命令行参数指定其的最小值。而 syslog-ng 这个值应该比较小,但比已分配的对象要大即可。
例如,空闲状态, syslog-ng 会显示:
引用
Nov 13 16:35:35 syslogng syslog-ng[4510]: STATS: dropped 0
Nov 13 16:45:35 syslogng syslog-ng[4510]: STATS: dropped 0
当忙时:
引用
gc_busy_threshold(n) :当 syslog-ng 忙时,一旦分派的对象达到这个数字, syslog-ng 就进入垃圾信息收集状态的时间。该值应该比较高,以保证正常情况下不会打断日志消息的收取。