syslog的編程和配置

來源:互聯網
上載者:User
 1. 前言 syslog是UNIX系統中提供的一種日誌記錄方法(RFC3164),syslog本身是一個伺服器,程式中凡是使用syslog記錄的資訊都會發送到該伺服器,伺服器根據配置決定此資訊是否記錄,是記錄到磁碟檔案還是其他地方,這樣使系統內所有應用程式都能以統一的方式記錄日誌,為系統日誌的統一審計提供了方便。 2. 日誌格式 syslog記錄的日誌格式為:月 日 時:分:秒 主機名稱 標誌 日誌內容 3. syslog編程 為記錄日誌,通常用到3個函數,openlog(3),syslog(3)和closelog(3),openlog(3)和closelog(3)不是必須的,沒有openlog(3)的話將用系統預設的方式記錄日誌。       #include <syslog.h>      void openlog( char *ident, int option, int  facility)      void syslog( int priority, char *format, ...)      void closelog( void ) openlog(3)有三個參數,第一個參數是標誌字串,也就是日誌中的第5個欄位,不設的話預設取程式名稱;第二個參數是選項,是下面一些標誌位的組合:
       LOG_CONS:日誌資訊在寫給Log Service器的同時列印到終端
       LOG_NDELAY:立即記錄日誌
       LOG_PERROR:把日誌資訊也輸出到標準錯誤流
       LOG_PID:在標誌欄位中記錄進程的PID值第三個參數是說明日誌類型的,定義了以下類型(各類型啥意思就自己看或猜吧,俺就不多說了):
       LOG_AUTH
       LOG_AUTHPRIV
       LOG_CRON
       LOG_DAEMON
       LOG_KERN
       LOG_LOCAL0 through LOG_LOCAL7
       LOG_LPR
       LOG_MAIL
       LOG_NEWS
       LOG_SYSLOG
       LOG_USER(default)
       LOG_UUCP syslog(3)函數主要的是第一個參數priority,後面那些參數就是和printf(3)函數用法一樣了,priority值表示該條日誌的層級,記錄層級分8級,由高到低的順序為:
       LOG_EMERG
       LOG_ALERT
       LOG_CRIT
       LOG_ERR
       LOG_WARNING
       LOG_NOTICE
       LOG_INFO
       LOG_DEBUG如果openlog(3)時沒有指定facility,是可以把facility的值或到priority中的,如(LOG_AUTH | LOG_INFO),已經設定了就可以不用或了。 closelog(3)這個沒啥好說的了,關閉日誌記錄。4. syslog伺服器配置 syslog伺服器的設定檔為/etc/syslog.conf,syslog(3)函數把想記錄的日誌資訊都發送給Log Service器,但此日誌最終是否記錄到檔案或發送給遠程伺服器,則是由此設定檔來決定的,該設定檔就是告訴Log Service器要記錄那些類型和層級的日誌,如何記錄等資訊。 設定檔是文字檔,每行配置分兩個欄位,第一欄位是說明要記錄哪類日誌,第二欄位是說明日誌存放位置,可以是本地檔案,也可以是遠程伺服器。 第一欄位:
第一欄位基本格式是“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”,“@”表示進行遠程記錄,將日誌發送到遠端Log Service器,Log Service器的連接埠是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>”,“x”是一個0~255的數,8位,低3位表示記錄層級,所以共8級,高五位表示日誌類型,最多32種,不過目前沒用到那麼多,可以看看/usr/include/sys/syslog.h中的定義就知道了。 要組建記錄檔資訊時,syslogd是先組建記錄檔前部資訊:月 日 時:分:秒 主機名稱 標誌,再和日誌內容資訊拼接起來的,日期用ctime(3)函數擷取,隱去了前4個表示星期的位元組和後面年的資訊,最終產生你所看到的日期格式,老實說那段代碼及其醜陋。 6. 結論 syslog方便了程式資訊的記錄,由於使用了統一的格式記錄使得審計也可以比較方便。要記錄日誌,除了在應用程式中用syslog(3)函數記錄外,還要正確配置/etc/syslog.conf檔案,使伺服器能正確記錄那些想記錄的日誌。

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.