syslog及syslog-ng詳解

    一臺服務器的日誌對系統工程師來講是相當重要的,一旦服務器出現故障或被入侵,咱們須要查看日誌來定位問題的關鍵所在,因此說對於線上跑的服務器而言日誌應該合理的處理及管理.下面來介紹下linux系統的syslog日誌服務器. linux

1、syslog詳解

1.1syslog簡介

    syslog 系統日誌記錄着linux系統啓動及運行的過程當中產生的信息, RHEL 5.x系統上默認自帶了syslog 的配置文件是/etc/syslog.conf. syslog默認有兩個守護進程,klogd,syslogd。klogd 進程是記錄系統運行的過程當中內核生成的日誌,而在系統啓動的過程當中內核初始化過程當中 生成的信息記錄到控制檯(/dev/console)當系統啓動完成以後會把此信息存放到/var/log/dmesg文件中,我能夠經過cat /var/log/dmesg查看這個文件,也能夠經過dmesg命令來查看. syslogd 進程是記錄非內核之外的信息。 
centos 6.x 的syslogd被更名爲rsyslogd, 其默認的配置文件是/etc/rsyslog.conf

1.2.syslog配置文件詳解

配置文件定義格式爲
正則表達式

[facility].[priority]   [action]
 其中 facility能夠理解爲日誌的來源或類別。經常使用的facility有如下幾種:
auth      # 認證相關的  
authpriv  # 權限,受權相關的  
cron      # 任務計劃相關的  
daemon    # 守護進程相關的  
kern      # 內核相關的  
lpr       # 打印相關的  
mail      # 郵件相關的  
mark      # 標記相關的  
news      # 新聞相關的  
security  # 安全相關的,與auth 相似   
syslog    # syslog本身的  
user      # 用戶相關的  
uucp      # unix to unix cp 相關的  
local0 到 local7 # 用戶自定義使用  
*         # *表示全部的facility
priority表示日誌級別 (log level),通常有如下幾種級別(從低到高):
debug           # 程序或系統的調試信息  
info            # 通常信息,  
notice          # 不影響正常功能,須要注意的消息  
warning/warn    # 可能影響系統功能,須要提醒用戶的重要事件  
err/error       # 錯誤信息  
crit            # 比較嚴重的  
alert           # 必須立刻處理的  
emerg/oanic     # 會致使系統不可用的  
*               # 表示全部的日誌級別  
none            # 跟* 相反,表示啥也沒有


action表示日誌記錄的位置: shell

系統上的絕對路徑      # 普通文件 如: /var/log/xxx  
    |              # 管道  經過管道送給其餘的命令處理  
    終端            # 終端   如:/dev/console  
    @HOST          # 遠程主機 如: @10.0.0.1       
    用戶            # 系統用戶 如: root  
    *              # 登陸到系統上的全部用戶,通常emerg級別的日誌是這樣定義的


 一些例子:
mail.info   /var/log/mail.log # 表示將mail相關的,級別爲info及  
                              # info以上級別的信息記錄到/var/log/mail.log文件中  
auth.=info  @10.0.0.1         # 表示將auth相關的,基本爲info的信息記錄到10.0.0.1主機上去  
                              # 前提是10.0.0.1要能接收其餘主機發來的日誌信息  
user.!=error                  # 表示記錄user相關的,不包括error級別的信息  
user.!error                   # 與user.error相反  
*.info                        # 表示記錄全部的日誌信息的info級別  
mail.*                        # 表示記錄mail相關的全部級別的信息  
*.*                           # 你懂的.  
cron.info;mail.info           # 多個日誌來源能夠用";" 隔開  
cron,mail.info                # 與cron.info;mail.info 是一個意思  
mail.*;mail.!=info            # 表示記錄mail相關的全部級別的信息,可是不包括info級別的


接下來去翻譯下rhel5.x系統上自帶的syslog的配置文件/etc/syslog.conf  centos

# 表示將全部facility的info級別,但不包括mail,authpriv,cron相關的信息,記錄到 /var/log/messages文件  
*.info;mail.none;authpriv.none;cron.none                /var/log/messages  
  
# 表示將權限,受權相關的全部基本的信息,記錄到/var/log/secure文件中.這個文件的權限是600  
authpriv.*                                              /var/log/secure  
  
# 表示將mail相關的全部基本的信息記錄到/var/log/maillog文件中,能夠看到路徑前面有一個"-"  
# "-" 表示異步寫入磁盤,  
mail.*                                                  -/var/log/maillog  
  
# 表示將任務計劃相關的全部級別的信息記錄到/var/log/cron文件中  
cron.*                                                  /var/log/cron  
  
# 表示將全部facility的emerg級別的信息,發送給登陸到系統上的全部用戶  
*.emerg                                                 *  
  
# 表示將uucp及news的crit級別的信息記錄到/var/log/spooler文件中  
uucp,news.crit                                          /var/log/spooler  
  
# 表示將local7的全部級別的信息記錄到/var/log/boot.log文件中,  
# 上面說過local0 到local7這8個是用戶自定義使用的,這裏的local7記錄的是系統啓動相關的信息  
local7.*                                                /var/log/boot.log

可使用tail  /var/log/messages 查看

2、syslog-ng詳解 緩存

2.1syslog-ng簡介

    syslog-ng (syslog-Next generation) 是syslog的升級版,syslog-ng有兩個版本,一個是收費的,一個是開源的,那麼做爲syslog的下一代產品,功能是可想而知,確定比syslog的功能強大的多,如
高性能
可靠的傳輸
支持多平臺
高可靠性
衆多的用戶羣體
強大的日誌過濾及排序
事件標籤和關聯性
支持最新的IETF標準
等....

2.2 syslog-ng的設計原則的:

  • 經過正規表達式協助,除支持原facitily/level方式,還支持內容過濾等以創建更好的消息過濾機制;
  • 支持主機鏈,即便日誌消息通過多重網絡轉發,仍可找到原發出主機的信息和整個消息鏈;
  • 支持強大的自定義配置,而且清晰、明瞭。 

開源版本的主頁 http://www.balabit.com/network-security/syslog-ng/opensource-logging-system/overview 安全

2.3 syslog-ng的安裝

    rhel5.x的系統上默認沒有使用syslog-ng來記錄日誌的,須要使用的話,須要本身編譯安裝,安裝方法以下
yum install gcc glib2-devel 

wget http://www.balabit.com/downloads/files/syslog-ng/sources/3.2.4/source/eventlog_0.2.12.tar.gz  
wget http://www.balabit.com/downloads/files/syslog-ng/open-source-edition/3.3.5/source/syslog-ng_3.3.5.tar.gz  

tar xvf eventlog_0.2.12.tar.gz  
cd eventlog-0.2.12  
./configure --prefix=/usr/local/eventlog  
make  
make install  
  
tar xvf syslog-ng_3.3.5.tar.gz  
cd syslog-ng-3.3.5  
export PKG_CONFIG_PATH=/usr/local/eventlog/lib/pkgconfig  
./configure --prefix=/usr/local/syslog-ng  
make  
make install
將syslog-ng添加爲系統服務, 建立並編輯/etc/init.d/syslog-ng
     

 
 
 

  
  
  
  

 
  1. ------------------------------------------------------------ 

此時syslog-ng服務已經啓動起來了,配置文件的位置在安裝目錄下的$SYSLOG_NG_HOME/etc/syslog-ng.conf bash

#!/bin/bash  
#   
# chkconfig: -  60 27  
# description: syslog-ng SysV script.   
. /etc/rc.d/init.d/functions  
  
syslog_ng=/usr/local/syslog-ng/sbin/syslog-ng  
prog=syslog-ng  
pidfile=/usr/local/syslog-ng/var/syslog-ng.pid  
lockfile=/usr/local/syslog-ng/var/syslog-ng.lock  
RETVAL=0  
STOP_TIMEOUT=${STOP_TIMEOUT-10}  
  
start() {  
        echo -n $"Starting $prog: "  
        daemon --pidfile=$pidfile $syslog_ng $OPTIONS  
        RETVAL=$?  
        echo  
        [ $RETVAL = 0 ] && touch ${lockfile}  
        return $RETVAL  
}  
  
stop() {  
    echo -n $"Stopping $prog: "  
    killproc -p $pidfile -d $STOP_TIMEOUT $syslog_ng  
    RETVAL=$?  
    echo  
    [ $RETVAL = 0 ] && rm -f $lockfile $pidfile  
}  
  
case "$1" in  
  start)  
    start  
    ;;  
  stop)  
    stop  
    ;;  
  status)  
        status -p $pidfile $syslog_ng  
    RETVAL=$?  
    ;;  
  restart)  
    stop  
    start  
    ;;  
  *)  
    echo $"Usage: $prog {start|stop|restart|status}"  
    RETVAL=2  
esac  
exit $RETVAL


chmod a+x /etc/init.d/syslog-ng  
killall syslogd  
chkconfig --add syslog-ng  
chkconfig syslog-ng on  
service syslog-ng start


syslog-ng配置文件的結構
# 全局選項,多個選項時用分好";"隔開  
options {
 ....
};  
# 定義日誌源
source s_name { 
...
};  
# 定義過濾規則,規則可使用正則表達式來定義,這裏是可選的,不定義也不要緊  
filter f_name { 
...
};  
# 定義目標  
destination d_name {
... 
};  
# 定義消息鏈能夠將多個源,多個過濾規則及多個目標定義爲一條鏈  
log { 
...
};
下面詳細解釋一下每一個組成部分的含義:
  • options選項:
    chain_hostnames(yes|no)     # 是否打開主機名鏈功能,打開後可在多網絡段轉發日誌時有效  
        long_hostnames(yes|no)      # 是chain_hostnames的別名,已不建議使用  
        keep_hostname(yes|no)       # 是否保留日誌消息中保存的主機名稱  
        use_dns(yes|no)             # 是否打開DNS查詢功能,  
        use_fqdn(yes|no)            # 是否使用完整的域名  
        check_hostname(yes|no)      # 是否檢查主機名有沒有包含不合法的字符  
        bad_hostname(regexp)        # 可經過正規表達式指定某主機的信息不被接受  
        dns_cache(yes|no)           # 是否打開DNS緩存功能  
        dns_cache_expire(n)         # DNS緩存功能打開時,一個成功緩存的過時時間  
        dns_cache_expire_failed(n)  # DNS緩存功能打開時,一個失敗緩存的過時時間  
        dns_cache_size(n)           # DNS緩存保留的主機名數量  
        create_dirs(yes|no)         # 當指定的目標目錄不存在時,是否建立該目錄  
        dir_owner(uid)              # 目錄的UID  
        dir_group(gid)              # 目錄的GID  
        dir_perm(perm)              # 目錄的權限,使用八進制方式標註,例如0644  
        owner(uid)                  # 文件的UID  
        group(gid)                  # 文件的GID  
        perm(perm)                  # 文件的權限,一樣,使用八進制方式標註  
        gc_busy_threshold(n)        # 當syslog-ng忙時,其進入垃圾信息收集狀態的時間一旦分派的對象達到這個數字,syslog-ng就啓動垃圾信息收集狀態。默認值是:3000。  
        gc_idle_threshold(n)        # 當syslog-ng空閒時,其進入垃圾信息收集狀態的時間一旦被分派的對象到達這個數字,syslog-ng就會啓動垃圾信息收集狀態,默認值是:100  
        log_fifo_size(n)            # 輸出隊列的行數  
        log_msg_size(n)             # 消息日誌的最大值(bytes)  
        mark(n)                     # 多少時間(秒)寫入兩行MARK信息供參考,目前沒有實現  
        stats(n)                    # 多少時間(秒)寫入兩行STATUS信息,默認值是:600  
        sync(n)                     # 緩存多少行的信息再寫入文件中,0爲不緩存,局部參數能夠覆蓋該值。  
        time_reap(n)                # 在沒有消息前,到達多少秒,即關閉該文件的鏈接  
        time_reopen(n)              # 對於死鏈接,到達多少秒,會從新鏈接  
        use_time_recvd(yes|no)      # 宏產生的時間是使用接受到的時間,仍是日誌中記錄的時間;建議使用R_的宏代替接收時間,S_的宏代替日誌記錄的時間,而不要依靠該值定義。
    舉例:
    options {
        long_hostnames(off);
        sync(0);
        perm(0640);
        stats(3600);
    };

  • source選項:
    file (filename)                 # 從指定的文件讀取日誌信息  
    unix-dgram  (filename)          # 打開指定的SOCK_DGRAM模式的unix套接字,接收日誌消息  
    unix-stream (filename)          # 打開指定的SOCK_STREAM模式的unix套接字,接收日誌消息  
    udp ( (ip),(port) )             # 在指定的UDP端口接收日誌消息  
    tcp ( (ip),(port) )             # 在指定的TCP端口接收日誌消息  
    sun-streams (filename)          # 在solaris系統中,打開一個(多個)指定的STREAM設備,從其中讀取日誌消息  
    internal()                      # syslog-ng內部產生的消息  
    pipe(filename),fifo(filename)   # 從指定的管道或者FIFO設備,讀取日誌信息
    舉例:
    source s_name {
        internal();
        unix-dgram("/dev/log");
        udp(ip("0.0.0.0") port(514));
    };
  • filter選項:
    facility(..)    # 根據facility(設備)選擇日誌消息,使用逗號分割多個facility  
    level(..)       # 根據level(優先級)選擇日誌消息,使用逗號分割多個level,或使用「..」表示一個範圍  
    program(表達式)    # 日誌消息的程序名是否匹配一個正則表達式  
    host(表達式)   # 日誌消息的主機名是否和一個正則表達式匹配  
    match(表達式)  # 對日誌消息的內容進行正則匹配  
    filter()        # 調用另外一條過濾規則並判斷它的值
        此外,定義規則的時候也可使用邏輯運算符and or not  
    看一個例子:
    filter f_name {
        not facility(news, mail) and not filter(f_iptables);
    };
  • destination選項:

file (filename)                 # 把日誌消息寫入指定的文件  
unix-dgram  (filename)          # 把日誌消息寫入指定的SOCK_DGRAM模式的unix套接字  
unix-stream (filename)          # 把日誌消息寫入指定的SOCK_STREAM模式的unix套接字  
udp (ip),(port)                 # 把日誌消息發送到指定的UDP端口  
tcp (ip),(port)                 # 把日誌消息發送到指定的TCP端口  
usertty(username)               # 把日誌消息發送到已經登錄的指定用戶終端窗口  
pipe(filename),fifo(filename)   # 把日誌消息發送到指定的管道或者FIFO設備  
program(parm)                   # 啓動指定的程序,並把日誌消息發送到該進程的標準輸入
舉例
destination d_name {
    file("/var/log/messages");
};
  • log說明:
    log { 
        source(s_name); 
        filter(f_name); 
        destination(d_name) 
    };

一條日誌的處理流程大概是這樣的,以下
首先是  "日誌的來源  source s_name { ... };"
而後是  "過濾規則  filter f_name { ... };"
再而後是 "消息鏈  log { source(s_name); filter(f_name); destination(d_name) };"
最後是  "目標動做  destination d_name { ... };"
這樣以來一條日誌就根據你的意思來處理了,須要注意的是一條日誌消息過了以後,會匹配定義的全部配置,並非匹配到之後就再也不往下匹配了. 服務器

2.4.syslog-ng配置文件例子
options { 
    long_hostnames(off);
    sync(0);
    perm(0640);
    stats(3600);
};  
  
source src {   
    internal();   
    unix-dgram("/dev/log");   
    # 表示日誌來源爲本機udp的514端口,  
    udp(ip("0.0.0.0") port(514));   
};  
  
filter f_iptables { 
    facility(kern) and match("IN=") and match("OUT="); 
};  
  
filter f_console {
    level(warn) and facility(kern) and not filter(f_iptables) or level(err) and not facility(authpriv); 
};
  
filter f_newsnotice {
    level(notice) and facility(news);
};
  
filter f_newscrit {
    level(crit) and facility(news);
};
  
filter f_newserr {
    level(err) and facility(news);
};
  
filter f_news {
    facility(news);
};  
  
filter f_mailinfo {
    level(info) and facility(mail);
};
  
filter f_mailwarn {
    level(warn) and facility(mail); 
};

filter f_mailerr {
    level(err, crit) and facility(mail);
};
  
filter f_mail {
    facility(mail);
};  
  
filter f_cron {
    facility(cron);
};  
  
filter f_local  {
    facility(local0, local1, local2, local3, local4,  local6, local7);
};  
  
filter f_acpid_full {
    match('^acpid:');
};
  
filter f_acpid {
    level(emerg..notice) and match('^acpid:');
}; 
  
filter f_acpid_old {
    match('^\[acpid\]:');
};  
  
filter f_netmgm {
    match('^NetworkManager:');
};  
  
filter f_messages   { not facility(news, mail) and not filter(f_iptables); };  
filter f_warn       { level(warn, err, crit) and not filter(f_iptables); };  
filter f_alert      { level(alert); };  
  
destination console  { pipe("/dev/tty10"    owner(-1) group(-1) perm(-1)); };  
log { source(src); filter(f_console); destination(console); };  
  
destination xconsole { pipe("/dev/xconsole" owner(-1) group(-1) perm(-1)); };  
log { source(src); filter(f_console); destination(xconsole); };  
  
destination newscrit   { file("/var/log/news/news.crit"  
                              owner(news) group(news)); };  
log { source(src); filter(f_newscrit); destination(newscrit); };  
  
destination newserr    { file("/var/log/news/news.err"  
                              owner(news) group(news)); };  
log { source(src); filter(f_newserr); destination(newserr); };  
  
destination newsnotice { file("/var/log/news/news.notice"  
                              owner(news) group(news)); };  
log { source(src); filter(f_newsnotice); destination(newsnotice); };  
  
destination mailinfo { file("/var/log/mail.info"); };  
log { source(src); filter(f_mailinfo); destination(mailinfo); };  
  
destination mailwarn { file("/var/log/mail.warn"); };  
log { source(src); filter(f_mailwarn); destination(mailwarn); };  
  
destination mailerr  { file("/var/log/mail.err" fsync(yes)); };  
log { source(src); filter(f_mailerr);  destination(mailerr); };  
  
destination mail { file("/var/log/mail"); };  
log { source(src); filter(f_mail); destination(mail); };  
  
destination acpid { file("/var/log/acpid"); };  
destination null { };  
log { source(src); filter(f_acpid); destination(acpid); flags(final); };  
  
log { source(src); filter(f_acpid_full); destination(null); flags(final); };  
  
log { source(src); filter(f_acpid_old); destination(acpid); flags(final); };  
  
destination netmgm { file("/var/log/NetworkManager"); };  
log { source(src); filter(f_netmgm); destination(netmgm); flags(final); };  
  
destination localmessages { file("/var/log/localmessages"); };  
log { source(src); filter(f_local); destination(localmessages); };  
  
destination messages { file("/var/log/messages"); };  
log { source(src); filter(f_messages); destination(messages); };  
  
destination firewall { file("/var/log/firewall"); };  
log { source(src); filter(f_iptables); destination(firewall); };  
  
destination warn { file("/var/log/warn" fsync(yes)); };  
log { source(src); filter(f_warn); destination(warn); };  
  
filter f_ha         { facility(local5); };  
destination hamessages { file(/var/log/ha); };  
log { source(src); filter(f_ha); destination(hamessages); };

  擴展閱讀:http://www.linuxfly.org/post/170/ 網絡

相關文章
相關標籤/搜索