一、syslog-ng简介

1、syslog-ng功能

11年的时候用syslog-ngpwgen配合作过一个自动修改密码,并将生成的密码通过sendEmail 程序发送到指定邮箱的应用 ,不过总的步骤并未在blog中记录。今天又有网络的同事,想让我一起搞个日志服务器,主要用于记录所有网络设备的日志信息,并匹配某些关键字进行告警。在进行实际的操作之前,我们先来了解下 syslog-ng软件 。

Syslog-ng是由Balabit IT Security Ltd.维护的一套开源的Unix和类Unix系统的日志服务套件。它是一个灵活的、可伸缩的系统日志记录程序。对于服务器日志集中收集,使用它是一个不错的解决方案。Syslog-ng主要特性有:

  • 支持SSL/TSL协议
  • 支持将日志写入数据库中,支持的数据库有MySQL, Microsoft SQL (MSSQL),Oracle, PostgreSQL, and SQLite.
  • 支持标准的syslog协议
  • 支持filter、parse以及rewrite
  • 支持更多的平台
  • 更高的负载能力

2、syslog-ng原理及模式

其工作原理见下图:

syslog-ng procedure
syslog-ng procedure

syslog-ng模式有三种:客户端模式、服务端模式、中继模式。

客户端模式(client mode)如下图:

client-mode
client-mode

服务端模式(server mode):

server-mode
server-mode

中继模式(Relay mode):

relay-mode
relay-mode

二、安装

在SUSE系统下默认源里就有syslog-ng,在centos/redhat下需要通过epel 源或源码安装 。这里安装步骤就略过。其相关包如下:

1# yum list|grep syslog-ng
2syslog-ng.x86_64                            3.2.5-4.el6                  @epel
3syslog-ng-devel.x86_64                      3.2.5-4.el6                  @epel
4syslog-ng-libdbi.x86_64                     3.2.5-4.el6                  @epel
5syslog-ng.i686                              3.2.5-4.el6                  epel
6syslog-ng-devel.i686                        3.2.5-4.el6                  epel

libdbi包为日志导入数据库所需要的包 。

在centos平台下还需要将默认的rsyslog服务替换为 syslog-ng,步骤如下:

1chkconfig rsyslog off
2service rsyslog stop
3chkconfig syslog-ng on
4service syslog-ng start

三、配置

其配置示例如下:

 1@version:3.2
 2# 全局配置
 3options {
 4        flush_lines (0);
 5        time_reopen (10);
 6        log_fifo_size (1000);
 7        long_hostnames (off);
 8        use_dns (no);
 9        use_fqdn (no);
10        create_dirs (no);
11        keep_hostname (yes);
12};
13# 本地源配置
14source s_sys {
15        file ("/proc/kmsg" program_override("kernel: "));
16        unix-stream ("/dev/log");
17        internal();
18        #udp(ip(0.0.0.0) port(514));
19};
20#远程源配置
21source s_remote {
22         tcp(ip(0.0.0.0) port(514));
23         udp(ip(0.0.0.0) port(514));
24};
25# 目的存放配置
26destination d_cons { file("/dev/console"); };
27destination d_mesg { file("/var/log/messages"); };
28destination d_auth { file("/var/log/secure"); };
29destination d_mail { file("/var/log/maillog" flush_lines(10)); };
30destination d_spol { file("/var/log/spooler"); };
31destination d_boot { file("/var/log/boot.log"); };
32destination d_cron { file("/var/log/cron"); };
33destination d_kern { file("/var/log/kern"); };
34destination d_mlal { usertty("*"); };
35#destination d_remote_clients { file("/opt/logs/${R_YEAR}/${R_MONTH}/${R_DAY}/$HOST"  create_dirs(yes)) ; };
36destination d_remote_clients { file("/opt/logs/${YEAR}/${MONTH}/${DAY}/$HOST"  create_dirs(yes)) ; };
37# 过滤器
38filter f_kernel     { facility(kern); };
39filter f_default    { level(info..emerg) and
40                        not (facility(mail)
41                        or facility(authpriv)
42                        or facility(cron)); };
43filter f_auth       { facility(authpriv); };
44filter f_mail       { facility(mail); };
45filter f_emergency  { level(emerg); };
46filter f_news       { facility(uucp) or
47                        (facility(news)
48                        and level(crit..emerg)); };
49filter f_boot   { facility(local7); };
50filter f_cron   { facility(cron); };
51# 调用上面的配置,并存盘
52#log { source(s_sys); filter(f_kernel); destination(d_cons); };
53log { source(s_sys); filter(f_kernel); destination(d_kern); };
54log { source(s_sys); filter(f_default); destination(d_mesg); };
55log { source(s_sys); filter(f_auth); destination(d_auth); };
56log { source(s_sys); filter(f_mail); destination(d_mail); };
57log { source(s_sys); filter(f_emergency); destination(d_mlal); };
58log { source(s_sys); filter(f_news); destination(d_spol); };
59log { source(s_sys); filter(f_boot); destination(d_boot); };
60log { source(s_sys); filter(f_cron); destination(d_cron); };
61log { source(s_remote); destination(d_remote_clients); };

全局配置:

options { opt1; opt2; … };
chain_hostnames(yes|no) # 是否打开主机名链功能,打开后可在多网络段转发日志时有效
long_hostnames(yes|no) # 是chain_hostnames的别名,已不建议使用
keep_hostname(yes|no) # 是否保留日志消息中保存的主机名称
use_dns(yes|no) # 是否打开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_的宏代替日志记录的时间,而不要依靠该值定义。

消息源:

source {sourcedriver params; sourcedriver params; … };
internal() # syslog-ng内部产生的消息
file() # 从指定的文件读取日志信息
pipe() # 从指定的管道,读取日志信息
fifo() # 从指定的FIFO设备,读取日志信息
program() # 打开指定的应用程序,从它的标准输出读取消息
sun-stream(), sun-streams() # 在solaris系统中,打开一个(多个)指定的STREAM设备,从其中读取日志消息
tcp(), tcp6() # 在指定的TCP端口接收日志消息
udp(), udp6() # 在指定的UDP端口接收日志消息
unix-dgram() # 打开指定的SOCK_DGRAM模式的unix套接字,接收日志消息
unix-stream() # 打开指定的SOCK_STREAM模式的unix套接字,接收日志消息

过滤器:

  • filter {expression; };
  • facility() # 根据facility(设备)选择日志消息
  • filter() # 调用另一条过滤规则
  • host() # 日志消息的主机名是否和一个正则表达式匹配
  • level() or priority() # 根据level(优先级)选择日志消息
  • match() # 对日志消息的内容进行正则匹配

消息目的地:

  • destination {destdriver params; destdriver params; … ; };
  • file() # 把日志消息写入指定的文件
  • pipe() # 把日志消息发送到指定的管道
  • fifo() # 把日志消息发送到指定的FIFO设备
  • program() # 启动指定的程序,并把日志消息发送到该进程的标准输入
  • sql() # 把日志消息写入数据库,适用于3.x版本及更高版本的syslog-ng
  • tcp() and tcp6() # 把日志消息发送到指定的TCP端口
  • udp() and udp6() # 把日志消息发送到指定的UDP端口
  • unix-dgram() # 把日志消息写入指定的SOCK_DGRAM模式的unix套接字
  • unix-stream() # 把日志消息写入指定的SOCK_STREAM模式的unix套接字
  • usertty() # 把日志消息发送到已经登陆的指定用户终端窗口

消息路径:

1log { source S1; source S2; ...filter F1; filter F2; ... destination D1; destination D2; ... };

四、C/S模式及消息入库

1、c/s模式

服务端只需要指定监听器,接后过来后,过滤器和目的地可以自定义处理 ,监听可以是tcp的,也可以是udp的。如下:

1source s_remote {
2         tcp(ip(0.0.0.0) port(514));
3         udp(ip(0.0.0.0) port(514));
4};

客户端需要指定义一个目的地址,客户端的类型比较多,比如syslog、 rsyslog、syslog-ng,具体如下:

 1# rsyslog配置方法
 2*.* @10.212.186.250
 3# syslog-ng配置方法
 4source s_sys {
 5file ("/proc/kmsg"log_prefix("kernel: "));
 6unix-stream ("/dev/log");
 7internal();
 8};
 9destination d_mesg {udp(ip(0.0.0.0) port(514));};
10log { source(s_sys);destination(d_mesg); };

2、日志入库

 1# 创建需要的库
 2CREATE DATABASE syslog;
 3USE syslog;
 4CREATE TABLE logs (
 5host varchar(32) default NULL,
 6facility varchar(10) defaultNULL,
 7priority varchar(10) defaultNULL,
 8level varchar(10) default NULL,
 9tag varchar(10) default NULL,
10date date default NULL,
11time time default NULL,
12program varchar(15) default NULL,
13msg text,
14seq int(10) unsigned NOT NULLauto_increment,
15PRIMARY KEY (seq),
16KEY host (host),
17KEY seq (seq),
18KEY program (program),
19KEY time (time),
20KEY date (date),
21KEY priority (priority),
22KEY facility (facility)
23) TYPE=MyISAM;
24# 创建管道文件
25mkfifo /tmp/mysql.pipe
26# 配置 syslog-ng.conf
27source s_sys {
28file ("/proc/kmsg"log_prefix("kernel: "));
29unix-stream ("/dev/log");
30internal();
31udp(ip(0.0.0.0) port(514));
32};
33destination d_mysql {
34program("/usr/bin/mysql-uroot syslog < /tmp/mysql.pipe");
35pipe("/tmp/mysql.pipe"
36template("INSERT INTO logs(host, facility, priority, level, tag, date,
37time, program, msg) VALUES ('$HOST', '$FACILITY', '$PRIORITY', '$LEVEL','$TAG',
38'$YEAR-$MONTH-$DAY','$HOUR:$MIN:$SEC', '$PROGRAM', '$MSG' );\n") template-escape(yes));
39};
40log { source(s_sys);destination(d_mysql); };

本篇先到这里,最新版本的syslog-ng为3.9,其支持和loganalyzer、splunk、Elasticsearch、AMQP、redis等程序结合。将日志采集到本地以后,结果简单的shell和mail或短信网关可以实现告警,也可以和其他结合程序实现web展示和检索 。

本篇参考页面:

syslog-ng官方文档