Linux 學習筆記(十)系統日誌

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 軟件包管理日誌

發行版本:

1.1 特殊的日誌文件

/var/log/wtmp 中包含用戶登錄系統和退出系統的記錄,也包含了表明系統何時重啓或者關機的記錄項。不過 wtmp 文件是以二進制形式保存的。只有使用 last 命令來解讀這些信息:

$ last

/var/log/lastlog 包含信息類似於 /var/log/wtmp 中的信息,但是它只記錄每個用戶上次登錄的時間。它也是一個二進制文件,使用 lastlog 命令來讀取:

$ 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 來運行。關於 cronanacron 的介紹可以參考前面的學習筆記(八)週期性進程或者閱讀關於該兩款工具的權威文章,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 默認情況下並沒有安裝該文檔的,所以你在查閱之前可能需要先安裝

$ sudo apt-get install rsyslog-doc

而在 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 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

而且想看看它是否正常工作,則運行:

$ logger -p local5.warning "test message"

含有“test message”的一行記錄項應該寫到 /tmp/evi.log 文件中,如果沒有寫入,那麼可能是忘記了給 rsyslogd 發送掛起信號。

3.4 在程序中使用 syslog

庫例程 openlogsyslogcloselog 能夠讓程序使用 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 並修改它的執行權限

$ chmod +x 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.

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章