1 Linux 的日誌文件
一般情況下,Linux 的軟件包大多將它們的日誌信息記錄到 /var/log 目錄下的文件裏,在有些發行版本上,個別日誌也保存在 /var/adm 裏。
現如今,大多數程序將它們的日誌項發到一個稱爲 rsyslogd (如果你在其他舊的資料中看到 syslog 的關鍵詞,請根據您所使用的發行版系統作相應的調整,因爲在我的 Ubuntu 10.10 和 Fedora 17 系統上默認安裝的都是 rsyslogd 並且我在系統的包管理器上再也找不到 syslog 的蹤影了)的中央清理系統。默認的 rsyslogd 配置一般將這些信息的大部分轉儲到 /var/log 中的某個地方。下表是一份主要發行系統中較爲常見的日誌文件的有關信息。除非特別說明,否則文件名都相對於 /var/log 目錄而言的。
文件 | 程序 | 發行版本 | 內容 |
---|---|---|---|
auth.log | su 等 | DU | 授權 |
apache2/* | apache2 | SDU | Apache2 http server log |
boot.log | rc 腳本 | 所有 | 系統啓動腳本的輸出 |
cron | cron | RF(DU要手動修改) | cron 的執行情況和出錯信息 |
cups/* | CUPS | 所有 | 與打印有關的信息(CUPS) |
daemon.log | 許多 | DU | 所有守護進程功能的消息 |
debug | 許多 | DU | 調試輸出 |
dmesg | 內核 | DU | 內核消息緩衝的轉儲 |
dpkg.log | dpkg | DU | 軟件包管理日誌 |
failog | login | SDU | 不成功的登錄企圖 |
httpd/log/* | httpd | RF | Apache http server log |
kern.log | 內核 | DU | 所有 kern 功能的消息 |
lastlog | login | 所有 | 每個用戶上次登錄的時間(二進制) |
mail. | mail 相關 | 所有 | 所有 mail 功能的消息 |
message | 許多 | 所有 | 經常是主要的系統日誌文件 |
rpmpkgs | cron.daily/rpm | RF | 已安裝的 RPM 軟件包清單 |
samba/* | smbd 等 | - | Samba(Windows/CIFS 文件夾共享) |
secure | sshd, sudo 等 | RF | 保密的授權信息 |
syslog | 許多 | DU | 經常是主要的系統日誌文件 |
warn | 許多 | S | 所有的警告、出錯級的信息 |
wtmp | login | 所有 | 登錄記錄(二進制) |
Xorg.n.log | Xorg | 所有 | X window server 的出錯信息 |
yum.log | yum | RF | 軟件包管理日誌 |
發行版本:
- R = Red Hat Enterprise Linux
- F = Fedora
- D = Debian
- U = Ubuntu
- S = SUSE
1.1 特殊的日誌文件
/var/log/wtmp 中包含用戶登錄系統和退出系統的記錄,也包含了表明系統何時重啓或者關機的記錄項。不過 wtmp 文件是以二進制形式保存的。只有使用 last 命令來解讀這些信息:
/var/log/lastlog 包含信息類似於 /var/log/wtmp 中的信息,但是它只記錄每個用戶上次登錄的時間。它也是一個二進制文件,使用 lastlog 命令來讀取:
2 logrotate: 管理日誌文件
Erik Troan 提供了一種優秀的工具 logrotate,它實現了多種多樣的日誌管理策略,而且在大多數的發行版本都是標準應用。當你查看你的 /var/log 目錄下發現好多以類似 “.log.1”,“.log.2.gz” 形式結尾的項的時候,那麼很多都是 logrotate 乾的好事了。
logrotate 的配置文件由一系列規範組成,它們說明了要管理的日誌文件組。默認情況下,配置文件處在 /etc/logrotate.conf 的位置,我們先來看下 Ubuntu 10.10 下默認情況下這個文件是長啥樣的:
weekly rotate 4 create include /etc/logrotate.d /var/log/wtmp { missingok monthly create 0664 root utmp rotate 1 } /var/log/btmp { missingok monthly create 0660 root utmp rotate 1 }
這一配置每週轉換一次,包含 /etc/logrotate.d 目錄下的所有配置文件。並且指定每月輪換一次 /var/log/wtmp 文件,它保持這個文件的 1 個轉換版本,新建文件的屬主爲 root 屬組爲 utmp,權限設爲 0664。
下表列出 logrotate.conf 最有用的選項,同樣適用於 /etc/logrotate.d 下的配置文件
選項 | 含義 |
---|---|
compress | 壓縮日誌文件的所有非當前版本 |
daily | 每日輪換日誌文件 |
weekly | 每週輪換日誌文件 |
monthly | 每月輪換日誌文件 |
delaycompress | 壓縮除了當前和最近之外的所有其他版本 |
endscript | 標記 prerotate 或者 postrotate 腳本結束 |
errors emailaddr | 向指定的 emailaddr 發送出錯通知郵件 |
missingok | 如果日誌不存在,不會發出報怨 |
notifempty | 如果日誌爲空,則不輪換它 |
olddir dir | 指定要放入 dir 裏的日誌文件老版本 |
postrotate | 引入在輪換過日誌之後要運行的腳本 |
prerotate | 引入在進行任何發動之前運行的腳本 |
rotate n | 在輪換方案中包括 n 個版本的日誌 |
sharedscripts | 只爲整個日誌組運行一次的腳本 |
size=logsize | 如果日誌文件大於 logsize(例如 100k, 4M)才輪換 |
logrotate 一般每天由 cron 運行一次,而在膝上機或者並非總是開着機的環境中則由 anacron 來運行。關於 cron 和 anacron 的介紹可以參考前面的學習筆記(八)週期性進程或者閱讀關於該兩款工具的權威文章,man 是一個不錯的選擇,當然如果您手頭上也有一本《Linux 系統管理技術手冊》的書的話那樣最好。
3 rsyslogd: 系統事件的日誌程序
如果您正在使用的是比較舊的發行版本,那麼可能您需要將 rsyslog 替換成 syslog 來看待,比如在文章中看到 rsyslogd 那麼在您的頭腦中就將它翻譯成 syslogd 這樣。不過很幸運地,在 Ubuntu 10.10 和 Fedora 17 這兩款具有代表性的發行版本上所使用的均是 rsyslogd 系統日誌程序。
我查閱了一下資料,在 RHEL 5.5 的發行版本上使用的似乎就是 syslogd,所以在閱讀以下文字的時候需要根據系統所使用的相應的程序來進行閱讀。
古人言:盡信書不如無書。
3.1 syslog 的體系結構
(這裏的 syslog 是一個概念,並非對應一個具體的程序,除非字體被加粗,否則只是一個系統日誌(syslog)的概念)
syslog 包括 3 個部分:
- rsyslogd 日誌守護進程(及其配置文件 /etc/rsyslog.conf)
- logger 一條從 shell 提交日誌記錄項的用戶級命令。
- 庫例程 openlog, syslog, closelog 用於在程序中使用 syslog
3.2 配置 rsyslogd
配置文件 /etc/rsyslog.conf 控制着 rsyslogd 的行爲。在文件的開頭部分指明瞭您可以參考的文檔的路徑,在 Ubuntu 10.10 裏是 /usr/share/doc/rsyslog-doc/html/rsyslog_conf.html,不過 Ubuntu 10.10 默認情況下並沒有安裝該文檔的,所以你在查閱之前可能需要先安裝
而在 Fedora 17 系統很幸運地默認已經安裝好了,路徑爲 /usr/share/doc/rsyslog-5.8.10/rsyslog_conf.html。具體路徑根據不同系統會有些少差別,需要根據自身使用系統的特點進行查閱。
/etc/rsyslog.conf 是一個格式相當簡單的文本文件。# 爲註釋符。基本格式爲:
selector action
例如,下面的一行:
mail.* /var/log/mail.log
將把來自電子郵件系統的信息保存在文件 /var/log/mail.log 中。
selector 用語法 [facility.level] 指明正在發送日誌消息的程序和消息的嚴重級別。
selector 可以包含特殊的關鍵字 * 和 none,其含義分別爲“所有的”和“什麼都沒有”。selector 可以包括多個用逗號分開的設備。多個 selector 可以用分號組合起來。
一般而言,selector 相互之間爲“or”的關係,和某個 selector 匹配的消息將由同一行的 action 處理。但是,不管同一行中其他的 selector 是如何定義的,只要有一個帶有 none 級別的,selector 就會排除列出的設備。比如下面這句
*.*;auth,authpriv.none -/var/log/syslog
意思就是將所有的系統信息記錄到 /var/log/syslog 中但除了 auth 和 authpriv 的信息。
下表列出了有效的設備名。
設備(facility) | 使用該設備的程序 |
---|---|
* | 除了“mark”以外的所有設備 |
auth | 與安全和授權有關的命令 |
authpriv | 敏感、保密的授權信息 |
cron | 守護進程 cron |
daemon | 系統守護進程 |
ftp | FTP 守護進程,*ftpd* |
kern | 內核 |
local0-7 | 本地消息的 8 種類型 |
lpr | 行式打印機的假脫機系統 |
mail 相關軟件 | |
mark | 定期產生的時間戳 |
news | Usernet 新聞系統 |
syslog | rsyslogd 內部消息 |
user | 用戶進程 |
uucp | 爲 UUCP 保留,並未使用 |
syslog 的嚴重性級別按照重要性遞減的順序排列如下表:
級別 | 大致含義 |
---|---|
emerg | 恐慌狀態 |
alert | 緊急狀態 |
crit | 臨界狀態 |
err | 錯誤情況 |
warning | 警告消息 |
notice | 需要調查的事項 |
info | 提供信息的消息 |
debug | 僅供調試 |
Linux 版的 syslog 對基本語法做了改進,它也允許在優先級前面加上字符 = 和 !,分別表示“僅此優先級”和“除此優先級及其以上級別”的意思。下表給出了一些例子:
選擇符 | 含義 |
---|---|
mail.info | 選擇與郵件相關的優先級爲 info 或者更高的消息 |
mail.=info | 只選擇優先級爲 info 的消息 |
mail.info;mail.!err | 只選擇優先級爲 info 以上,err 以下的消息 |
mail.debug;mail.!=warning | 選擇除 warning 之外的所有優先級 |
action 字段說明如何處理一則消息。下表列出可以選擇的處理方法:
動作(Action) | 含義 |
---|---|
filename | 把消息寫入本地機器上的一個文件裏 |
@hostname | 把消息轉發給主機 hostname 上的 rsyslogd |
@ipaddress | 把消息轉發給 IP 地址爲 ipaddress 的主機 |
fifoname | 把消息寫入有名管道 fifoname |
user1,user2 | 如果用戶登錄到了系統上,那麼就把消息寫在用戶的屏幕上 |
* | 把消息寫給目前已經登錄的所有用戶 |
您可以在 filename 動作之前加一個短劃線“-”,表示在寫完每條日誌記錄項後,不應該對文件系統執行 sync 操作,執行 sync 有助於在發生崩潰的時候儘可能多地保留日誌信息,但是從磁盤吞吐上來看,代價又太大了。
3.3 調試 syslog
logger 命令用於從 shell 腳本提交日誌項。用戶也可以用它來檢測 rsyslogd 的配置文件的變化。例如,如果已經添加了一行:
local5.warning /tmp/evi.log
而且想看看它是否正常工作,則運行:
含有“test message”的一行記錄項應該寫到 /tmp/evi.log 文件中,如果沒有寫入,那麼可能是忘記了給 rsyslogd 發送掛起信號。
3.4 在程序中使用 syslog
庫例程 openlog,syslog 和 closelog 能夠讓程序使用 syslog 系統。這些庫例程有 C、Perl、Python 和 PHP 版本,我在這裏以 python 做個示例:
#! /usr/bin/python
# -*- coding: utf-8 -*-
import syslog
syslog.openlog('logdemo', syslog.LOG_PID | syslog.LOG_CONS, syslog.LOG_USER)
syslog.syslog(syslog.LOG_INFO, "This is a logdemo test for syslog")
syslog.closelog()
選擇你喜愛的編輯器,emacs 或者 vi,將上面的代碼添加上去,然後將文件保存成 logdemo 並修改它的執行權限
運行之後就應該在 /var/log/messages 或者 /var/log/syslog(Ubuntu)文件中看到產生的日誌記錄:
Dec 22 22:23:34 bluebird-system logdemo[8109]: This is a logdemo test for syslog
Enjoy & Have fun.