flume1.6 + syslogtcp + kafka 日誌採集(二)

syslog配置詳解:html

http://www.360doc.com/content/14/0313/09/16243542_360179097.shtmllinux

 

1. 前言編程

syslog是UNIX系統中提供的一種日誌記錄方法(RFC3164),syslog自己是一個服務器,程序中凡是使用syslog記錄的信息都會發送到該服務器,服務器根據配置決定此信息是否記錄,是記錄到磁盤文件仍是其餘地方,這樣使系統內全部應用程序都能以統一的方式記錄日誌,爲系統日誌的統一審計提供了方便。緩存

 

2. 日誌格式服務器

 

syslog記錄的日誌格式爲:socket

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

 

3. syslog編程函數

 

爲記錄日誌,一般用到3個函數,openlog(3),syslog(3)和closelog(3),openlog(3)和closelog(3)不是必須的,沒有openlog(3)的話將用系統缺省的方式記錄日誌。日誌

 

      #include <syslog.h>orm

      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值

第三個參數是說明日誌類型的,定義瞭如下類型:


  

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

 

若是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>」,「x」是一個0~255的數,8位,低3位表示日誌級別,因此共8級,高五位表示日誌類型,最多32種,不過目前沒用到那麼多,能夠看看/usr/include/sys/syslog.h中的定義就知道了。

 

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

 

6. 結論

 

syslog方便了程序信息的記錄,因爲使用了統一的格式記錄使得審計也能夠比較方便。要記錄日誌,除了在應用程序中用syslog(3)函數記錄外,還要正確配置/etc/syslog.conf文件,使服務器能正確記錄那些想記錄的日誌。

相關文章
相關標籤/搜索