syslog-ng客户端,服务器配置

整合syslog-ng
一、syslog-ng配置
二、syslog-ng 介绍
一、syslog-ng配置
syslog-ng客户端配置:
打开配置文件
sudo vi /etc/syslog-ng/syslog-ng.conf
首先,定义一个source,也就是日志来源。来源还有很多种定义方法,自己去研究手册就可以了。
source   my_log { unix-stream("/dev/log"); internal(); };
然后定义一个filter,就是过滤器。因为我只发送用户认证日志。
filter f_auth { facility(auth); };
然后定义一个目的地。就是我要把日志发送到什么地方。我使用的是tcp协议。(192.168.1.100就是我的中央日志服务器,它在25214端口监听。 )
destination center_log_server { tcp("192.168.1.100" port(25214)); }  
然后定义发送命令
log { source(my_log); filter(f_auth); destination(center_log_server); };

syslog-ng服务端配置(也就是我的中央日志服务器配置) :
打开配置文件

sudo vi /etc/syslog-ng/syslog-ng.conf
首先,定义一个来源。就是我要从那里读日志(因为服务器在自己的25214端口监听,所以自然也是从那里读了   )。
source log_from { tcp(ip(192.168.1.100), port(25214)); };
定义一个目的地:
destination remote_log { file("/var/log/remote_log"); };
记录日志命令:
log { source(log_from); destination(remote_log); };
好了,配置文件就写好了。
然后创建一下你要把日志输出到的那个文件:
sudo touch /var/log/remote_log
然后重启客户端和服务端的syslog-ng进程。
sudo /etc/init.d/syslog-ng restart
好了,配置完毕。检验一下配置结果就行了。
可以用python的syslog模块来检验,非常方便的。  

二、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的过滤。另一个设计原则是更容易进行不同防火墙网段的信息转发,它支持主机链,即使日志消息经过了许多计算机的转发,也可以找出原发主机地址和整个转发链。最后的一个设计原则就是尽量使配置文件强大和简洁。

        syslog-ng的配置基于下面的架构:
        LOG STATEMENTS『SOURCES - FILTERS -DESTINATIONS』
        消息路径 『消息源 - 过滤器 - 目的站』   例如:
        log { source(my_log); filter(f_auth); destination(center_log_server); };

        一个消息路径是由一个或者多个日志消息源、一个或者多个过滤规则以及一个或者多个日志消息目的组成的。来自某个日志消息源的消息进入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设备,从其中读取日志消息。

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机制。
例如:
引用
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;
参数需要使用括号括住。

过滤器FILTERS

定义格式为:
引用
filter fliter_name { expression; };
含义:
fliter_name:一个过滤器标识
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(*)是无效的。

目的地DESTINATIONS
定义格式为:
引用
destination d_mesg{ destdriver params; destdriver params;   ...   ;};
含义:
d_mesg:一个目的地的标识
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函数的写法上和消息源驱动器中的定义不同。


除了上述的消息路径定义外,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)。通过设置下面两个选项可以控制:
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就进入垃圾信息收集状态的时间。该值应该比较高,以保证正常情况下不会打断日志消息的收取。
  filter F1; filter F2; ... destination
           D1; destination D2; ... };
把消息源、过滤器、消息目的组合起来就形成一条完整的指令。日志路径中的成员是顺序执行的。凡是来源于指定的消息源,匹配所有指定的过滤器,并送到指定的地址。
  • 0
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值