syslog-ng日志应用详解

2017年1月10日 发表评论 阅读评论

一、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模式有三种:客户端模式、服务端模式、中继模式。

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

client-mode

服务端模式(server mode):

server-mode

中继模式(Relay mode):

relay-mode

二、安装

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

# yum list|grep syslog-ng
syslog-ng.x86_64                            3.2.5-4.el6                  @epel
syslog-ng-devel.x86_64                      3.2.5-4.el6                  @epel
syslog-ng-libdbi.x86_64                     3.2.5-4.el6                  @epel
syslog-ng.i686                              3.2.5-4.el6                  epel
syslog-ng-devel.i686                        3.2.5-4.el6                  epel

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

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

chkconfig rsyslog off
service rsyslog stop
chkconfig syslog-ng on
service syslog-ng start

三、配置

其配置示例如下:

@version:3.2
# 全局配置
options {
        flush_lines (0);
        time_reopen (10);
        log_fifo_size (1000);
        long_hostnames (off);
        use_dns (no);
        use_fqdn (no);
        create_dirs (no);
        keep_hostname (yes);
};
# 本地源配置
source s_sys {
        file ("/proc/kmsg" program_override("kernel: "));
        unix-stream ("/dev/log");
        internal();
        #udp(ip(0.0.0.0) port(514));
};
#远程源配置
source s_remote {
         tcp(ip(0.0.0.0) port(514));
         udp(ip(0.0.0.0) port(514));
};
# 目的存放配置
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" flush_lines(10)); };
destination d_spol { file("/var/log/spooler"); };
destination d_boot { file("/var/log/boot.log"); };
destination d_cron { file("/var/log/cron"); };
destination d_kern { file("/var/log/kern"); };
destination d_mlal { usertty("*"); };
#destination d_remote_clients { file("/opt/logs/${R_YEAR}/${R_MONTH}/${R_DAY}/$HOST"  create_dirs(yes)) ; };
destination d_remote_clients { file("/opt/logs/${YEAR}/${MONTH}/${DAY}/$HOST"  create_dirs(yes)) ; };
# 过滤器
filter f_kernel     { facility(kern); };
filter f_default    { level(info..emerg) and
                        not (facility(mail)
                        or facility(authpriv)
                        or facility(cron)); };
filter f_auth       { facility(authpriv); };
filter f_mail       { facility(mail); };
filter f_emergency  { level(emerg); };
filter f_news       { facility(uucp) or
                        (facility(news)
                        and level(crit..emerg)); };
filter f_boot   { facility(local7); };
filter f_cron   { facility(cron); };
# 调用上面的配置,并存盘
#log { source(s_sys); filter(f_kernel); destination(d_cons); };
log { source(s_sys); filter(f_kernel); destination(d_kern); };
log { source(s_sys); filter(f_default); destination(d_mesg); };
log { source(s_sys); filter(f_auth); destination(d_auth); };
log { source(s_sys); filter(f_mail); destination(d_mail); };
log { source(s_sys); filter(f_emergency); destination(d_mlal); };
log { source(s_sys); filter(f_news); destination(d_spol); };
log { source(s_sys); filter(f_boot); destination(d_boot); };
log { source(s_sys); filter(f_cron); destination(d_cron); };
log { 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 <sourcename> {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 <filtername> {expression; };
facility() # 根据facility(设备)选择日志消息
filter() # 调用另一条过滤规则
host() # 日志消息的主机名是否和一个正则表达式匹配
level() or priority() # 根据level(优先级)选择日志消息
match() # 对日志消息的内容进行正则匹配

消息目的地:

destination <destname> {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() # 把日志消息发送到已经登陆的指定用户终端窗口

消息路径:

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

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

1、c/s模式

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

source s_remote {
         tcp(ip(0.0.0.0) port(514));
         udp(ip(0.0.0.0) port(514));
};

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

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

2、日志入库

# 创建需要的库
CREATE DATABASE syslog;
USE syslog;
CREATE TABLE logs (
host varchar(32) default NULL,
facility varchar(10) defaultNULL,
priority varchar(10) defaultNULL,
level varchar(10) default NULL,
tag varchar(10) default NULL,
date date default NULL,
time time default NULL,
program varchar(15) default NULL,
msg text,
seq int(10) unsigned NOT NULLauto_increment,
PRIMARY KEY (seq),
KEY host (host),
KEY seq (seq),
KEY program (program),
KEY time (time),
KEY date (date),
KEY priority (priority),
KEY facility (facility)
) TYPE=MyISAM;
# 创建管道文件
mkfifo /tmp/mysql.pipe
# 配置 syslog-ng.conf
source s_sys {
file ("/proc/kmsg"log_prefix("kernel: "));
unix-stream ("/dev/log");
internal();
udp(ip(0.0.0.0) port(514));
};
destination d_mysql {
program("/usr/bin/mysql-uroot syslog < /tmp/mysql.pipe");
pipe("/tmp/mysql.pipe"
template("INSERT INTO logs(host, facility, priority, level, tag, date,
time, program, msg) VALUES ('$HOST', '$FACILITY', '$PRIORITY', '$LEVEL','$TAG',
'$YEAR-$MONTH-$DAY','$HOUR:$MIN:$SEC', '$PROGRAM', '$MSG' );\n") template-escape(yes));
};
log { source(s_sys);destination(d_mysql); };

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

本篇参考页面:

syslog-ng官方文档




本站的发展离不开您的资助,金额随意,欢迎来赏!

You can donate through PayPal.
My paypal id: itybku@139.com
Paypal page: https://www.paypal.me/361way

  1. 本文目前尚无任何评论.
  1. 本文目前尚无任何 trackbacks 和 pingbacks.