使用php的syslog()函數調用本地的syslog服務,我的環境是ubuntu,所以記錄下ubuntu下syslog的使用有關配置方法
參考文章:
http://www.cnblogs.com/wangkangluo1/archive/2012/05/30/2526011.html
http://blog.csdn.net/xinguan1267/article/details/7078481
首先寫一個php測試文件
1 <?php 2 $ident = 'test'; 3 $facility = LOG_LOCAL4; 4 $priority = LOG_INFO; 5 define_syslog_variables(); 6 openlog($ident,NULL,$facility); 7 syslog($priority,'syslog test message generated in php programs'); 8 closelog();
結果會在/var/log/syslog文件中增加如下一條記錄。(默認的配置是會寫到syslog文件中),php的openlog()和syslog()函數用法可以查看php手刪,
openlog ( string $ident
, int $option
, int $facility
)
syslog ( int $priority
, string $message
)
這里的facility和priority對應本地syslog服務的”消息來源“(facility)和”緊急程度“(priority),下面會講到,這兩參數通過syslog的配置文件決定log寫入到哪個文件中。
這里講下服務器端的syslog的使用。
ubuntu中syslog文件為/etc/rsyslog.conf,查看文件發現所有/etc/rsyslog.d文件夾下的.conf文件都屬於配置文件,默認有兩個文件,如下圖:
20-ufw.conf 配置的是防火牆log
50-default.conf 則是其他默認的log配置,我的配置如下所示,截出其中一部分
1 local4.info /var/log/test.log 2 *.info /var/log/message 3 auth,authpriv.* /var/log/auth.log 4 *.*;auth,authpriv.none -/var/log/syslog 5 #cron.* /var/log/cron.log 6 #daemon.* -/var/log/daemon.log 7 kern.* -/var/log/kern.log 8 #lpr.* -/var/log/lpr.log 9 mail.* -/var/log/mail.log 10 #user.* -/var/log/user.log 11 12 # 13 # Logging for the mail system. Split it up so that 14 # it is easy to write scripts to parse these files. 15 # 16 #mail.info -/var/log/mail.info 17 #mail.warn -/var/log/mail.warn 18 mail.err /var/log/mail.err 19 20 # 21 # Logging for INN news system. 22 # 23 news.crit /var/log/news/news.crit 24 news.err /var/log/news/news.err 25 news.notice -/var/log/news/news.notice
第一行配置的就是剛剛那個php測試例子的,這樣會將log寫入到/var/log/test.log中,同時syslog文件中也會存在.
看下配置文件的語法格式
[消息類型(規則)] [處理方案(日記文件)]
注意:兩者之間必須用一個或多外tab符分隔,如:local4.* (這里是一個或多個tab符)/var/log/test.log
消息類型是由”消息來源“(facility)和”緊急程度“(priority)構成,中間點號連接。
如前面syslog.conf文件中的news.crit表示來自news的”關鍵“狀況。這里,news表示消息來源,crit表示關鍵狀況。通配符*表示一切消息來源,如第二條規則:*.info,將info級以上(notice,warning, err, alert, emerg)(priority表)的所有消息發送到日記文件/var/log/messages。而測試程序中,調用syslog函數時指定的priority是LOG_INFO,facility是LOG_LOCAL4,根據facility和priority對應的關系,對應的消息類型規則是local4.info,包含在第一條規則中,所以會寫到/var/log/test.log文件中,同時因為符合*.info規則和*.*規則(*.*為匹配所有規則),所以同時還會寫到syslog和message文件中。
下面列出facility和priority的對應關系:/usr/include/i386-linux-gun/sys/syslog.h文件中查看
syslog支持的facility如下:facility參數通常在openlog()中設置,如測試的openlog($ident,NULL,'LOG_LOCAL4');
/* facility codes */ 93 #define LOG_KERN (0<<3) /* kernel messages */ 94 #define LOG_USER (1<<3) /* random user-level messages */ 95 #define LOG_MAIL (2<<3) /* mail system */ 96 #define LOG_DAEMON (3<<3) /* system daemons */ 97 #define LOG_AUTH (4<<3) /* security/authorization messages */ 98 #define LOG_SYSLOG (5<<3) /* messages generated internally by syslogd */ 99 #define LOG_LPR (6<<3) /* line printer subsystem */ 100 #define LOG_NEWS (7<<3) /* network news subsystem */ 101 #define LOG_UUCP (8<<3) /* UUCP subsystem */ 102 #define LOG_CRON (9<<3) /* clock daemon */ 103 #define LOG_AUTHPRIV (10<<3) /* security/authorization messages (private) */ 104 #define LOG_FTP (11<<3) /* ftp daemon */ 105 106 /* other codes through 15 reserved for system use */ 107 #define LOG_LOCAL0 (16<<3) /* reserved for local use */ 108 #define LOG_LOCAL1 (17<<3) /* reserved for local use */ 109 #define LOG_LOCAL2 (18<<3) /* reserved for local use */ 110 #define LOG_LOCAL3 (19<<3) /* reserved for local use */ 111 #define LOG_LOCAL4 (20<<3) /* reserved for local use */ 112 #define LOG_LOCAL5 (21<<3) /* reserved for local use */ 113 #define LOG_LOCAL6 (22<<3) /* reserved for local use */ 114 #define LOG_LOCAL7 (23<<3) /* reserved for local use */ 115 116 #define LOG_NFACILITIES 24 /* current number of facilities */ 117 #define LOG_FACMASK 0x03f8 /* mask to extract facility part */ 118 /* facility of pri */ 119 #define LOG_FAC(p) (((p) & LOG_FACMASK) >> 3)
facility的ID(上面對應的數值)與名字的對應關系如下:
122 CODE facilitynames[] = 123 { 124 { "auth", LOG_AUTH }, 125 { "authpriv", LOG_AUTHPRIV }, 126 { "cron", LOG_CRON }, 127 { "daemon", LOG_DAEMON }, 128 { "ftp", LOG_FTP }, 129 { "kern", LOG_KERN }, 130 { "lpr", LOG_LPR }, 131 { "mail", LOG_MAIL }, 132 { "mark", INTERNAL_MARK }, /* INTERNAL */ 133 { "news", LOG_NEWS }, 134 { "security", LOG_AUTH }, /* DEPRECATED */ 135 { "syslog", LOG_SYSLOG }, 136 { "user", LOG_USER }, 137 { "uucp", LOG_UUCP }, 138 { "local0", LOG_LOCAL0 }, 139 { "local1", LOG_LOCAL1 }, 140 { "local2", LOG_LOCAL2 }, 141 { "local3", LOG_LOCAL3 }, 142 { "local4", LOG_LOCAL4 }, 143 { "local5", LOG_LOCAL5 }, 144 { "local6", LOG_LOCAL6 }, 145 { "local7", LOG_LOCAL7 }, 146 { NULL, -1 } 147 };
這個對應關系作用是是將syslog系統調用中facility ID和syslog的配置文件(50-default.conf)選項對應起來。facility的作用是指明調用syslog應用的類型。
syslog支持的priority如下:
51 #define LOG_EMERG 0 /* system is unusable */ 52 #define LOG_ALERT 1 /* action must be taken immediately */ 53 #define LOG_CRIT 2 /* critical conditions */ 54 #define LOG_ERR 3 /* error conditions */ 55 #define LOG_WARNING 4 /* warning conditions */ 56 #define LOG_NOTICE 5 /* normal but significant condition */ 57 #define LOG_INFO 6 /* informational */ 58 #define LOG_DEBUG 7 /* debug-level messages */
priority的ID(上面對應的數值)與名字的對應關系如下:
74 CODE prioritynames[] = 75 { 76 { "alert", LOG_ALERT }, 77 { "crit", LOG_CRIT }, 78 { "debug", LOG_DEBUG }, 79 { "emerg", LOG_EMERG }, 80 { "err", LOG_ERR }, 81 { "error", LOG_ERR }, /* DEPRECATED */ 82 { "info", LOG_INFO }, 83 { "none", INTERNAL_NOPRI }, /* INTERNAL */ 84 { "notice", LOG_NOTICE }, 85 { "panic", LOG_EMERG }, /* DEPRECATED */ 86 { "warn", LOG_WARNING }, /* DEPRECATED */ 87 { "warning", LOG_WARNING }, 88 { NULL, -1 } 89 };
priority的作用是指明日記記錄的優先級,也可以理解成記錄時間的嚴重程度。在實際使用中,syslog函數中的priority參數實際上是前面提到的facility和priority的組合,通過與操作。
通過上面列出的對應關系,我們可以看出測試程序中使用的facility和priority對應的是配置文件中的local4.info項及其他符合的通配的項。