1、知识百科 一台服务器的日志对系统工程师来说是至关重要的,一旦服务器出现故障或被入侵,我们需要查看日志来定位问题的关键所在,因此对于线上跑的服务器而言,日志应该得到合理的处理及管理。 在unix类操作系统上,syslog广泛应用于系统日志。syslog日志消息既可以记录在本地文件中,也可以通过网络发送到接收syslog的服务器,接收syslog的服务器可以对多个设备的syslog消息进行统一的存储,或者解析其中的内容做相应的处理,常见的应用场景是网络管理工具、安全管理系统、日志审计系统。 完整的syslog日志中包含产生日志的程序模块(Facility)、严重性(Severity或Level)、时间、主机名或IP、进程名、进程ID和正文,在Unix类操作系统上,能够按Facility和Severity的组合来决定什么样的日志消息是否需要记录,记录到什么地方,是否需要发送到一个接收syslog的服务器等,由于syslog简单而灵活的特性,syslog不再仅限于Unix类主机的日志记录,任何需要记录和发送日志的场景,都可能会使用syslog。 长期以来,没有一个标准来规范syslog的格式,导致syslog的格式是非常随意的,最坏的情况下,根本就没有任何格式,导致程序不能对syslog消息进行解析,只能将它看作是一个字符串,在2001年定义的RFC3164中,描述了BSD syslog协议:http://www.ietf.org/rfc/rfc3164.txt,不过这个规范的很多内容都不是强制性的,常常是“建议”或者“约定”,也由于这个规范出的比较晚,很多设备并不遵守或不完全遵守这个规范,接下来就介绍一下这个规范。 约定发送syslog的设备为Device,转发syslog的设备为Relay,接收syslog的设备为Collector。Relay本身也可以发送自身的syslog给Collector,这个时候它表现为一个Device,Relay也可以只转发部分接收到的syslog消息,这个时候它同时表现为Relay和Collector。 syslog消息发送到Collector的UDP 514端口,不需要接收方应答,RFC3164建议Device也使用514作为源端口,规定syslog消息的UDP报文不能超过1024字节,并且全部由可打印的字符组成,完整的syslog消息由3部分组成,分别是PRI、HEADER和MSG,大部分syslog都包含PRI和MSG部分,而HEADER可能没有。2、配置运行syslogd这是最传统的syslog协议服务器端的实现,运行于大多数的Linux系统中,主要用于记录非内核以外的信息,可以通过dmesg命令查看/var/log/messages日志。由于其安全性差、语法太自由而导致了很多的问题,目前有了一些替代品出现如rsyslogd、syslog-ng等。def send_syslog_message(count): # LOG_PERROR除了记录到syslog记录中,同时还会在stderr打印出来 syslog.openlog("ADNS", syslog.LOG_PID|syslog.LOG_PERROR) for i in range(count): msg = "Hello World %d times" %(i) syslog.syslog(msg) if __name__ == "__main__": if (len(sys.argv) != 2): help() sys.exit() count = int(sys.argv[1]) send_syslog_message(count)#tail -f /var/log/messages|grep ADNSJul 10 16:36:20 127.0.0.1 ADNS[67246]: Hello World 0 timesJul 10 16:36:20 127.0.0.1 ADNS[67246]: Hello World 1 timesJul 10 16:36:20 127.0.0.1 ADNS[67246]: Hello World 2 timesJul 10 16:36:20 127.0.0.1 ADNS[67246]: Hello World 3 timesJul 10 16:36:20 127.0.0.1 ADNS[67246]: Hello World 4 timesJul 10 16:36:20 127.0.0.1 ADNS[67246]: Hello World 5 timesJul 10 16:36:20 127.0.0.1 ADNS[67246]: Hello World 6 timesJul 10 16:36:20 127.0.0.1 ADNS[67246]: Hello World 7 timessyslog-ngsyslog-ng(syslog next generation)是syslog的升级版,syslog-ng有两个版本,一个是收费的,一个是开源的。<30>Oct 9 22:33:20 hlfedora auditd[1787]: The audit daemon is exiting.备注:上面是一个syslog消息,其中“<30>”是PRI,“Oct 9 22:33:20 hlfedora”是MSG HEADER,“auditd[1787]: The audit daemon is exiting.”是MSG。PRIPRI部分由尖括号包含的一个数字构成,这个数字包含了程序模块(Facility)、严重性(Severity/Level),这个数字是由Facility乘以8,然后加上Severity得来,即这个数字如果换成2进制的话,低3位表示Severity,高5位表示Facility的值。十进制30 =二进制0001 11100001 1... = Facility: DAEMON - system daemons (3).... .110 = Severity: INFO - informational (6) facility参数syslog.conf名字含义值LOG_KERNkernkernel messages0LOG_USERuseruser-level messages1LOG_MAILmailmail system2LOG_DAEMONdaemonsystem daemons3LOG_AUTHauthsecurity/authorization messages (note 1)4LOG_SYSLOGsyslogmessages generated internally by syslogd5LOG_LPRlprline printer subsystem6LOG_NEWSnewsnetwork news subsystem7LOG_UUCPuucpUUCP subsystem8LOG_CRONcronclock daemon (note 2)9LOG_AUTHPRIVauthprivsecurity/authorization messages (note 1)10LOG_FTPftpFTP daemon11 NTP subsystem12 log audit (note 1)13 log alert (note 1)14 clock daemon (note 2)15LOG_LOCAL0~LOG_LOCAL7local0~local7local use 0 (local0)~local use 7 (local7)16~23 priority参数/levelsyslog.conf名字含义值LOG_EMERGemergEmergency: system is unusable0LOG_ALERTalertAlert: action must be taken immediately1LOG_CRITcritCritical: critical conditions2LOG_ERRerrError: error conditions3LOG_WARNINGwarningWarning: warning conditions4LOG_NOTICEnoticeNotice: normal but significant condition5LOG_INFOinfoInformational: informational messages6LOG_DEBUGdebugDebug: debug-level messages7MSG HEADER MSG HEADER部分包括两个字段:时间和主机名(或IP)。 时间紧跟在PRI后面,中间没有空格,格式必须是“Mmm dd hh:mm:ss”(否则syslogd识别不出来),不包括年份。“日”的数字如果是1~9,前面会补一个空格(也就是月份后面有两个空格),而“小时”、“分”、“秒”则在前面补“0”。月份取值包括:Jan/Feb/Mar/Apr/May/Jun/ Jul/Aug/Sep/Oct/Nov/Dec。 时间后边跟一个空格,然后是主机名或者IP地址,主机名不得包括域名部分。 有些系统需要将日志长期归档,而syslog-ng时间字段又不包括年份,所以一些不标准的syslog格式中包含了年份,例如:<165>Aug 24 05:34:00 CST 1987 mymachine myproc[10]: hello world 这样会导致解析程序将“CST”当作主机名,而“1987”开始的部分作为MSG部分。解析程序面对这种问题,可能要做很多容错处理,或者定制能解析多种syslog格式,而不仅仅是只能解析标准格式。HEADER部分后面跟一个空格,然后是MSG部分,有些syslog中没有HEADER部分,这个时候MSG部分紧跟在PRI后面,中间没有空格。MSGMSG部分又分为两个部分,TAG和Content,其中TAG部分是可选的。 在前面的例子中<30>Oct 9 22:33:20 hlfedoraauditd[1787]: The audit daemon is exiting.,“auditd[1787]”是TAG部分,包含了进程名称和进程PID。 TAG后面用一个冒号隔开Content部分,这部分的内容是应用程序自定义的。配置运行# vi /etc/syslog-ng/syslog-ng.conf#service syslog-ng restart 默认配置@version: 3.0options { flush_lines (0); time_reopen (10); log_fifo_size (1000); long_hostnames (off); chain_hostnames(no); use_dns (no); use_fqdn (yes); keep_hostname (yes); create_dirs (yes); dir_perm(0755); owner("root"); group("adm"); perm(0640); stats_freq(0);}; source s_sys { file ("/proc/kmsg" program_override("kernel: ")); unix-stream ("/dev/log"); internal();}; 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("*"); }; filter f_kernel { facility(kern); };filter f_default { level(info..emerg) and not (facility(mail) or facility(cron)); };filter f_auth { facility(auth,authpriv) and not program(snoopy); };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 to locallog { 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 to netdestination d_loghost { udp("1.1.1.1" port(514) suppress(10)); };log { source(s_sys); destination(d_loghost); };基础配置# vi /etc/syslog-ng/syslog-ng.conf@version: 3.0 options { flush_lines (0); time_reopen (10); log_fifo_size (1000); long_hostnames (off); chain_hostnames(no); use_dns (no); use_fqdn (yes); keep_hostname (yes); create_dirs (yes); dir_perm(0755); owner("root"); group("adm"); perm(0640); stats_freq(0);}; template t_adns { template("$YEAR-$MONTH-$DAY $HOUR:$MIN:$SEC $FULLHOST: $MSGHDR$MSG\n");}; source s_adns { udp(ip(0.0.0.0) port(514));}; destination d_adns {# file("/home/jie.cj/scripts/logs/$S_YEAR-$S_MONTH-$S_DAY-$S_HOUR.adns.log" create_dirs(yes) template(t_adns)); file("/home/jie.cj/scripts/logs/$S_YEAR-$S_MONTH-$S_DAY-$S_HOUR.adns.log" create_dirs(yes)); }; log{source(s_adns); destination(d_adns);};3、实例分析SYSLOG(IPV4->UDP->SYSLOG)3c31 333e: PRI=<13>,定义了Facility和LEVEL(13=00001101)4a 75 6e 20 32 39 20 32 MSG部分30 3a 33 30 3a 35 33 20...6d 66 20 68 65 6c 6c 6f20 77 6f 72 6c 64 0a4、参考资料syslog:http://www.ietf.org/rfc/rfc3164.txthttp://blog.csdn.net/smstong/article/details/8919803http://liu-hliang.iteye.com/blog/827392 syslog+splunk:http://blog.c1gstudio.com/archives/1587