天天看點

Linux系統日志及日志分析

Linux系統擁有非常靈活和強大的日志功能,可以儲存幾乎所有的操作記錄,并可以從中檢索出我們需要的資訊。

大部分Linux發行版預設的日志守護程序為 syslog,位于 /etc/syslog 或 /etc/syslogd,預設配置檔案為 /etc/syslog.conf,任何希望生成日志的程式都可以向 syslog 發送資訊。 

Linux系統核心和許多程式會産生各種錯誤資訊、警告資訊和其他的提示資訊,這些資訊對管理者了解系統的運作狀态是非常有用的,是以應該把它們寫到日志檔案中去。完成這個過程的程式就是syslog。syslog可以根據日志的類别和優先級将日志儲存到不同的檔案中。例如,為了友善查閱,可以把核心資訊與其他資訊分開,單獨儲存到一個獨立的日志檔案中。預設配置下,日志檔案通常都儲存在“/var/log”目錄下。

日志類型font

下面是常見的日志類型,但并不是所有的Linux發行版都包含這些類型:

類型 說明

auth 使用者認證時産生的日志,如login指令、su指令。

authpriv 與 auth 類似,但是隻能被特定使用者檢視。

console 針對系統控制台的消息。

cron 系統定期執行計劃任務時産生的日志。

daemon 某些守護程序産生的日志。

ftp FTP服務。

kern 系統核心消息。

local0.local7 由自定義程式使用。

lpr 與列印機活動有關。

mail 郵件日志。

mark 産生時間戳。系統每隔一段時間向日志檔案中輸出目前時間,每行的格式類似于 May 26 11:17:09 rs2 -- MARK --,可以由此推斷系統發生故障的大概時間。

news 網絡新聞傳輸協定(nntp)産生的消息。

ntp 網絡時間協定(ntp)産生的消息。

user 使用者程序。

uucp UUCP子系統。

日志優先級

常見的日志優先級請見下标:

優先級 說明

emerg 緊急情況,系統不可用(例如系統崩潰),一般會通知所有使用者。

alert 需要立即修複,例如系統資料庫損壞。

crit 危險情況,例如硬碟錯誤,可能會阻礙程式的部分功能。

err 一般錯誤消息。

warning 警告。

notice 不是錯誤,但是可能需要處理。

info 通用性消息,一般用來提供有用資訊。

debug 調試程式産生的資訊。

none 沒有優先級,不記錄任何日志消息。

常見日志檔案

所有的系統應用都會在 /var/log 目錄下建立日志檔案,或建立子目錄再建立日志檔案。例如:

檔案/目錄 說明

/var/log/boot.log 開啟或重新開機日志。

/var/log/cron 計劃任務日志

/var/log/maillog 郵件日志。

/var/log/messages 該日志檔案是許多程序日志檔案的彙總,從該檔案可以看出任何入侵企圖或成功的入侵。

/var/log/httpd 目錄 Apache HTTP 服務日志。

/var/log/samba 目錄 samba 軟體日志

/etc/syslog.conf 檔案

/etc/syslog.conf 是 syslog 的配置檔案,會根據日志類型和優先級來決定将日志儲存到何處。典型的 syslog.conf 檔案格式如下所示:

*.err;kern.debug;auth.notice /dev/console

daemon,auth.notice           /var/log/messages

lpr.info                     /var/log/lpr.log

mail.*                       /var/log/mail.log

ftp.*                        /var/log/ftp.log

auth.*                       @see.xidian.edu.cn

auth.*                       root,amrood

netinfo.err                  /var/log/netinfo.log

install.*                    /var/log/install.log

*.emerg                      *

*.alert                      |program_name

mark.*                       /dev/console

第一列為日志類型和日志優先級的組合,每個類型和優先級的組合稱為一個選擇器;後面一列為儲存日志的檔案、伺服器,或輸出日志的終端。syslog 程序根據選擇器決定如何記錄檔。

對配置檔案的幾點說明:

日志類型和優先級由點号(.)分開,例如 kern.debug 表示由核心産生的調試資訊。

kern.debug 的優先級大于 debug。

星号(*)表示所有,例如 *.debug 表示所有類型的調試資訊,kern.* 表示由核心産生的所有消息。

可以使用逗号(,)分隔多個日志類型,使用分号(;)分隔多個選擇器。

對日志的操作包括:

将日志輸出到檔案,例如 /var/log/maillog 或 /dev/console。

将消息發送給使用者,多個使用者用逗号(,)分隔,例如 root, amrood。

通過管道将消息發送給使用者程式,注意程式要放在管道符(|)後面。

将消息發送給其他主機上的 syslog 程序,這時 /etc/syslog.conf 檔案後面一列為以@開頭的主機名,例如@see.xidian.edu.cn。

logger 指令

logger 是Shell指令,可以通過該指令使用 syslog 的系統日志子產品,還可以從指令行直接向系統日志檔案寫入一行資訊。

logger指令的文法為:

logger [-i] [-f filename] [-p priority] [-t tag] [message...]

每個選項的含義如下:

選項 說明

-f filename 将 filename 檔案的内容作為日志。

-i 每行都記錄 logger 程序的ID。

-p priority 指定優先級;優先級必須是形如 facility.priority 的完整的選擇器,預設優先級為 user.notice。

-t tag 使用指定的标簽标記每一個記錄行。

message 要寫入的日志内容,多條日志以空格為分隔;如果沒有指定日志内容,并且 -f filename 選項為空,那麼會把标準輸入作為日志内容。

例如,将ping指令的結果寫入日志:

$ ping 192.168.0.1 | logger -it logger_test -p local3.notice&

$ tail -f /var/log/userlog

Oct 6 12:48:43 kevein logger_test[22484]: PING 192.168.0.1 (192.168.0.1) 56(84) bytes of data.

Oct 6 12:48:43 kevein logger_test[22484]: 64 bytes from 192.168.0.1: icmp_seq=1 ttl=253 time=49.7 ms

Oct 6 12:48:44 kevein logger_test[22484]: 64 bytes from 192.168.0.1: icmp_seq=2 ttl=253 time=68.4 ms

Oct 6 12:48:45 kevein logger_test[22484]: 64 bytes from 192.168.0.1: icmp_seq=3 ttl=253 time=315 ms

Oct 6 12:48:46 kevein logger_test[22484]: 64 bytes from 192.168.0.1: icmp_seq=4 ttl=253 time=279 ms

Oct 6 12:48:47 kevein logger_test[22484]: 64 bytes from 192.168.0.1: icmp_seq=5 ttl=253 time=347 ms

Oct 6 12:48:49 kevein logger_test[22484]: 64 bytes from 192.168.0.1: icmp_seq=6 ttl=253 time=701 ms

Oct 6 12:48:50 kevein logger_test[22484]: 64 bytes from 192.168.0.1: icmp_seq=7 ttl=253 time=591 ms

Oct 6 12:48:51 kevein logger_test[22484]: 64 bytes from 192.168.0.1: icmp_seq=8 ttl=253 time=592 ms

Oct 6 12:48:52 kevein logger_test[22484]: 64 bytes from 192.168.0.1: icmp_seq=9 ttl=253 time=611 ms

Oct 6 12:48:53 kevein logger_test[22484]: 64 bytes from 192.168.0.1: icmp_seq=10 ttl=253 time=931 ms

ping指令的結果成功輸出到 /var/log/userlog 檔案。

指令 logger -it logger_test -p local3.notice 各選項的含義:

-i:在每行都記錄程序ID;

-t logger_test:每行記錄都加上“logger_test”這個标簽;

-p local3.notice:設定日志類型和優先級。

日志轉儲

日志轉儲也叫日志回卷或日志輪轉。Linux中的日志通常增長很快,會占用大量硬碟空間,需要在日志檔案達到指定大小時分開存儲。

syslog 隻負責接收日志并儲存到相應的檔案,但不會對日志檔案進行管理,是以經常會造成日志檔案過大,尤其是WEB伺服器,輕易就能超過1G,給檢索帶來困難。

大多數Linux發行版使用 logrotate 或 newsyslog 對日志進行管理。logrotate 程式不但可以壓縮日志檔案,減少存儲空間,還可以将日志發送到指定 E-mail,友善管理者及時檢視日志。

例如,規定郵件日志 /var/log/maillog 超過1G時轉儲,每周一次,那麼每隔一周 logrotate 程序就會檢查 /var/log/maillog 檔案的大小:

如果沒有超過1G,不進行任何操作。

如果在1G~2G之間,就會建立新檔案 /var/log/maillog.1,并将多出的1G日志轉移到該檔案,以給 /var/log/maillog 檔案瘦身。

如果在2G~3G之間,會繼續建立新檔案 /var/log/maillog.2,并将 /var/log/maillog.1 的内容轉移到該檔案,将 /var/log/maillog 的内容轉移到 /var/log/maillog.1,以保持 /var/log/maillog 檔案不超過1G。

可以看到,每次轉存都會建立一個新檔案(如果不存在),命名格式為日志檔案名加一個數字(從1開始自動增長),以保持目前日志檔案和轉存後的日志檔案不超過指定大小。

logrotate 的主要配置檔案是 /etc/logrotate.conf,/etc/logrotate.d 目錄是對 /etc/logrotate.conf 的補充,或者說為了不使 /etc/logrotate.conf 過大而設定。

可以通過 cat 指令檢視它的内容:

$cat /etc/logrotate.conf

# see "man logrotate" for details  //可以檢視幫助文檔

# rotate log files weekly

weekly                             //設定每周轉儲一次

# keep 4 weeks worth of backlogs

rotate 4                           //最多轉儲4次

# create new (empty) log files after rotating old ones

create                             //當轉儲後檔案不存儲時建立它

# uncomment this if you want your log files compressed

#compress                          //以壓縮方式轉儲

# RPM packages drop log rotation information into this directory

include /etc/logrotate.d           //其他日志檔案的轉儲方式,包含在該目錄下

# no packages own wtmp -- we'll rotate them here

/var/log/wtmp {                    //設定/var/log/wtmp日志檔案的轉儲參數

    monthly                        //每月轉儲

    create 0664 root utmp          //轉儲後檔案不存在時建立它,檔案所有者為root,所屬組為utmp,對應的權限為0664

    rotate 1                       //最多轉儲一次

}

注意:include 允許管理者把多個分散的檔案集中到一個,類似于C語言的 #include,将其他檔案的内容包含進目前檔案。

include 非常有用,一些程式會把轉儲日志的配置檔案放在 /etc/logrotate.d 目錄,這些配置檔案會覆寫或增加 /etc/logrotate.conf 的配置項,如果沒有指定相關配置,那麼采用 /etc/logrotate.conf 的預設配置。

是以,建議将 /etc/logrotate.conf 作為預設配置檔案,第三方程式在 /etc/logrotate.d 目錄下自定義配置檔案。

logrotate 也可以作為指令直接運作來修改配置檔案。

繼續閱讀