Syslog-ng

简介

先简单介绍一下syslog-ng

看到syslog-ng不由的会想到syslog。其实syslog-ng就是syslog的升级版,当然,功能也比syslog强大。比如:高性能、支持多平台、高可靠的传输、众多的用户群体、强大的日志过滤、排序。

安装syslog-ng

系统环境:CentOS7

我们yum安装,首先添加包含syslog-ng的最新非官方版本的repo。将repo文件下载到/etc/yum.repos.d/,以便安装和启用syslog-ng:

cd /etc/yum.repos.d/

wget https://copr.fedorainfracloud.org/coprs/czanik/syslog-ng321/repo/epel-7/czanik-syslog-ng321-epel-7.repo

yum install syslog-ng

yum install syslog-ng-http

systemctl enable syslog-ng

systemctl start syslog-ng


虽然并非严格要求,但如果您同时删除rsyslog,则可以避免一些混淆:

yum erase rsyslog


安装启动好以后,最终要的部分来了,那就是配置。

用yum安装的配置文件路径为/etc/syslog-ng/syslog-ng.conf。

整个配置文件大致分为全局配置、消息源、过滤器、消息目的地和日志路径几部分。

全局配置:

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


消息路径:

log{sourceS1;sourceS2;...filter F1;filter F2;... destination D1;destination D2;...};


单机配置:

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);

};

source s_sys {

    file ("/proc/kmsg"log_prefix("kernel:"));

    unix-stream ("/dev/log");

    internal();

    # 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"sync(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("*"); };

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)

    andlevel(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); };


日志入库:

创建需要的库

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

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); };


实例:

#全局的选项参数,定义在配置文件的开头位置:

options {

   sync (0); #缓存多少行的信息再写入文件中,0为不缓存,局部参数可以覆盖该值。

   time_reopen (10); #对于死连接,到达多少秒,会重新连接

   log_fifo_size (1000); #输出队列的行数

   use_dns (no); #是否打开DNS查询功能,应使用防火墙保护使用syslog-ng的节点安全,并确认所有主机都是可以通过dns解释的,否则请关闭该选项。

   use_fqdn (no); #是否使用完整的域名

   create_dirs (yes); #当指定的目标目录不存在时,是否创建该目录

   keep_hostname (yes); #是否保留日志消息中保存的主机名称,否时,总是使用来源主机来作重写日志的主机名

    gc_busy_threshold(3000) :#当syslog-ng忙时,其进入垃圾信息收集状态的时间。一旦分派的对象达到这个数字,syslog-ng就启动垃圾信息收集状态。默认值是:3000。

    gc_idle_threshold(100) :#当syslog-ng空闲时,其进入垃圾信息收集状态的时间。一旦被分派的对象到达这个数字,syslog-ng就会启动垃圾信息收集状态,默认值是:100

}; 

 #消息源SOURCES 

source s_sys {#消息来源

    file ("/proc/kmsg" log_prefix("kernel: "));    #从指定的文件读取日志信息

    unix-stream ("/dev/log");    #打开指定的SOCK_STREAM模式的unix套接字,接收日志消息

    internal();    #syslog-ng内部产生的消息

    # udp(ip(0.0.0.0) port(514)); 

   # 如果取消注释,则可以从udp的514端口获取消息

    #写上服务的端口即可获取此服务的信息

};

#从file中读取日志,过滤error的信息

filter error_filter {#消息过滤

    host("192.16.1.91") and match("error");

    #可以匹配关键子进行过滤,也可对日志消息的内容进行正则匹配

}

#目的地DESTINATIONS

destination d_mesg  {#消息目的地,把日志信息写入指定的文件

     file("/var/log/messages")

}

#消息路径LOG STATEMENTS

log  {

    source s_sys;

    filter error_filter;

    destination d_mesg ;

};


把消息源、过滤器、消息目的组合起来就形成一条完整的指令。日志路径中的成员是顺序执行的。凡是来源于指定的消息源,匹配所有指定的过滤器,并送到指定的地址。

你可能感兴趣的:(Syslog-ng)