分类: LINUX
2012-09-07 18:33:55
首先说一下构成配置文件的组成部分:
source driver: 用于接收日志消息的通讯方法。例如,syslog-ng可以通过TCP/IP从远程主机接收日志消息,或者通过读取本地文件接收本地应用程序的日志消息。
source: 经过配置并命名的soruce driver。
destination driver: 用于发送日志消息的通讯方法。例如,syslog-ng可以通过TCP/IP向远程主机发送日志消息,或者将日志消息写入到本地文件或者数据库中。
destinantion: 经过配置并命名的destination driver。
filter: 用于筛选日志消息的表达式。例如,一个filter可以选择从一个指定主机发来的日志消息。
macro: 指向日志消息的一部分的识别器。例如,$HOST宏返回发送日志消息的主机名称。宏经常用于模板和文件名。
parser: 将日志消息使用预先定义的分隔符分成不同列的规则。每一列具有一个可以用于macro的不重复的名字。
rewrite rule: 改变日志消息部分内容的规则。例如,替换字符串或者设定一个值
log paths: source,destination,filter,parser,rewrite rule等对象的组合体。Log path也被称为log statements,log path中可以包含其他log path以组成非常复杂的log path。
template: 是一系列macro的组合,用于重新组织日志消息或者自动生成文件名。例如,一个template可以在每个日志消息前边增加hostname和日期。
option: 设置syslog-ng的全局参数,例如域名解析参数和时区等。
日志源的写法:
source
日志目的写法:
destination
destination-driver(params); destination-driver(params); ... };
过滤器的写法:
filter
log path的写法:
log {
source(s1); source(s2); ...
optional_element(filter1|parser1|rewrite1);
optional_element(filter2|parser2|rewrite2);...
destination(d1); destination(d2); ...
flags(flag1[, flag2...]);
};
以下是可用的source列表:
internal() |
syslog-ng自身产生的日志 |
file() |
打开一个指定文件并从中读取日志消息 |
pipe(),fifo |
打开一个指定的管道并从中读取日志消息 |
program() |
打开一个指定程序,从其标准输出读取日志消息 |
syslog() |
使用ITET标准日志格式监听传入的日志消息 |
tcp(),tcp6() |
使用指定的TCP端口监听传入的日志消息 |
udp(),udp6() |
使用指定的UDP端口监听传入的日志消息 |
unix-dgram() |
使用SOCK_DGRAM模式打开指定的unix socket,监听传入的日志消息 |
unix-stream() |
使用SOCK_STREAM模式打开指定的unix socket监听传入的日志消息 |
以下是可用的destination列表:
file() |
将日志消息写入到指定的文件 |
fifo(), pipe() |
将日志消息写入到指定的pipe |
program() |
调用指定的程序,将日志消息发送到其标准输入 |
sql() |
将日志消息发送到SQL数据库 |
syslog() |
使用ITET标准日志格式将日志消息发送到指定的远程主机 |
tcp(),tcp6() |
将日志消息发送到远程主机的指定TCP端口 |
udp(),udp6() |
将日志消息发送到远程主机的指定UCP端口 |
unix-dgram() |
使用SOCK_DGRAM发送日志消息到指定的unix socket(FreeBSD) |
unix-stream() |
使用SOCK_STREAM发送日志消息到指定的unix socket(Linux) |
usertty() |
发送日志消息到指定用户的终端(需要该用户已经登录) |
以下是可用的filter列表:
facility() |
通过发送日志消息的设备过滤 |
filter() |
调用其他filter来过滤 |
host() |
通过发送日志消息的主机进行过滤 |
level(),priority() |
通过日志消息的优先级过滤 |
match() |
使用正则表达式过滤消息,基于消息的header或内容字段 |
message() |
使用正则表达式过滤消息内容 |
netmask() |
基于发送日志消息的主机的IP地址过滤 |
program() |
基于发送日志消息的应用程序过滤 |
source() |
选择指定的syslog-ng OSE source statement。 |
tags() |
选择具有指定tag的日志消息 |
下边的syslog-ng.conf配置文件,是使用syslog-ng完全模拟syslogd行为的,此配置是syslog-ng源码中自带的,不过想要运行在最新的3.3版本下,需要将原配置中的关键字换成红色字体部分。
#====================================================
#此处新增了版本号,如没有会默认为2.x版本的配置
@version:
3.3
# syslog-ng configuration file.
#
# This should behave pretty much like the original syslog on
RedHat. But
# it could be configured a lot smarter.
#
# See syslog-ng(8) and syslog-ng.conf(5) for more
information.
#
# 20000925 gb@sysfive.com
#
# Updated by Frank Crawford
(
#
- for Red Hat 7.3
#
- totally do away with klogd
#
- add message "kernel" as is done with klogd.
#
# Updated by Frank Crawford
(
#
- use the program_override option as per Balazs Scheidler's
email
#
#原始的配置为
#sync(0);
#long_hostnames (off);
options {
flush_lines
(0);
time_reopen (10);
log_fifo_size (1000);
chain_hostnames
(off);
use_dns (no);
use_fqdn (no);
create_dirs (no);
keep_hostname (yes);
};
#
# At around 1999 some
distributions have changed from using SOCK_STREAM
# to SOCK_DGRAM sockets, see
these posts about the issue:
#
#
http://www.security-express.com/archives/bugtraq/1999-q4/0071.html
#
#
# libc and syslog clients
generally automatically detect the socket type,
# so you are free to decide
which of unix-stream or unix-dgram you want to
use.
#
source s_sys { file
("/proc/kmsg" program_override("kernel")); unix-stream
("/dev/log"); internal(); };
destination d_cons {
file("/dev/console"); };
destination d_mesg {
file("/var/log/messages"); };
destination d_auth {
file("/var/log/secure"); };
destination d_mail {
file("/var/log/maillog"); };
destination d_spol {
file("/var/log/spooler"); };
destination d_boot {
file("/var/log/boot.log"); };
destination d_cron {
file("/var/log/cron"); };
destination d_mlal {
usertty("*"); };
filter
f_filter1
{ facility(kern); };
filter
f_filter2
{ level(info) and
not (facility(mail)
or facility(authpriv) or facility(cron)); };
filter
f_filter3
{ facility(authpriv); };
filter
f_filter4
{ facility(mail); };
filter
f_filter5
{ level(emerg); };
filter
f_filter6
{ facility(uucp) or
(facility(news) and level(crit)); };
filter
f_filter7
{ facility(local7); };
filter
f_filter8
{ facility(cron); };
#log { source(s_sys);
filter(f_filter1); destination(d_cons); };
log { source(s_sys);
filter(f_filter2); destination(d_mesg); };
log { source(s_sys);
filter(f_filter3); destination(d_auth); };
log { source(s_sys);
filter(f_filter4); destination(d_mail); };
log { source(s_sys);
filter(f_filter5); destination(d_mlal); };
log { source(s_sys);
filter(f_filter6); destination(d_spol); };
log { source(s_sys);
filter(f_filter7); destination(d_boot); };
log { source(s_sys);
filter(f_filter8); destination(d_cron); };
#====================================================
下边是一个示例的典型集中存储日志的配置文件,是在上一个本地配置的基础上稍有修改。
粗体加重部分是关于网络配置部分。
服务器端配置文件
#sample syslog-ng.conf for a
central logging server
options {
flush_lines
(0);
time_reopen
(10);
log_fifo_size (2048);
create_dirs
(yes);
chain_hostnames (off);
use_dns
(no);
use_fqdn
(no);
keep_hostname (yes);
perm
(0640);
dir_perm
(0750);
};
source s_local { internal();
unix-stream("/dev/log"); file("/proc/kmsg"
program_override("kernel: ")); };
source
s_remote { tcp(); };
destination d_local_cons {
file("/dev/console"); };
destination d_local_mesg {
file("/var/log/messages"); };
destination d_local_auth {
file("/var/log/secure"); };
destination d_local_mail {
file("/var/log/maillog"); };
destination d_local_spol {
file("/var/log/spooler"); };
destination d_local_boot {
file("/var/log/boot.log"); };
destination d_local_cron {
file("/var/log/cron"); };
destination d_local_mlal {
usertty("*"); };
destination
d_remote_clients { file("/var/log/HOSTS/$HOST");
};
filter
f_filter1
{ facility(kern); };
filter
f_filter2
{ level(info) and
not (facility(mail)
or facility(authpriv) or facility(cron)); };
filter
f_filter3
{ facility(authpriv); };
filter
f_filter4
{ facility(mail); };
filter
f_filter5
{ level(emerg); };
filter
f_filter6
{ facility(uucp) or
(facility(news) and level(crit)); };
filter
f_filter7
{ facility(local7); };
filter
f_filter8
{ facility(cron); };
#log { source(s_local);
filter(f_filter1); destination(d_local_cons); };
log { source(s_local);
filter(f_filter2); destination(d_local_mesg); };
log { source(s_local);
filter(f_filter3); destination(d_local_auth); };
log { source(s_local);
filter(f_filter4); destination(d_local_mail); };
log { source(s_local);
filter(f_filter5); destination(d_local_mlal); };
log { source(s_local);
filter(f_filter6); destination(d_local_spol); };
log { source(s_local);
filter(f_filter7); destination(d_local_boot); };
log { source(s_local);
filter(f_filter8); destination(d_local_cron); };
log {
source(s_remote); destination(d_remote_clients);
};
客户端配置
#sample
syslog-ng.conf for a remote client
source s_local {
internal(); unix-stream("/dev/log"); file("/proc/kmsg"
program_override("kernel: ")); };
destination d_local_cons {
file("/dev/console"); };
destination d_local_mesg {
file("/var/log/messages"); };
destination d_local_auth {
file("/var/log/secure"); };
destination d_local_mail {
file("/var/log/maillog"); };
destination d_local_spol {
file("/var/log/spooler"); };
destination d_local_boot {
file("/var/log/boot.log"); };
destination d_local_cron {
file("/var/log/cron"); };
destination d_local_mlal {
usertty("*"); };
destination
d_remote_loghost {tcp("192.168.1.10" port(514));};
filter
f_filter1
{ facility(kern); };
filter
f_filter2
{ level(info) and
not (facility(mail)
or facility(authpriv) or facility(cron)); };
filter
f_filter3
{ facility(authpriv); };
filter
f_filter4
{ facility(mail); };
filter
f_filter5
{ level(emerg); };
filter
f_filter6
{ facility(uucp) or
(facility(news) and level(crit)); };
filter
f_filter7
{ facility(local7); };
filter
f_filter8
{ facility(cron); };
#log { source(s_local);
filter(f_filter1); destination(d_local_cons); };
log { source(s_local);
filter(f_filter2); destination(d_local_mesg); };
log { source(s_local);
filter(f_filter3); destination(d_local_auth); };
log { source(s_local);
filter(f_filter4); destination(d_local_mail); };
log { source(s_local);
filter(f_filter5); destination(d_local_mlal); };
log { source(s_local);
filter(f_filter6); destination(d_local_spol); };
log { source(s_local);
filter(f_filter7); destination(d_local_boot); };
log { source(s_local);
filter(f_filter8); destination(d_local_cron); };
log {
source(s_local); destination(d_remote_loghost); };
如何测试
使用logger命令,写一条测试的日志消息,然后查看本地和远程syslog-ng server上是否有相应记录,如果有,则说明配置成功。
[root@localhost ~]# logger -p cron.err "I am a test log message"
如果正常本地/var/log/cron和远程syslog-ng server上的日志文件都应该有类似如下的记录;
Mar 26 16:30:35 localhost.localhost root: I am a test log message