1. 程式人生 > >linux日誌系統介紹 —— syslog(),openlog(),closelog()

linux日誌系統介紹 —— syslog(),openlog(),closelog()

post sts 接口 不同 create ger bsp pri logging

函數使用介紹


這裏面的三個函數openlog, syslog。closelog是一套系統日誌寫入接口。另外那個vsyslog和syslog功能一樣,僅僅是參數格式不同。

通常。syslog守護進程讀取三種格式的記錄消息。

此守護進程在啟動時讀一個配置文件。一般來說,其文件名稱為/etc/syslog.conf,該文件決定了不同種類的消息應送向何處。比如。緊急消息可被送向系統管理員(若已登錄),並在控制臺上顯示。而警告消息則可記錄到一個文件裏。

該機制提供了syslog函數。其調用格式例如以下

#include <syslog.h>
void openlog (char*ident,int option ,int facility);
void syslog(int priority,char*format,……)
void closelog();


調用openlog是可選擇的。

假設不調用openlog,則在第一次調用syslog時,自己主動調用openlog。調用closelog也是可選擇的,它僅僅是關閉被用於與syslog守護進程通信的描寫敘述符。調用openlog使我們能夠指定一個ident。以後, 此ident 將被加至每則記錄消息中。ident 通常是程序的名稱(比如 ,cron 。ine等)


程序的使用方法演示樣例代碼例如以下:

#include <syslog.h>
int main(int argc, char **argv)
{
   openlog("MyMsgMARK", LOG_CONS | LOG_PID, 0);
   syslog(LOG_DEBUG,
          "This is a syslog test message generated by program ‘%s‘\n",
          argv[0]);
   closelog();
   return0;
}

編譯生成可運行程序後,運行一次程序將向/var/log/message文件加入一行信息例如以下:
Feb 12 08:48:38 localhost MyMsgMARK[7085]: This is a syslog testmessage generated by program ‘./a.out‘

openlog及closelog函數說明


此函數原型例如以下:
void openlog(const char *ident, int option, int facility);

此函數用來打開一個到系統日誌記錄程序的連接,打開之後就能夠用syslog或vsyslog函數向系統日誌裏加入信息了。而closelog函數就是用來關閉此連接的。

openlog的參數:

第一個參數ident將是一個標記,ident所表示的字符串將固定地加在每行日誌的前面以標識這個日誌。通常就寫成當前程序的名稱以作標記。

第二個參數option是下列值取與運算的結果:LOG_CONS,LOG_NDELAY, LOG_NOWAIT。 LOG_ODELAY, LOG_PERROR,LOG_PID,各值意義請參考man openlog手冊:
LOG_CONS
Writedirectly to system console if there is an error while sending tosystem logger.

LOG_NDELAY
Openthe connection immediately (normally, the connection is opened whenthe first message is logged).

LOG_NOWAIT
Don’t wait for childprocesses that may have been created while logging themessage. (The GNU C library does not createa child process, so this option has no effect onLinux.)

LOG_ODELAY
The converseof LOG_NDELAY; opening of the connection is delayed until syslog()is called. (This is the default, and need not be specified.)

LOG_PERROR
(Notin SUSv3.) Print to stderr as well.

LOG_PID
IncludePID with each message.

第三個參數facility指明記錄日誌的程序的類型。

The facility argument is used to specify what type ofprogram is logging the message.
This lets the configuration file specify thatmessages from different facilities will be
handled differently.
LOG_AUTH security/authorization messages (DEPRECATED Use LOG_AUTHPRIVinstead)

LOG_AUTHPRIV security/authorization messages (private)

LOG_CRON clock daemon (cron and at)

LOG_DAEMON system daemons without separate facility value

LOG_FTP ftp daemon

LOG_KERN kernel messages (these can‘t be generage from user processes)

LOG_LOCAL0 through LOG_LOCAL7
reserved for local use

LOG_LPR line printer subsystem

LOG_MAIL mail subsystem

LOG_NEWS USENET news subsystem

LOG_SYSLOG messages generated internally by syslogd(8)

LOG_USER (default)
generic user-level messages

LOG_UUCP UUCP subsystem


syslog函數及參數

syslog函數用於把日誌消息發給系統程序syslogd去記錄。此函數原型是:
void syslog(int priority, const char *format, ...);
第一個參數是消息的緊急級別

第二個參數是消息的格式,之後是格式相應的參數。就是printf函數一樣使用。

假設我們的程序要使用系統日誌功能,僅僅須要在程序啟動時使用openlog函數來連接syslogd程序。後面隨時用syslog函數寫日誌即可了。

level
This determines the importance of the message. The levels are, in order of decreasing
importance:

LOG_EMERG system is unusable

LOG_ALERT action must be taken immediately

LOG_CRIT critical conditions

LOG_ERR error conditions

LOG_WARNING warning conditions

LOG_NOTICE normal, but significant, condition

LOG_INFO informational message

LOG_DEBUG debug-level message

The function setlogmask(3) can be used to restrict logging tospecified levels only.

NOTES
The argument ident in the call of openlog() is probably storedas-is. Thus, if the
string it points to is changed, syslog() may start prepending thechanged string, and if
the string it points to ceases to exist, theresults are undefined. Most portable is to
use a string constant.

Never pass a string with user-supplied data as a format, use thefollowing instead:

syslog(priority, "%s", string);

SEE ALSO
logger(1), setlogmask(3), syslog.conf(5), syslogd(8)


***************************************************************************************************************************************************

syslog.conf文件解讀

1: syslog.conf的介紹


對於不同類型的Unix,標準UnixLog系統的設置,實際上除了一些關鍵詞的不同,系統的syslog.conf格式是同樣的。

syslog採用可配置的、統一的系統登記程序,隨時從系統各處接受log請求,然後依據/etc/syslog.conf中的預先設定把log信息寫入相應文件裏、郵寄給特定用戶或者直接以消息的方式發往控制臺。

值得註意的是,為了防止入侵者改動、刪除messages裏的記錄信息,能夠採用用打印機記錄或採用方式來挫敗入侵者的企圖。



2: syslog.conf的格式


能夠參考man [5] syslog.conf。

這裏是對syslog.conf的簡介。


/etc/syslog.conf文件裏的一項配置記錄由“選項”(selector)和“動作”(action)兩個部分組成,兩者間用tab制表符進行分隔(使用空格間隔是無效的)。

而“選項”又由一個或多個形如“類型.級別”格式的保留字段組合而成。各保留字段間用分號分隔。例如以下行所看到的:
類型.級別 [;類型.級別] `TAB` 動作

2.1 類型

保留字段中的“類型”代表信息產生的源頭,能夠是:
auth 認證系統,即詢問username和口令
cron 系統定時系統運行定時任務時發出的信息
daemon 某些系統的守護程序的syslog,如由in.ftpd產生的log
kern 內核的syslog信息
lpr 打印機的syslog信息
mail 郵件系統的syslog信息
mark 定時發送消息的時標程序
news 新聞系統的syslog信息
user 本地用戶應用程序的syslog信息
uucp uucp子系統的syslog信息
local0..7 種本地類型的syslog信息,這些信息能夠又用戶來定義

* 代表以上各種設備

2.2 級別

保留字段中的“級別”代表信息的重要性,能夠是:
emerg 緊急。處於Panic狀態。

通常應廣播到全部用戶;
alert 告警,當前狀態必須馬上進行糾正。比如。系統數據庫崩潰。
crit 關鍵狀態的警告。比如。硬件故障;
err 其他錯誤;
warning 警告。
notice 註意;非錯誤狀態的報告,但應特別處理。
info 通報信息;
debug 調試程序時的信息。

none 通常調試程序時用,指示帶有none級別的類型產生的信息無需送出。

如*.debug;mail.none表示調試時除郵件信息外其他信息都送出。

2.3 動作

“動作”域指示信息發送的目的地。能夠是:
/filename 日誌文件。

由絕對路徑指出的文件名稱。此文件必須事先建立;
@host 遠程主機; @符號後面能夠是ip,也能夠是域名,默認在/etc/hosts文件下loghost這個別名已經指定給了本機。


user1,user2 指定用戶。假設指定用戶已登錄。那麽他們將收到信息;
* 全部用戶。

全部已登錄的用戶都將收到信息。


3: 詳細實例

我們來看看/etc/syslog.conf文件裏的實例:
……
*.err;kern.debug;daemon.notice;mail.crit [TAB] /var/adm/messages
……

這行中的“action”就是我們常關心的那個/var/adm/messages文件。輸出到它的信息源頭“selector”是:
*.err - 全部的一般錯誤信息。
kern.debug - 核心產生的調試信息;
daemon.notice - 守護進程的註意信息。

mail.crit - 郵件系統的關鍵警告信息


— — 以上全部內容均來自互聯網


linux日誌系統介紹 —— syslog(),openlog(),closelog()