Linux系統內核和許多程序會產生各種錯誤信息、警告信息和其他的提示信息,這些信息對管理員了解系統的運行狀態是非常有用的,所以應該把它們寫到日志文件中去。完成這個過程的程序就是syslog。syslog可以根據日志的類別和優先級將日志保存到不同的文件中。例如,為了方便查閱,可以把內核信息與其他信息分開,單獨保存到一個獨立的日志文件中。默認配置下,日志文件通常都保存在“/var/log”目錄下。
*.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 [-i] [-f filename] [-p priority] [-t tag] [message...]每個選項的含義如下:
$ 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發行版使用 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 也可以作為命令直接運行來修改配置文件。