一臺服務器的日誌對系統工程師來講是相當重要的,一旦服務器出現故障或被入侵,咱們須要查看日誌來定位問題的關鍵所在,因此說對於線上跑的服務器而言日誌應該合理的處理及管理.下面來介紹下linux系統的syslog日誌服務器. linux
centos 6.x 的syslogd被更名爲rsyslogd, 其默認的配置文件是/etc/rsyslog.conf
配置文件定義格式爲
正則表達式
[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 # 用戶自定義使用 * # *表示全部的facilitypriority表示日誌級別 (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詳解 緩存
開源版本的主頁 http://www.balabit.com/network-security/syslog-ng/opensource-logging-system/overview 安全
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
- ------------------------------------------------------------
此時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
# 全局選項,多個選項時用分好";"隔開 options { .... }; # 定義日誌源 source s_name { ... }; # 定義過濾規則,規則可使用正則表達式來定義,這裏是可選的,不定義也不要緊 filter f_name { ... }; # 定義目標 destination d_name { ... }; # 定義消息鏈能夠將多個源,多個過濾規則及多個目標定義爲一條鏈 log { ... };下面詳細解釋一下每一個組成部分的含義:
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); };
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)); };
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); };
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 { 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 { ... };"
這樣以來一條日誌就根據你的意思來處理了,須要注意的是一條日誌消息過了以後,會匹配定義的全部配置,並非匹配到之後就再也不往下匹配了. 服務器
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); };