syslog的配置和程式設計

2021-04-14 00:00:43 字數 4900 閱讀 3612

syslog的程式設計和配置

1. 前言

syslog是unix系統中提供的一種日誌記錄方法(rfc3164),syslog本身是乙個伺服器,程式中凡是使用syslog記錄的資訊都會傳送到該伺服器,伺服器根據配置決定此資訊是否記錄,是記錄到磁碟檔案還是其他地方,這樣使系統內所有應用程式都能以統一的方式記錄日誌,為系統日誌的統一審計提供了方便。

2. 日誌格式

syslog記錄的日誌格式為:

月 日 時:分:秒 主機名 標誌 日誌內容

3. syslog程式設計

為記錄日誌,通常用到3個函式,openlog(3),syslog(3)和closelog(3),openlog(3)和closelog(3)不是必須的,沒有openlog(3)的話將用系統預設的方式記錄日誌。

#include

void openlog( char *ident, int option, int  facility)

void syslog( int priority, char *format, ...)

void closelog( void )

openlog(3)有三個引數,第乙個引數是標誌字串,也就是日誌中的第5個字段,不設的話預設取程式名稱;

第二個引數是選項,是下面一些標誌位的組合:

log_cons:日誌資訊在寫給日誌伺服器的同時列印到終端

log_ndelay:立即記錄日誌

log_perror:把日誌資訊也輸出到標準錯誤流

log_pid:在標誌欄位中記錄程序的pid值

第三個引數是說明日誌型別的,定義了以下型別(各型別啥意思就自己看或猜吧,俺就不多說了,給出英文解釋):

log_auth:

reserved for message generated by authorisation daemon.

log_authpriv

log_cron:

reserved for message generated by the clock daemon.

log_daemon:

reserved for message generated by system daemon.

log_kern:

reserved for message generated by the system.

log_local0 through log_local7:

reserved for local use.

log_lpr:

reserved for message generated by printer system.

log_mail:

reserved for message generated by mail system.

log_news:

reserved for message generated by news system.

log_syslog               

log_user(default):

message generated by a process.

log_uucp:

reserved for message generated by uucp system.

syslog(3)函式主要的是第乙個引數priority,後面那些引數就是和printf(3)函式用法一樣了,priority值表示該條日誌的級別,日誌級別分8級,由高到低的順序為:

log_emerg:

a panic condition was reported to all processes.

log_alert:

a condition that should be corrected immediately.

log_crit:

a critical condition.

log_err:

an error message.

log_warning:

a warning message.

log_notice:

a condition requiring special handling.

log_info:

a general information message.

log_debug:

a message useful for debugging programs.

如果openlog(3)時沒有指定facility,是可以把facility的值或到priority中的,如(log_auth | log_info),已經設定了就可以不用或了。

closelog(3)這個沒啥好說的了,關閉日誌記錄。

4. syslog伺服器配置

syslog伺服器的配置檔案為/etc/syslog.conf,syslog(3)函式把想記錄的日誌資訊都傳送給日誌伺服器,但此日誌最終是否記錄到檔案或傳送給遠端伺服器,則是由此配置檔案來決定的,該配置檔案就是告訴日誌伺服器要記錄那些型別和級別的日誌,如何記錄等資訊。

配置檔案是文字檔案,每行配置分兩個字段,第一欄位是說明要記錄哪類日誌,第二欄位是說明日誌存放位置,可以是本地檔案,也可以是遠端伺服器。

第一字段:

第一字段基本格式是「facility.priority」,可以同時定義多個,中間用逗號「,」或分號「;」分隔。

facility名稱就是上面說的facility值的後半部的小寫,如news, mail,kern, cron等,也可以用「*」表示所有facility型別;

priority名稱就是上面說的priority值的後半部的小寫,如emerg, alert,err, info等,也可以用「*」表示所有priority型別,比此級別高的日誌都會自動記錄,用none表示不記錄;

舉例:kern.* : 所有級別的核心型別日誌

mail.err: 錯誤及錯誤級別以上的mail型別日誌

如果不記錄某級別的日誌,在級別前加「!」,如:

auth.info;auth.!err :info及info級別以上但不包括err級別的auth型別日誌

第二字段:

第二欄位分兩類,本地檔案和遠端伺服器

本地檔案:直接就是寫本地檔案的檔名,如 /var/log/messages。一般來說日誌資訊會立即寫到檔案中,但會降低系統效率,可以在檔名前加減號「-」表示先將資訊快取,到一定量後再一次性寫入檔案,這樣可以提高效率;

遠端伺服器:格式是

「@address」,「@」表示進行遠端記錄,將日誌傳送到遠端的日誌伺服器,日誌伺服器的埠是udp514,address可以是ip位址,也可以是網域名稱

舉例:# 將所有級別的核心日誌傳送到終端

kern.*  /dev/console 

# 將所有型別所有級別的日誌記錄到/var/log/messages檔案

*.* /var/log/messages

# 所有info級別以上的資訊,不包括mail型別所有級別和authpriv型別的err級別資訊,

# 記錄到/var/log/messages檔案,不立即寫入

*.info;mail.none;authpriv.!err       -/var/log/messages

#將所有級別的核心日誌傳送到遠端syslog伺服器

kern.*  @1.1.1.1

5. syslog伺服器

在linux下提供了sysklogd的syslog伺服器的實現,可以記錄本機日誌也可以接收(syslogd的-r選項)和**(syslogd的-h選項)來自外部的日誌。

sysklogd包括兩個程式,klogd和syslogd,klogd用於接收核心日誌,再傳送到syslogd,syslogd則可以直接接收應用程式和遠端的日誌,syslogd是通過乙個域socket(af_unix)來接收資料的,syslog()函式記錄的日誌都傳送到此域socket,socket檔案是/dev/log。

syslog(3)函式傳送給syslogd伺服器的日誌資訊前都加上了型別和級別資訊,具體格式是「」,「x」是乙個0~255的數,8位,低3位表示日誌級別,所以共8級,高五位表示日誌型別,最多32種,不過目前沒用到那麼多,可以看看/usr/include/sys/syslog.h中的定義就知道了。

要生成日誌資訊時,syslogd是先生成日誌前部資訊:月 日 時:分:秒 主機名 標誌,再和日誌內容資訊拼接起來的,日期用ctime(3)函式獲取,隱去了前4個表示星期的位元組和後面年的資訊,最終生成你所看到的日期格式,老實說那段**及其醜陋。

6. 結論

syslog方便了程式資訊的記錄,由於使用了統一的格式記錄使得審計也可以比較方便。要記錄日誌,除了在應用程式中用syslog(3)函式記錄外,還要正確配置/etc/syslog.conf檔案,使伺服器能正確記錄那些想記錄的日誌。

附:檢視系統syslog命令:# cat /var/log/messages 

實時列印syslog命令:# tail -f /var/log/messages

配置好/ect/syslog.conf檔案後,需要重啟syslog服務。命令:# service syslog restart

**中巨集定義syslog:#define syslog(lv,id,msg)         syslog(log_daemon|lv,      "%08x %s", id, msg)

**中列印syslog舉例:

snprintf(sbc_mib_logbuf, sizeof(sbc_mib_logbuf),

"mib api error:status=%d;multinum=%d(getdatawrapforsbcstatslifporttable->sapi_ie_port_stat)/n",

status,multinum

);syslog(log_err, __sbc_mib_stats_lif_port_table,sbc_mib_logbuf);

Unix主機syslog配置

將下面的內容附加到 etc syslog.conf檔案中 注意 和 之間是有空格的 ip 修改 etc services檔案中的syslog服務的埠號為上面提到的syslog監聽埠。修改syslog埠之後,重新啟動unix主機的syslog程序。附 aix的syslog服務的關閉 啟動 stopsr...

syslog遠端伺服器配置和客戶配置

1 兩台機器的系統都是linux 1.1 伺服器端配置 需要將 etc sysconfig syslog檔案中 syslogd params 變數的值設定為 r 表示接收從遠端主 機傳送過來的日誌資訊 syslogd params r 要設定只接受某個網域名稱傳送過來的日誌,就在這個變數中多加乙個引...

UNIX環境高階程式設計之syslog

核心程式可以呼叫log函式記日誌.任何使用者程序可以開啟並讀取 dev klog裝置讀取這些訊息 大多數使用者程序,呼叫syslog函式產生日誌訊息.這使得訊息傳送到unix域資料報套接字 dev log 使用者程序傳送日誌訊息到udp埠514 通常syslogd守護程序會讀取乙個配置檔案 etc ...