logger(二):linux下syslog & syslog-ng 详解

Linux下的sysylogsyslog-ng

     一台服务器的日志对系统工程师来说是至关重要的,一旦服务器出现故障或被入侵,我们需要查看日志来定位问题的关键所在,所以说对于线上跑的服务器而言日志应该合理的处理及管理.下面来介绍下linux系统的syslog日志服务器.

一、syslog详解

1.1syslog简介

syslog 是一种工业标准的协议,可用来记录设备的日志。在UNIX系统,路由器、交换机等网络设备中,系统日志(System Log)记录系统中任何时间发生的大小事件。管理者可以通过查看系统记录,随时掌握系统状况。UNIX的系统日志是通过syslogd这个进程记录系统有关事件记录,也可以记录应用程序运作事件。通过适当的配置,我们还可以实现运行syslog协议的机器间通信,通过分析这些网络行为日志,藉以追踪掌握与设备和网络有关的状况。syslog 系统日志记录着linux系统启动及运行的过程中产生的信息, RHEL 5.x系统上默认自带了syslog 的配置文件是/etc/syslog.conf. syslog默认有两个守护进程,klogd,syslogd。klogd 进程是记录系统运行的过程中内核生成的日志,而在系统启动的过程中内核初始化过程中 生成的信息记录到控制台(/dev/console)当系统启动完成之后会把此信息存放到/var/adm或/var/log/目录下的信息文件中(messages.*)。一个典型的syslog记录包括生成程序的名字和一个文本信息。它还包括一个设备和一个优先级范围。 通过使用syslog.conf文件,可以对生成的日志的位置及其相关信息进行灵活的配置。

 Syslogd 进程是记录非内核以外的信息: centos 6.x的syslogd被改名为rsyslogd,其默认的配置文件是/etc/rsyslog.conf

 

 

2.syslog配置详解:

该配置文件指明了syslogd守护程序记录日志的行为,该程序在启动时查询配置文件。该文件由不同程序或消息分类的单个条目组成,每个占一行。对每类消息提供一个选择域和一个动作域。

这些域由tab隔开:选择域指明消息的类型和优先级;动作域指明syslogd接收到一个与选择标准相匹配的消息时所执行的动作.

每个选择域都是由消息类型和优先级组成.当指明一个优先级时,syslogd将记录一个拥有相同或者更高优先级的消息。

Syslog.conf基本语法格式:

 [facility].[priority]   [action]

 消息类型.优先级  动作域

 

2.1 Facility可以理解为日志来源或类别,消息类型

 

1. auth      # 认证相关的 

2. authpriv  # 权限,授权相关的

3. cron      # 任务计划相关的

4. daemon    # 守护进程相关的

5. kern      # 内核相关的

6. lpr       # 打印相关的

7. mail      # 邮件相关的

8. mark      # 标记相关的

9. news      # 新闻相关的

10. security  # 安全相关的,与auth 类似 

11. syslog    # syslog自己的

12. user      # 用户相关的

13. uucp      # unix to unix cp 相关的

14. local0 到 local7 # 用户自定义使用

15. *         # *表示所有的facility

 

 

 

2.2 priority优先级,从高到低

 

1.emerg/oanic     # 会导致系统不可用的

2.alert           # 必须马上处理的

3.crit            # 比较严重的

4.err/error       # 错误信息 

5.warning/warn    # 可能影响系统功能,需要提醒用户的重要事件

6.notice          # 不影响正常功能,需要注意的消息 

7.info            # 一般信息

8.debug           # 程序或系统的调试信息

9.*               # 表示所有的日志级别 

10.none           # 跟* 相反,表示啥也没有

      

     例如:“mail.*”将把所有优先级的消息都发送到操作动作指定的/var/log/mail文件里。使用“*”限定符与使用“debug”优先级的效果完全一样,后者也将把所有类型的消息发送到指定地点。 

 

 

 

2.3 action表示日志记录位置

1.   系统上的绝对路径  # 普通文件 如: /var/log/xxx 

2.  |                # 管道  通过管道送给其他的命令处理 

3.  终端             # 终端   如:/dev/console

4.  @HOST            # 远程主机 如: @10.0.0.1

5.  用户             # 系统用户 如: root

6.  *            # 登录到系统上的所有用户,一般emerg级别的日志是这样定义的

 

 

 

 

2.4 一些例子:

   1.mail.info   /var/log/mail.log # 表示将mail相关的,级别为info及  info以上级别的信息记录到/var/log/mail.log文件中  

   2.auth.=info  @10.0.0.1  # 表示将auth相关的,基本为info的信息记录到10.0.0.1主机上去前提是10.0.0.1要能接收其他主机发来的日志信息  

   3.user.!=error                  # 表示记录user相关的,不包括error级别的信息  

   4.user.!error                   # 与user.error相反 

   5.*.info                        # 表示记录所有的日志信息的info级别  

   6.mail.*                        # 表示记录mail相关的所有级别的信息  

   7.*.*                           # 你懂的.  

   8.cron.info;mail.info           # 多个日志来源可以用";" 隔开  

   9.cron,mail.info                # 与cron.info;mail.info 是一个意思  

   10.mail.*;mail.!=info           # 表示记录mail相关的所有级别的信息,但是不包括info级别的 

   11.uucp,news.crit /var/log/spooler     #UUCPnews设备能产生许多外部消息。它把这些消息存到自己的日志(/var/log/spooler)中并把级别限为\"err\"或更高

   12.  **.emerg @linuxaid.com.cn      #当一个紧急消息到来时,可能想让所有的用户都得到。也可能想让自己的日志接收并保存。

   13.#kern.* /dev/console              #有时syslogd将产生大量的消息。例如内核(\"kern\"设备)可能很冗长,用户很难看得清楚明了,那么用户可能想把内核消息记录到/dev/console中。表明内核日志记录被注释掉了

 

 

2.5 如下解析一下rhel5.x系统上自带的syslog的配置文件/etc/syslog.conf

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

# 表示将所有facility的info级别,但不包括mail,authpriv,cron相关的信息,记录到 /var/log/messages文件  

*.info;mail.none;authpriv.none;cron.none                /var/log/messages 

# 表示将权限,授权相关的所有基本的信息,记录到/var/log/secure文件中.这个文件的权限是600  

authpriv.*                                              /var/log/secure 

# 表示将mail相关的所有基本的信息记录到/var/log/maillog文件中,可以看到路径前面有一个"-"  

# "-" 表示异步写入磁盘,  

mail.*                                                  -/var/log/maillog 

# 表示将任务计划相关的所有级别的信息记录到/var/log/cron文件中  

cron.*                                                  /var/log/cron 

# 表示将所有facility的emerg级别的信息,发送给登录到系统上的所有用户  

*.emerg                                                 *  

# 表示将uucp及news的crit级别的信息记录到/var/log/spooler文件中  

uucp,news.crit                                          /var/log/spooler 

# 表示将local7的所有级别的信息记录到/var/log/boot.log文件中,  

# 上面说过local0 到local7这8个是用户自定义使用的,这里的local7记录的是系统启动相关的信息  

local7.*                                                /var/log/boot.log

 

 

如果需要重新启动syslog守护进程(/etc/syslog.conf的修改只有在syslog守护进程重新启动后才会生效),并且只想重新启动syslog守护进程而不是整个系统,在Red Hat Linux机器上,执行以下两条命令之一即可:/etc/rc.d/init.d/syslogstop;/etc/rc.d/init.d/syslogstart/etc/rc.d/init.d/syslogrestart

 

 

 

 

2.6 使用syslog接口

加载sys/syslog.h文件

        openlog:打开日志设备,以供读取和写入,与文件系统调用的open类似; 

         syslog:写入日志,与文件系统调用的write类似; 

         closelog:关闭日志设备,与文件系统调用的close类似; 

         vsyslog:它和syslog功能一样,负责写入日志,只是参数格式不同。

 

(1)openlog函数

该函数的声明如下:

void openlog(const char *ident, int option, int facility);

此函数用来打开一个到系统日志记录程序的连接,打开之后就可以用syslog或vsyslog函数向系统日志里添加信息了。而closelog函数就是用来关闭此连接的。

第一个参数ident是一个标记,ident所表示的字符串将固定地加在每行日志的前面以标识这个日志,通常就写成当前程序的名称以作标记。

第二个参数 option一般是下列选项值取“与”运算(使用“|”表示,如“LOG_CONS | LOG_PID”)的结果:

LOG_CONS:如果送到system logger时发生问题,直接写入系统终端; 

LOG_NDELAY:立即开启连接,通常连接是在第一次写入消息时才打开的; 

LOG_PERROR:将消息也同时送到stderr设备; 

LOG_PID:将进程PID含入所有消息中。

第三个参数facility指明记录日志的程序的类型,它主要具有如下几类日志类型:

LOG_AUTH :安全/授权消息 

LOG_AUTHPRIV:安全/授权消息 

LOG_CRON:时间守护进程(cron和at)专用 

LOG_DAEMON:其它系统守护进程 

LOG_KERN:核心消息 

LOG_LOCAL0到LOG_LOCAL7:系统保留 

LOG_LPR:printer子系统 

LOG_MAIL:mail子系统 

LOG_NEWS:USENET新闻子系统 

LOG_SYSLOG:syslogd进程内部所产生的消息 

LOG_USER(缺省):一般使用者缺省使用消息 

LOG_UUCP:UUCP子系统 

LOG_FTP:FTP子系统使用

(2)syslog函数

syslog函数的声明如下:

void syslog(int priority, const char * message, ...);

第一个参数是消息的紧急级别priority,第二个参数是消息及其格式,之后是格式对应的参数,如同C语言里面printf输出函数一样使用,具体的格式这里就不再详述,它不是本书介绍的重点。

这里还需要详细介绍一下第一个参数priority,它是由severity level和facility组成的。Facility已经在上面介绍了,下面介绍一下severity level,也就是消息的重要级别,它主要包括:

LOG_EMERG:紧急状况 

LOG_ALERT:高优先级问题,比如说数据库崩溃等,必须要立即采取反应行动 

LOG_CRIT:重要状况发生,比如硬件故障 

LOG_ERR:错误发生 

LOG_WARNING:警告发生 

LOG_NOTICE:一般状况,需要引起注意 

LOG_INFO:信息状况 

 LOG_DEBUG:调试消息

在实际使用中,如果我们的程序要使用系统日志功能,只需要在程序启动时使用openlog函数来连接syslogd程序,后面随时用syslog函数写日志就行了。

(3)closelog函数

相对上述2个函数来说,该函数非常简单,其声明如下:

void closelog( void );

值得注意的是,虽然该函数的使用和调用情况非常简单,但是是必不可少的,因为在Linux系统中,打开的日志也是资源,如果只使用openlog函数打开日志,而忘记使用closelog关闭日志的话,当打开的日志数量累积到一定程度,便会造成内存不足,从而引起系统问题。所以,提醒用户在使用中特别注意

 

 

 

 

3.syslog-ng配置详解:

   syslog-ng (syslog-Next generation) 是syslog的升级版,syslog-ng有两个版本,一个是收费的,一个是开源的,那么作为syslog的下一代产品,功能是可想而知,肯定比syslog的功能强大的多,如 
高性能 可靠的传输 支持多平台 高可靠性 众多的用户群体 强大的日志过滤及排序 事件标签和关联性 支持最新的IETF标准 等....

3.1 syslog-ng 的设计原则:

 通过正规表达式协助,除支持原facitily/level方式,还支持内容过滤等以建立更好的消息过滤机制; 

 支持主机链,即使日志消息经过多重网络转发,仍可找到原发出主机的信息和整个消息链; 

 支持强大的自定义配置,并且清晰、明了。 

开源版本的主页 http://www.balabit.com/network-security/syslog-ng/opensource-logging-system/overview

 

3.2 syslog-ng 安装:

1.rhel5.x的系统上安装方法:

 yum install gcc*  

cd /usr/src 

wget http://www.balabit.com/downloads/files/syslog-ng/sources/3.2.4/source/eventlog_0.2.12.tar.gz 

 wget http://www.balabit.com/downloads/files/syslog-ng/open-source-edition/3.3.5/source/syslog-ng_3.3.5.tar.gz 

 tar xvf eventlog_0.2.12.tar.gz 

 cd eventlog-0.2.12 

 ./configure --prefix=/usr/local/eventlog 

 make 

 make install 

 

 cd /usr/src 

 tar xvf syslog-ng_3.3.5.tar.gz 

 cd syslog-ng-3.3.5 

 export PKG_CONFIG_PATH=/usr/local/eventlog/lib/pkgconfig 

 ./configure --prefix=/usr/local/syslog-ng 

 make 

 make install 

 

2.Ubuntu 2.6.x上的安装方法

 Sudo apt-get install syslog-ng

 

3.3 syslog-ng 原理:

LOG STATEMENTS『SOURCES - FILTERS -DESTINATIONS』
消息路径 『消息源 - 过滤器 - 目的站』

也就是说,通过定义多个消息源,把匹配上若干个过滤器的消息导向到指定的目的地,从而组成一个消息路径。

3.4 syslog-ng 配置详解:

   文件:$/etc/syslog-ng.conf

1. syslog-ng.conf文件里的内容有以下几个部分组成

2. 全局选项,多个选项时用分好";"隔开 

3. options { .... }; 

4. 定义日志源

5. source s_name { ... }; 

6. 定义过滤规则,规则可以使用正则表达式来定义,这里是可选的,不定义也没关系 

7. filter f_name { ... }; 

8. 定义目标 

9. destination d_name { ... }; 

10. 定义消息链可以将多个源,多个过滤规则及多个目标定义为一条链 

11. log { ... }; 

12. 详解如下 

13. ---------------------------------------------------------------- 

14. options { long_hostnames(off); sync(0); perm(0640); stats(3600); }; 

15.     更多选项如下 

16.     chain_hostnames(yes|no)     # 是否打开主机名链功能,打开后可在多网络段转发日志时有效 

17.     long_hostnames(yes|no)      # chain_hostnames的别名,已不建议使用 

18.     keep_hostname(yes|no)       # 是否保留日志消息中保存的主机名称 

19.     use_dns(yes|no)             # 是否打开DNS查询功能, 

20.     use_fqdn(yes|no)            # 是否使用完整的域名 

21.     check_hostname(yes|no)      # 是否检查主机名有没有包含不合法的字符 

22.     bad_hostname(regexp)        # 可通过正规表达式指定某主机的信息不被接受 

23.     dns_cache(yes|no)           # 是否打开DNS缓存功能 

24.     dns_cache_expire(n)         # DNS缓存功能打开时,一个成功缓存的过期时间 

25.     dns_cache_expire_failed(n)  # DNS缓存功能打开时,一个失败缓存的过期时间 

26.     dns_cache_size(n)           # DNS缓存保留的主机名数量 

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

28.     dir_owner(uid)              # 目录的UID 

29.     dir_group(gid)              # 目录的GID 

30.     dir_perm(perm)              # 目录的权限,使用八进制方式标注,例如0644 

31.     owner(uid)                  # 文件的UID 

32.     group(gid)                  # 文件的GID 

33.     perm(perm)                  # 文件的权限,同样,使用八进制方式标注 

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

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

36.     log_fifo_size(n)            # 输出队列的行数 

37.     log_msg_size(n)             # 消息日志的最大值(bytes 

38.     mark(n)                     # 多少时间(秒)写入两行MARK信息供参考,目前没有实现 

39.     stats(n)                    # 多少时间(秒)写入两行STATUS信息,默认值是:600 

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

41.     time_reap(n)                # 在没有消息前,到达多少秒,即关闭该文件的连接 

42.     time_reopen(n)              # 对于死连接,到达多少秒,会重新连接 

43.     use_time_recvd(yes|no)      # 宏产生的时间是使用接受到的时间,还是日志中记录的时间;建议使用R_的宏代替接收时间,S_的宏代替日志记录的时间,而不要依靠该值定义。 

44.  

45. source s_name { internal(); unix-dgram("/dev/log"); udp(ip("0.0.0.0") port(514)); }; 

46.  

47.     file (filename)                 # 从指定的文件读取日志信息 

48.     unix-dgram  (filename)          # 打开指定的SOCK_DGRAM模式的unix套接字,接收日志消息 

49.     unix-stream (filename)          # 打开指定的SOCK_STREAM模式的unix套接字,接收日志消息 

50.     udp ( (ip),(port) )             # 在指定的UDP端口接收日志消息 

51.     tcp ( (ip),(port) )             # 在指定的TCP端口接收日志消息 

52.     sun-streams (filename)          # solaris系统中,打开一个(多个)指定的STREAM设备,从其中读取日志消息 

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

54.     pipe(filename),fifo(filename)   # 从指定的管道或者FIFO设备,读取日志信息 

55.  

56. filter f_name   { not facility(news, mail) and not filter(f_iptables); }; 

57.     更多规则函数如下 

58.     facility(..)    # 根据facility(设备)选择日志消息,使用逗号分割多个facility 

59.     level(..)       # 根据level(优先级)选择日志消息,使用逗号分割多个level,或使用“..”表示一个范围 

60.     program(表达式)    # 日志消息的程序名是否匹配一个正则表达式 

61.     host(表达式)   # 日志消息的主机名是否和一个正则表达式匹配 

62.     match(表达式)  # 对日志消息的内容进行正则匹配 

63.     filter()        # 调用另一条过滤规则并判断它的值 

64.     定义规则的时候也可以使用逻辑运算符and or not 

65.  

66. destination d_name { file("/var/log/messages"); }; 

67.     更多动作如下 

68.     file (filename)                 # 把日志消息写入指定的文件 

69.     unix-dgram  (filename)          # 把日志消息写入指定的SOCK_DGRAM模式的unix套接字 

70.     unix-stream (filename)          # 把日志消息写入指定的SOCK_STREAM模式的unix套接字 

71.     udp (ip),(port)                 # 把日志消息发送到指定的UDP端口 

72.     tcp (ip),(port)                 # 把日志消息发送到指定的TCP端口 

73.     usertty(username)               # 把日志消息发送到已经登陆的指定用户终端窗口 

74.     pipe(filename),fifo(filename)   # 把日志消息发送到指定的管道或者FIFO设备 

75.     program(parm)                   # 启动指定的程序,并把日志消息发送到该进程的标准输入 

76.  

77. log { source(s_name); filter(f_name); destination(d_name) }; 

 

3.5 syslog-ng.conf 例子:

1.  options { long_hostnames(off); sync(0); perm(0640); stats(3600); }; 

2.  

3. source src {  

4.             internal();  

5.             unix-dgram("/dev/log");  

6.             # 表示日志来源为本机udp的514端口, 

7.             udp(ip("0.0.0.0") port(514));  

8. }; 

9.  

10. filter f_iptables   { facility(kern) and match("IN=") and match("OUT="); }; 

11.  

12. filter f_console    { level(warn) and facility(kern) and not filter(f_iptables) 

13.                       or level(err) and not facility(authpriv); }; 

14.  

15. filter f_newsnotice { level(notice) and facility(news); }; 

16. filter f_newscrit   { level(crit)   and facility(news); }; 

17. filter f_newserr    { level(err)    and facility(news); }; 

18. filter f_news       { facility(news); }; 

19.  

20. filter f_mailinfo   { level(info)      and facility(mail); }; 

21. filter f_mailwarn   { level(warn)      and facility(mail); }; 

22. filter f_mailerr    { level(err, crit) and facility(mail); }; 

23. filter f_mail       { facility(mail); }; 

24.  

25. filter f_cron       { facility(cron); }; 

26.  

27. filter f_local      { facility(local0, local1, local2, local3, 

28.                                local4,  local6, local7); }; 

29.  

30. filter f_acpid_full { match('^acpid:'); }; 

31. filter f_acpid      { level(emerg..notice) and match('^acpid:'); }; 

32.  

33. filter f_acpid_old  { match('^\[acpid\]:'); }; 

34.  

35. filter f_netmgm     { match('^NetworkManager:'); }; 

36.  

37. filter f_messages   { not facility(news, mail) and not filter(f_iptables); }; 

38. filter f_warn       { level(warn, err, crit) and not filter(f_iptables); }; 

39. filter f_alert      { level(alert); }; 

40.  

41. destination console  { pipe("/dev/tty10"    owner(-1) group(-1) perm(-1)); }; 

42. log { source(src); filter(f_console); destination(console); }; 

43.  

44. destination xconsole { pipe("/dev/xconsole" owner(-1) group(-1) perm(-1)); }; 

45. log { source(src); filter(f_console); destination(xconsole); }; 

46.  

47. destination newscrit   { file("/var/log/news/news.crit" 

48.                               owner(news) group(news)); }; 

49. log { source(src); filter(f_newscrit); destination(newscrit); }; 

50.  

51. destination newserr    { file("/var/log/news/news.err" 

52.                               owner(news) group(news)); }; 

53. log { source(src); filter(f_newserr); destination(newserr); }; 

54.  

55. destination newsnotice { file("/var/log/news/news.notice" 

56.                               owner(news) group(news)); }; 

57. log { source(src); filter(f_newsnotice); destination(newsnotice); }; 

58.  

59. destination mailinfo { file("/var/log/mail.info"); }; 

60. log { source(src); filter(f_mailinfo); destination(mailinfo); }; 

61.  

62. destination mailwarn { file("/var/log/mail.warn"); }; 

63. log { source(src); filter(f_mailwarn); destination(mailwarn); }; 

64.  

65. destination mailerr  { file("/var/log/mail.err" fsync(yes)); }; 

66. log { source(src); filter(f_mailerr);  destination(mailerr); }; 

67.  

68. destination mail { file("/var/log/mail"); }; 

69. log { source(src); filter(f_mail); destination(mail); }; 

70.  

71. destination acpid { file("/var/log/acpid"); }; 

72. destination null { }; 

73. log { source(src); filter(f_acpid); destination(acpid); flags(final); }; 

74.  

75. log { source(src); filter(f_acpid_full); destination(null); flags(final); }; 

76.  

77. log { source(src); filter(f_acpid_old); destination(acpid); flags(final); }; 

78.  

79. destination netmgm { file("/var/log/NetworkManager"); }; 

80. log { source(src); filter(f_netmgm); destination(netmgm); flags(final); }; 

81.  

82. destination localmessages { file("/var/log/localmessages"); }; 

83. log { source(src); filter(f_local); destination(localmessages); }; 

84.  

85. destination messages { file("/var/log/messages"); }; 

86. log { source(src); filter(f_messages); destination(messages); }; 

87.  

88. destination firewall { file("/var/log/firewall"); }; 

89. log { source(src); filter(f_iptables); destination(firewall); }; 

90.  

91. destination warn { file("/var/log/warn" fsync(yes)); }; 

92. log { source(src); filter(f_warn); destination(warn); }; 

93.  

94. filter f_ha         { facility(local5); }; 

95. destination hamessages { file(/var/log/ha); }; 

96. log { source(src); filter(f_ha); destination(hamessages); }; 

 

3.6 syslog-ng 的扩展项:

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文件。

3.6 syslog-ng 的扩展项template选项用法:

1.例1:設定存入資料庫的目的:

destination d_mysql {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));};

#temple定义输出格式(时间,日志级别,信息),具体参考file宏

2.例2:

 template ws_fmt {template("$DATE $PRIORITY $MSG\n"); template_escape(no); };

 

3.7 syslog-ng 关于垃圾收集状态:

当满足一定的条件,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就进入垃圾信息收集状态的时间。该值应该比较高,以保证正常情况下不会打断日志消息的收取。

 

3.8 使用方法及案例:

如:

1.安装:ubuntu下安装方法: apt-get install syslog-ng

 2.配置syslog-ng.conf文件,在目录:/etc/syslog-ng/syslog-ng.conf

 3.将配置好的syslog-ng.conf替换源文件

 4.配置syslog-ng文件,在目录:/etc/logrotate.d/syslog-ng

 5.启动log服务:/etc/init.d/syslog-ng restart

     若不增加其他设定,可以通过下面的简单命令即可替换原syslog服务:

# service syslog stop
# service syslog-ng start

3.9 参考资料:

man syslog-ng.conf
man 8 syslog-ng

你可能感兴趣的:(C++基础库,linux,syslog-ng,syslog)