生活随笔
收集整理的這篇文章主要介紹了
linux syslog 笔记
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
原文地址
Linux日記系統由系統日志監控程序syslogd和內核日志監控程序klogd組成。從它們的命名可以看到,這兩個監控程序都是守護程序(daemon),且都注冊成了系統服務。換句話說,我們可以在目錄/etc/init.d/下找到它們對應的執行程序,并通過service命令對它們進行啟動,關閉,重啟等操作。/etc/syslog.conf文件是Linux日記系統的配置文件。下面是本人/etc/syslog.conf文件內容(ubuntu下為/etc/rsyslog.conf):
?
#?Log?all?kernel?messages?to?the?console.??#?Logging?much?else?clutters?up?the?screen.??#kern.*?????????????????????????????????????????????????/dev/console???#?Log?anything?(except?mail)?of?level?info?or?higher.??#?Don't?log?private?authentication?messages!???*.info;mail.none;authpriv.none;cron.none????????????????/var/log/messages???#?The?authpriv?file?has?restricted?access.???authpriv.*??????????????????????????????????????????????/var/log/secure???#?Log?all?the?mail?messages?in?one?place.???mail.*??????????????????????????????????????????????????-/var/log/maillog????#?Log?cron?stuff???cron.*??????????????????????????????????????????????????/var/log/cron???#?Everybody?gets?emergency?messages???*.emerg?????????????????????????????????????????????????*???#?Save?news?errors?of?level?crit?and?higher?in?a?special?file.???uucp,news.crit??????????????????????????????????????????/var/log/spooler???#?Save?boot?messages?also?to?boot.log???local7.*????????????????????????????????????????????????/var/log/boot.log?? ?
在對這個配置文件進行詳細的解釋之前,我們先看一下在Linux C編程中如何利用syslog進行日記。
syslog APIs
Linux C中提供一套系統日記寫入接口,包括三個函數:openlog,syslog和closelog。
調用openlog是可選擇的。如果不調用openlog,則在第一次調用syslog時,自動調用openlog。調用closelog也是可選擇的,它只是關閉被用于與syslog守護進程通信的描述符。
下面是這三個函數的調用格式:
#include?<syslog.h>???void?openlog(char?*ident,?int?option,?int?facility); ??void?syslog(int?priority,?char?*format,?...); ??void?closelog();?? ?
其中openlog和closelog都是可選的。不過,通過調用openlog,我們www.linuxidc.com可以指定ident參數。這樣,ident將被加到每條日記記錄中。ident一般設成程序的名字,如在下面例子中的"testsyslog":
#include?<syslog.h>?????int?main(int?argc,?char?*argv[]) ??{ ??????openlog("testsyslog",?LOG_CONS?|?LOG_PID,?0); ??????syslog(LOG_USER?|?LOG_INFO,?"syslog?test?message?generated?in?program?%s?\n",?argv[0]); ??????closelog(); ??????return?0; ??}?? ?
編譯生成可執行文件后,每運行一次,程序將往/var/log/messages添加一條如下的記錄:
Apr?23?17:15:15?lirong-920181?testsyslog[27214]:?syslog?test?message?generated?in?program?./a.out?? ?
格式基本是:timestamp hostname ident[pid]:log message。其中ident就是我們調用openlog是指定的"testsyslog",而之所以會打印出[27214]是openlog的option參數中指定了LOG_PID。下面我們詳細討論openlog函數中的option,facility和syslog函數中的priority參數。
根據/usr/include/sys/syslog.h文件,我們可以看到syslog支持的option如下:
??????#define?LOG_PID?????0x01????/*?log?the?pid?with?each?message?*/??#define?LOG_CONS????????????0x02????/*?log?on?the?console?if?errors?in?sending?*/??#define?LOG_ODELAY??0x04????/*?delay?open?until?first?syslog()?(default)?*/??#define?LOG_NDELAY??0x08????/*?don't?delay?open?*/??#define?LOG_NOWAIT??0x10????/*?don't?wait?for?console?forks:?DEPRECATED?*/??#define?LOG_PERROR??0x20????/*?log?to?stderr?as?well?*/?? 我們可以通過與操作結合這些option。syslog支持的faclility如下:
?#define?LOG_KERN????????????(0<<3)????/*?kernel?messages?*/??#define?LOG_USER????????????(1<<3)????/*?random?user-level?messages?*/??#define?LOG_MAIL????????????(2<<3)????/*?mail?system?*/??#define?LOG_DAEMON??(3<<3)????/*?system?daemons?*/??#define?LOG_AUTH????????????(4<<3)????/*?security/authorization?messages?*/??#define?LOG_SYSLOG??(5<<3)????/*?messages?generated?internally?by?syslogd?*/??#define?LOG_LPR?????(6<<3)????/*?line?printer?subsystem?*/??#define?LOG_NEWS????????????(7<<3)????/*?network?news?subsystem?*/??#define?LOG_UUCP????????????(8<<3)????/*?UUCP?subsystem?*/??#define?LOG_CRON????????????(9<<3)????/*?clock?daemon?*/??#define?LOG_AUTHPRIV????(10<<3)???/*?security/authorization?messages?(private)?*/??#define?LOG_FTP?????(11<<3)???/*?ftp?daemon?*/?? facility的ID(上面對應的數值)與名字的對應關系如下:
{?"auth",?LOG_AUTH?}, ??{?"authpriv",?LOG_AUTHPRIV?}, ??{?"cron",?LOG_CRON?}, ??{?"daemon",?LOG_DAEMON?}, ??{?"ftp",?LOG_FTP?}, ??{?"kern",?LOG_KERN?}, ??{?"lpr",?LOG_LPR?}, ??{?"mail",?LOG_MAIL?}, ??{?"mark",?INTERNAL_MARK?},????????{?"news",?LOG_NEWS?}, ??{?"security",?LOG_AUTH?},?????????{?"syslog",?LOG_SYSLOG?}, ??{?"user",?LOG_USER?}, ??{?"uucp",?LOG_UUCP?},?? 這個對應關系作用是是將syslog系統調用中facility ID和syslog.conf文件中的配置選項對應起來。后面將詳細講解。facility的作用是指明調用syslog應用的類型。syslog支持的priority如下:
#define?LOG_EMERG???0???/*?system?is?unusable?*/??#define?LOG_ALERT???1???/*?action?must?be?taken?immediately?*/??#define?LOG_CRIT????????????2???/*?critical?conditions?*/??#define?LOG_ERR?????3???/*?error?conditions?*/??#define?LOG_WARNING?4???/*?warning?conditions?*/??#define?LOG_NOTICE??5???/*?normal?but?significant?condition?*/??#define?LOG_INFO????????????6???/*?informational?*/??#define?LOG_DEBUG???7???/*?debug-level?messages?*/?? priority的ID(上面對應的數值)與名字的對應關系如下:
{?"alert",?LOG_ALERT?}, ??{?"crit",?LOG_CRIT?}, ??{?"debug",?LOG_DEBUG?}, ??{?"emerg",?LOG_EMERG?}, ??{?"err",?LOG_ERR?}, ??{?"error",?LOG_ERR?},?????????{?"info",?LOG_INFO?}, ??{?"none",?INTERNAL_NOPRI?},???????{?"notice",?LOG_NOTICE?}, ??{?"panic",?LOG_EMERG?},???????{?"warn",?LOG_WARNING?},??????????{?"warning",?LOG_WARNING?},?? 這個對應關系的作用和facility情況是相同的,都是為了與syslog.conf文件中的配置選項對應起來。priority的作用是指明日記記錄的優先級,也可以理解成記錄時間的嚴重程度。在實際使用中,syslog函數中的priority參數實際上是前面提到的facility和priority的組合,通過與操作。
回到前面提到的syslog.conf文件和testsyslog的程序,根據前面的分析,我們來研究一下為什么testsyslog會將日記記錄寫到文件/var/log/messages中,而不是別的文件。
syslog.conf文件行的基本語法是這樣的:
[消息類型(規則)]???? [處理方案(日記文件)]
這里需要注意的是,兩者之間必須用一個或者多個Tab字符分開。消息類型是由”消息來源“(facility)和”緊急程度“(priority)構成,中間點號連接。如前面syslog.conf文件中的news.crit表示來自news的”關鍵“狀況。這里,news表示消息來源,crit表示關鍵狀況。通配符*表示一切消息來源,如第一條規則:*.info,將info級以上(notice,warning, err, alert, emerg)(priority表)的所有消息發送到日記文件/var/log/messages。而testsyslog程序中,調用syslog函數時指定的priority是LOG_USER | LOG_INFO,根據上面提到的ID和名字對應的關系,對應的消息類型規則是user.info,包含在規則*.info中,所以日記記錄會寫到/var/log/messages。
修改syslog.conf文件
一般來說,我們希望能夠為自己的應用程序指定特定的日記文件。這時候,我們就需要修改syslog.conf文件。假設我們現在要把調試(debug)日記記錄寫到文件/var/log/debug文件中。第一步要做的是,在syslog.conf文件添加如下消息規則作為第一條規則:
user.debug??????????????????/var/log/debug?? 要是添加的新規則生效,第二步我們需要重啟syslogd和klogd:service syslog restart(ubuntu下為/etc/init.d/rsyslog restart)
為了測試新規則是否生效,我們可以將testsyslog修改如下:
#include?<syslog.h>?????int?main(int?argc,?char?*argv[]) ??{ ??????openlog("testsyslog",?LOG_CONS?|?LOG_PID,?0); ??????syslog(LOG_USER?|?LOG_DEBUG,?"syslog?test?message?generated?in?program?%s?\n",?argv[0]); ??????closelog(); ??????return?0; ??}?? 編譯生成執行文件后,每運行一次,/var/log/debug文件都會增加一條新的記錄
總結
以上是生活随笔為你收集整理的linux syslog 笔记的全部內容,希望文章能夠幫你解決所遇到的問題。
如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。