標籤:
三個函數openlog, syslog, closelog是一套系統日誌寫入介面。另外那個vsyslog和syslog功能一樣,只是參數格式不同。[喝小酒的網摘]http://blog.const.net.cn/a/17152.htm
原理:通常,syslog守護進程讀取三種格式的記錄訊息。此守護進程在啟動時讀一個設定檔。一般來說,其檔案名稱為/etc/syslog.conf(注釋:if you want to redirect log to other place,you need to change this),該檔案決定了不同種類的訊息應送向何處。例如,緊急訊息可被送向系統管理員(若已登入),並在控制台上顯示,而警告訊息則可記錄到一個檔案中。該機制提供了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();
return 0;
}
編譯產生可執行程式後,運行一次程式將向/var/log/message檔案添加一行資訊如下:
Feb 12 08:48:38 localhost MyMsgMARK[7085]: This is a syslog test message 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
Write directly to system console if there is an error while sending to systemlogger.
LOG_NDELAY
Open the connection immediately (normally, the connection is opened when the first message is logged).
LOG_NOWAIT
Don’t wait for child processes that may have been created while logging the message. (The GNU C library does not create a
child process, so this option has no effect on Linux.)
LOG_ODELAY
The converse of LOG_NDELAY; opening of the connection is delayed until syslog() is called. (This is the default, and need
not be specified.)
LOG_PERROR
(Not in SUSv3.) Print to stderr as well.
LOG_PID
Include PID with each message.感覺更多的是方便調試。
第三個參數指明記錄日誌的程式的類型。
syslog函數及參數
syslog函數用於把日誌訊息發給系統程式syslogd去記錄,此函數原型是:
void syslog(int priority, const char *format, ...);
第一個參數是訊息的緊急層級,第二個參數是訊息的格式,之後是格式對應的參數。就是printf函數一樣使用。
如果我們的程式要使用系統日誌功能,只需要在程式啟動時使用openlog函數來串連syslogd程式,後面隨時用syslog函數寫日誌就行了
每個syslog訊息被賦予下面的主要裝置之一:
LOG_AUTH——認證系統:login、su、getty等
LOG_AUTHPRIV——同LOG_AUTH,但只登入到所選擇的單個使用者可讀的檔案中
LOG_CRON——cron守護進程
LOG_DAEMON——其他系統守護進程,如routed
LOG_FTP——檔案傳輸通訊協定:ftpd、tftpd
LOG_KERN——核心產生的訊息
LOG_LPR——系統印表機緩衝池:lpr、lpd
LOG_MAIL——電子郵件系統
LOG_NEWS——網路新聞系統
LOG_SYSLOG——由syslogd(8)產生的內部訊息
LOG_USER——隨機使用者進程產生的訊息
LOG_UUCP——UUCP子系統
LOG_LOCAL0~LOG_LOCAL7——為本地使用保留
Syslog為每個事件賦予幾個不同的優先順序:
LOG_EMERG——緊急情況
LOG_ALERT——應該被立即改正的問題,如系統資料庫破壞
LOG_CRIT——重要情況,如硬碟錯誤
LOG_ERR——錯誤
LOG_WARNING——警告資訊
LOG_NOTICE——不是錯誤情況,但是可能需要處理
LOG_INFO——情報資訊
LOG_DEBUG——包含情報的資訊,通常旨在調試一個程式時使用
syslog.conf 檔案指明syslogd程式紀錄日誌的行為,該程式在啟動時查詢設定檔。該檔案由不同程式或訊息分類的單個條目組成,每個佔一行。對每類訊息提供一個選 擇域和一個動作域。這些域由tab隔開:選擇域指明訊息的類型和優先順序;動作域指明syslogd接收到一個與選擇標準相匹配的訊息時所執行的動作。每個 選項是由裝置和優先順序組成。當指明一個優先順序時,syslogd將紀錄一個擁有相同或更高優先順序的訊息。所以如果指明"crit",那所有標為crit、alert和emerg的訊息將被紀錄。每行的行動域指明當選擇域選擇了一個給定訊息後應該把他發送到哪兒。例如,如果想把所有郵件訊息紀錄到一個檔案中,如下:
#Log all the mail messages in one place
mail.* /var/log/maillog
其他裝置也有自己的日誌。UUCP和news裝置能產生許多外部訊息。它把這些訊息存到自己的日誌(/var/log/spooler)中並把層級限為"err"或更高。例如:
# Save mail and news errors of level err and higher in aspecial file.
uucp,news.crit /var/log/spooler
當一個緊急訊息到來時,可能想讓所有的使用者都得到。也可能想讓自己的日誌接收並儲存。
#Everybody gets emergency messages, plus log them on anther machine
*.emerg *
*.emerg @linuxaid.com.cn
alert訊息應該寫到root和tiger的個人帳號中:
#Root and Tiger get alert and higher messages
*.alert root,tiger
有時syslogd將產生大量的訊息。例如核心("kern"裝置)可能很冗長。使用者可能想把核心訊息紀錄到/dev/console中。下面的例子表明核心日誌紀錄被注釋掉了:
#Log all kernel messages to the console
#Logging much else clutters up the screen
#kern.* /dev/console
使用者可以在一行中指明所有的裝置。下面的例子把info或更進階別的訊息送到/var/log/messages,除了mail以外。層級"none"禁止一個裝置:
#Log anything(except mail)of level info or higher
#Don‘t log private authentication messages!
*.info:mail.none;authpriv.none /var/log/messages
在有些情況下,可以把日誌送到印表機,這樣網路入侵者怎麼修改日誌都沒有用了。通常要廣泛紀錄日誌。Syslog裝置是一個攻擊者的顯著目標。一個為其他主機維護日誌的系統對於防範伺服器攻擊特別脆弱,因此要特別注意。
有個小命令logger為syslog(3)系統記錄檔提供一個shell命令介面,使使用者能建立記錄檔中的條目。用法:logger 例如:logger This is a test!
它將產生一個如下的syslog紀錄:Aug 19 22:22:34 tiger: This is a test!
注意不要完全相信日誌,因為攻擊者很容易修改它的。[喝小酒的網摘]http://blog.const.net.cn/a/17152.htm
轉載自 [blog.const.net.cn]喝小酒的網摘 及本文連結地址:http://blog.const.net.cn/a/17152.htm
linux系統日誌函數syslog,openlog,closelog函數