第十五章 Linux系統日志管理
系統日志詳細地記錄了在什么時間,哪臺服務器、哪個程序或服務出現了什么情況。不管是哪種操作系統,都詳細地記錄了重要程序和服務的日志,只是我們很少養成查看日志的習慣。
日志是系統信息最詳細、最準確的記錄者,如果大家能夠善用日志,那么當系統出現問題時,我們就能在第一時間發現問題,也能夠從日志中找到解決問題的方法。
很多人都覺得查看日志比較枯燥,甚至干脆看不懂,那么本章就來學習一下Linux系統的日志管理。
一、Linux rsyslogd服務及啟動方法(詳解版)
在 CentOS 6.x 中,日志服務已經由 rsyslogd 取代了原先的 syslogd。Red Hat 公司認為 syslogd 已經不能滿足工作中的需求,rsyslogd 相比 syslogd 具有一些新的特點:
- 基于TCP網絡協議傳輸日志信息。
- 更安全的網絡傳輸方式。
- 有日志信息的即時分析框架。
- 后臺數據庫。
- 在配置文件中可以寫簡單的邏輯判斷。
- 與syslog配置文件相兼容。
rsyslogd 日志服務更加先進,功能更多。但是,不論是該服務的使用,還是日志文件的格式,其實都是和 syslogd 服務相兼容的,所以學習起來基本和 syslogd 服務一致。
我們如何知道 Linux 中的 rsyslogd 服務是否啟動了呢?如何查詢 rsyslogd 服務的自啟動狀態呢?命令如下:
[root@localhost ~]# ps aux | grep "rsyslog" | grep -v "grep"
root 1139 0.0 0.2 35948 1500 ? Sl 09:40 0:00 /sbin/rsyslogd -i/var/run/syslogd.pid -c 5
#有rsyslogd服務的進程,所以這個服務已經啟動了
[root@localhost ~]# chkconfig --list | grep rsyslog
rsyslog 0:關閉 1:關閉 2:啟用 3:啟用 4:啟用 5:啟用 6:關閉
#rsyslog服務在2、3、4、5運行級別上是開機自啟動的
系統中的絕大多數日志文件是由 rsyslogd 服務來統一管理的,只要各個進程將信息給予這個服務,它就會自動地把日志按照特定的格式記錄到不同的日志文件中。也就是說,采用 rsyslogd 服務管理的日志文件,它們的格式應該是統一的。
在 Linux 系統中有一部分日志不是由 rsyslogd 服務來管理的,比如 apache 服務,它的日志是由 Apache 軟件自己產生并記錄的,并沒有調用 rsyslogd 服務。但是為了便于讀取,apache 日志文件的格式和系統默認日志的格式是一致的。
二、Linux日志文件(常見)及其功能
日志文件是重要的系統信息文件,其中記錄了許多重要的系統事件,包括用戶的登錄信息、系統的啟動信息、系統的安全信息、郵件相關信息、各種服務相關信息等。這些信息有些非常敏感,所以在 Linux 中這些日志文件只有 root 用戶可以讀取。
那么,系統日志文件保存在什么地方呢?還記得 /var/ 目錄嗎?它是用來保存系統動態數據的目錄,那么 /var/log/ 目錄就是系統日志文件的保存位置。我們通過表 1 來說明一下系統中的重要日志文件。
日志文件 | 說?明 |
/var/log/cron | 記錄與系統定時任務相關的曰志 |
/var/log/cups/ | 記錄打印信息的曰志 |
/var/log/dmesg | 記錄了系統在開機時內核自檢的信總。也可以使用dmesg命令直接查看內核自檢信息 |
/var/log/btmp | 記錄錯誤登陸的日志。這個文件是二進制文件,不能直接用Vi查看,而要使用lastb命令查看。命令如下: [root@localhost log]#lastb root tty1?Tue Jun 4 22:38 - 22:38 (00:00) #有人在6月4 日?22:38便用root用戶在本地終端 1 登陸錯誤 |
/var/log/lasllog | 記錄系統中所有用戶最后一次的登錄時間的曰志。這個文件也是二進制文件.不能直接用Vi?查看。而要使用lastlog命令查看 |
/var/Iog/mailog | 記錄郵件信息的曰志 |
/var/log/messages | 它是核心系統日志文件,其中包含了系統啟動時的引導信息,以及系統運行時的其他狀態消息。I/O 錯誤、網絡錯誤和其他系統錯誤都會記錄到此文件中。其他信息,比如某個人的身份切換為 root,已經用戶自定義安裝軟件的日志,也會在這里列出。 |
/var/log/secure | 記錄驗證和授權方面的倍息,只要涉及賬戶和密碼的程序都會記錄,比如系統的登錄、ssh的登錄、su切換用戶,sudo授權,甚至添加用戶和修改用戶密碼都會記錄在這個日志文件中 |
/var/log/wtmp | 永久記錄所有用戶的登陸、注銷信息,同時記錄系統的后動、重啟、關機事件。同樣,這個文件也是二進制文件.不能直接用Vi查看,而要使用last命令查看 |
/var/tun/ulmp | 記錄當前已經登錄的用戶的信息。這個文件會隨著用戶的登錄和注銷而不斷變化,只記錄當前登錄用戶的信息。同樣,這個文件不能直接用Vi查看,而要使用w、who、users等命令查看 |
除系統默認的日志之外,采用 RPM 包方式安裝的系統服務也會默認把日志記錄在 /var/log/ 目錄中(源碼包安裝的服務日志存放在源碼包指定的目錄中)。不過這些日志不是由 rsyslogd 服務來記錄和管理的,而是各個服務使用自己的日志管理文檔來記錄自身的日志。以下介紹的日志目錄在你的 Linux 上不一定存在,只有安裝了相應的服務,日志才會出現。服務日志如表 2 所示。
日志文件 | 說明 |
---|---|
/var/log/httpd/ | RPM包安裝的apache取務的默認日志目錄 |
/var/log/mail/ | RPM包安裝的郵件服務的額外日志因錄 |
/var/log/samba/ | RPM色安裝的Samba服務的日志目錄 |
/var/log/sssd/ | 守護進程安全服務目錄 |
三、Linux日志文件格式分析
只要是由日志服務 rsyslogd 記錄的日志文件,它們的格式就都是一樣的。所以我們只要了解了日志文件的格式,就可以很輕松地看懂日志文件。
日志文件的格式包含以下 4 列:
- 事件產生的時間。
- 產生事件的服務器的主機名。
- 產生事件的服務名或程序名。
- 事件的具體信息。
我們查看一下 /var/log/secure 日志,這個日志中主要記錄的是用戶驗證和授權方面的信息,更加容易理解。命令如下:
[root@localhost ~]# vi /var/log/secure
Jun 5 03:20:46 localhost sshd[1630]:Accepted password for root from 192.168.0.104 port 4229 ssh2
# 6月5日 03:20:46 本地主機 sshd服務產生消息:接收從192.168.0.104主機的4229端口發起的ssh連接的密碼
Jun 5 03:20:46 localhost sshd[1630]:pam_unix(sshd:session):session opened for user root by (uid=0)
#時間 本地主機 sshd服務中pam_unix模塊產生消息:打開用戶root的會話(UID為0)
Jun 5 03:25:04 localhost useradd[1661]:new group:name=bb, GID=501
#時間 本地主機 useradd命令產生消息:新建立bb組,GID為501
Jun 5 03:25:04 localhost useradd[1661]:new user:name=bb, UID=501, GID=501, home=/home/bb, shell=/bin/bash
Jun 5 03:25:09 localhost passwd:pam_unix(passwd:chauthtok):password changed for bb
我截取了一段日志的內容,注釋了其中的三句日志,剩余的兩句日志大家可以看懂了嗎?其實分析日志既是重要的系統維護工作,也是一項非常枯燥和煩瑣的工作。如果我們的服務器出現了一些問題,比如系統不正常重啟或關機、用戶非正常登錄、服務無法正常使用等,則都應該先查詢日志。
實際上,只要感覺到服務器不是很正常就應該查看日志,甚至在服務器沒有什么問題時也要養成定時查看系統日志的習慣。
四、rsyslogd配置文件格式及其內容詳解
rsyslogd 服務是依賴其配置文件 /etc/rsyslog.conf 來確定哪個服務的什么等級的日志信息會被記錄在哪個位置的。也就是說,日志服務的配置文件中主要定義了服務的名稱、日志等級和日志記錄位置。
1、/etc/rsyslog.conf配置文件的格式
該配置文件的基本格式如下所示:
authpriv.* /var/log/secure
#服務名稱[連接符號]日志等級 日志記錄位置
#認證相關服務.所有日志等級 記錄在/var/log/secure日志中
(1)服務名稱
我們首先需要確定 rsyslogd 服務可以識別哪些服務的日志,也可以理解為以下這些服務委托 rsyslogd 服務來代為管理日志。這些服務如表 1 所示。
服務名稱 | 說?明 |
---|---|
auth(LOG?AUTH) | 安全和認證相關消息?(不推薦使用authpriv替代) |
authpriv(LOG_AUTHPRIV) | 安全和認證相關消息(私有的) |
cron (LOG_CRON) | 系統定時任務cront和at產生的日志 |
daemon (LOG_DAEMON) | 與各個守護進程相關的曰志 |
ftp (LOG_FTP) | ftp守護進程產生的曰志 |
kern(LOG_KERN) | 內核產生的曰志(不是用戶進程產生的) |
Iocal0-local7 (LOG_LOCAL0-7) | 為本地使用預留的服務 |
lpr (LOG_LPR) | 打印產生的日志 |
mail (LOG_MAIL) | 郵件收發信息 |
news (LOG_NEWS) | 與新聞服務器相關的日志 |
syslog (LOG_SYSLOG) | 存syslogd服務產生的曰志信息(雖然服務名稱己經改為reyslogd,但是很多配罝依然沿用了?syslogd服務的,所以這里并沒有修改服務名稱) |
user (LOG_USER) | 用戶等級類別的日志信息 |
uucp (LOG_UUCP> | uucp子系統的日志信息,uucp是早期Linux系統進行數據傳遞的協議,后來 也常用在新聞組服務中 |
這些日志服務名稱是rsyslogd服務自己定義的,并不是實際的Linux的服務。當有服務需要由rsyslogd服務來幫助管理日志時,只需要調用這些服務名稱就可以實現日志的委托管理。
這些日志服務名稱大家可以使用命令“man 3 syslog”來查看。雖然我們的日志管理服務已經更新到rsyslogd,但是很多配置依然沿用了syslogd服務,在幫助文檔中仍然查看syslog服務的幫助信息。
(2)連接符號
日志服務連接日志等級的格式如下:
日志服務[連接符號]日志等級 日志記錄位置
在這里,連接符號可以被識別為以下三種。
- “.”代表只要比后面的等級高的(包含該等級)日志都記錄。比如,“cron.info”代表cron服務產生的日志,只要日志等級大于等于info級別,就記錄。
- “.=”代表只記錄所需等級的日志,其他等級的日志都不記錄。比如,“*.=emerg”代表人和日志服務產生的日志,只要等級是emerg等級,就記錄。這種用法極少見,了解就好。
- “.!”代表不等于,也就是除該等級的日志外,其他等級的日志都記錄。
(3)日志等級
每個日志的重要性都是有差別的,比如,有些日志只是系統的一個日常提醒,看不看根本不會對系統的運行產生影響;但是有些日志就是系統和服務的警告甚至報錯信息,這些日志如果不處理,就會威脅系統的穩定或安全。如果把這些日志全部寫入一個文件,那么很有可能因為管理員的大意而忽略重要信息。
比如,我們在工作中需要處理大量的郵件,筆者每天可能會接收到200多封郵件。而這些郵件中的絕大多數是不需要處理的普通信息郵件,甚至是垃圾郵件。所以筆者每天都要先把這些大量的非重要郵件刪除之后,才能找到真正需要處理的郵件。但是每封郵件的標題都差不多,有時會誤刪除需要處理的郵件。這時筆者就非常懷念Linux的日志等級,如果郵件也能標識重要等級,就不會誤刪除或漏處理重要郵件了。
郵件的等級信息也可以使用“man 3 syslog”命令來查看。日志等級如表 2 所示,我們按照嚴重等級從低到高排列。
等級名稱 | 說?明 |
---|---|
debug (LOG_DEBUG) | 一般的調試信息說明 |
info (LOG_INFO) | 基本的通知信息 |
nolice (LOG_NOTICE) | 普通信息,但是有一定的重要性 |
warning(LOG_WARNING) | 警吿信息,但是還不會影響到服務或系統的運行 |
err(LOG_ERR) | 錯誤信息,?一般達到err等級的信息已經可以影響到服務成系統的運行了 |
crit (LOG_CRIT) | 臨界狀況信思,比err等級還要嚴? |
alert (LOG_ALERT) | 狀態信息,比crit等級還要嚴重,必須立即采取行動 |
emerg (LOG_EMERG) | 疼痛等級信息,系統已經無法使用了 |
* | 代表所有日志等級。比如,“authpriv.*”代表amhpriv認證信息服務產生的日志,所有的日志等級都記錄 |
日志等級還可以被識別為“none”。如果日志等級是none,就說明忽略這個日志服務,該服務的所有日志都不再記錄。
(4)日志記錄位置
日志記錄位置就是當前日志輸出到哪個日志文件中保存,當然也可以把日志輸出到打印機打印,或者輸出到遠程日志服務器上(當然,遠程日志服務器要允許接收才行)。日志的記錄位置也是固定的:
- 日志文件的絕對路徑。這是最常見的日志保存方法,如“/var/log/secure”就是用來保存系統驗證和授權信息日志的。
- 系統設備文件。如“/dev/lp0”代表第一臺打印機,如果日志保存位置是打印機設備,當有日志時就會在打印機上打印。
- 轉發給遠程主機。因為可以選擇使用 TCP 和 UDP 協議傳輸日志信息,所以有兩種發送格式:如果使用“@192.168.0.210:514”,就會把日志內容使用 UDP 協議發送到192.168.0.210 的 UDP 514 端口上;如果使用“@@192.168.0.210:514”,就會把日志內容使用 TCP 協議發送到 192.168.0.210 的 TCP 514 端口上,其中 514 是日志服務默認端口。當然,只要 192.168.0.210 同意接收此日志,就可以把日志內容保存在日志服務器上。
- 用戶名。如果是“root”,就會把日志發送給 root 用戶,當然 root 要在線,否則就收不到日志信息了。發送日志給用戶時,可以使用“*”代表發送給所有在線用戶,如“mail.**”就會把 mail 服務產生的所有級別的日志發送給所有在線用戶。如果需要把日志發送給多個在線用戶,則用戶名之間用“,”分隔。
- 忽略或丟棄日志。如果接收日志的對象是“~”,則代表這個日志不會被記錄,而被直接丟棄。如“local3.* ~”代表忽略 local3 服務類型所有的日志都不記錄。
- 忽略或丟棄日志。如果接收日志的對象是“~”,則代表這個日志不會被記錄,而被直接丟棄。如“local3.* ~”代表忽略 local3 服務類型所有的日志都不記錄。
2、/etc/rsyslog.conf配置文件的內容
我們知道了/etc/rsyslog.conf 配置文件中日志的格式,接下來就看看這個配置文件的具體內容。
[root@localhost ~]# vi /etc/rsyslog.conf
#查看配置文件的內容
#rsyslog v5 configuration file
# For more information see /usr/share/doc/rsyslog-*/rsyslog_conf.html
# If you experience problems, see http://www.rsyslog.com/doc/troubleshoot.html
*### MODULES ###
#加載棋塊
$ModLoad imuxsock # provides support for local system logging (e.g. via logger command)
#加載imixsock模塊,為本地系統登錄提供支持
$ModLoad imklog # provides kernel logging support (previously done by rklogd)
#加載imklog模塊,為內核登錄提供支持
#$ModLoad immark # provides --MARK-- message capability
#加載immark模塊,提供標記信息的能力
# Provides UDP syslog reception
#$ModLoad imudp
#SUDPServerRun 514
#加載UPD模塊,允許使用UDP的514端口接收采用UDP協議轉發的日志
# Provides TCP syslog reception
#$ModLoad imtcp
#$InputTCPServerRun 514
#加栽TCP摸塊,允許使用TCP的514編口接收采用TCP協議轉發的日志
#### GLOBAL DIRECTIVES ####
#定義全局設置
#Use default timestamp format
#ActionFileDefaultTemplate RSYSLOG_TraditionalFileFormat #定義曰志的時間使用默認的時間戳格式
#File syncing capability is disabled by default. This feature is usually not required,
#not useful and an extreme performance hit
#$ActionFileEnableSync on
#文件同步功能。默認沒有開啟,是注釋的
#Include all config files in /etc/rsyslog.d/
$IncludeConfig /etc/rsyslog.d/*.conf
#包含/etx/tsyslog.d/目錄中所有的".conf"子配置文件。也就是說,這個目錄中的所有子配置文件也同時生效
#### RULES ####
#日志文件保存規則
#Log all kernel messages to the console.
#Logging much else clutters up the screen.
#kern.* /dev/console
#kern服務.所有曰志級別 保存在/dev/console
#這個日志默認沒有開啟,如果需要,則取消注釋
#Log anything (except mail) of level info or higher.
#Don't log private authentication messages!
*.info;mail.none;authpriv.none;cron.none /var/log/messages
#所有服務.info以上級到的日志保存在/var/log/messages日志文件中
#mail, authpriv^ cron的B志不記錄在/var/log/messages曰志文件中,因為它們部有自己的曰志文件
#所以/var/log/messages日志是最重要的系統日志文件,需要經常查看
#The authpriv file has restricted access.
authpriv.* /var/log/secure
#用戶認證服務所有級別的日志保存在/vai/1og/secure日志文件中
#Log all the mail messages in one place.
mail.* -/var/log/maillog
#mail服務的所有級別的日志保存在/var/log/maillog 日志文件中
#"-"的含義是日志先在內存中保存.當曰志足夠多之后.再向文件中保存
# Log cron stuff
cron.* /var/log/cron
#計対任務的所有日志保存在/var/log/cron日志文件中
# Everybody gets emergency messages
#所有日志服務的疼痛等級日志對所有在線用戶廣播
#Save news errors of level crit and higher in a special file. uucp,news.crit /var/log/spooler
#uucp和news曰志服務的crit以上級別的日志保存在/var/log/sppoler曰志文件中
#Save boot messages also to boot.log
local7.* /var/log/boot.log
#loacl7 日志服務的所有日志寫入/var/log/boot.log 日志文件中 #會把開機時的檢測信息在顯示到屏幕的同時寫入/var/log/boot.log 日志文件中
# ### begin forwarding rule ###
#定義轉發規到
#The statement between the begin ... end define a SINGLE forwarding
#rule. They belong together, do NOT split them. If you create multiple
# forwarding rules, duplicate the whole block!
# Remote Logging (we use TCP for reliable delivery)
#
# An on-disk queue is created for this action. If the remote host is
# down, messages are spooled to disk and sent when it is up again. #SWorkDirectory /var/lib/rsyslog # where to place spool files #$ActionQueueFileName fwdRulel # unique name prefix for spool files
#$ActionQueueMaxDiskSpace 1g # 1gb space limit (use as much as possible)
#$ActionQueueSaveOnShutdown on # save messages to disk on shutdown
#$ActionQueueType LinkedList t run asynchronously
#$ActionResumeRetryCount -1 # infinite retries if host is down
# remote host is: name/ip:port, e.g. 192.168.0.1:514, port optional #*?* @6remote-host:514
# ### end of the forwarding rule ##
其實系統已經非常完善地定義了這個配置文件的內容,系統中重要的日志也已經記錄得非常完備。如果是外來的服務,如 apache、Samba 等服務,那么這些服務的配置文件中也詳細定義了日志的記錄格式和記錄方法。所以,日志的配置文件基本上不需要我們修改,我們要做的僅僅是查看和分析系統記錄好的日志而已。
五、Linux日志服務器設置過程
我們知道,使用“@IP:端口”或“@@IP:端口”的格式可以把日志發送到遠程主機上,那么這么做有什么意義嗎?
假設我需要管理幾十臺服務器,那么我每天的重要工作就是查看這些服務器的日志,可是每臺服務器單獨登錄,并且查看日志非常煩瑣,我可以把幾十臺服務器的日志集中到一臺日志服務器上嗎?這樣我每天只要登錄這臺日志服務器,就可以查看所有服務器的日志,要方便得多。
如何實現日志服務器的功能呢?其實并不難,不過我們首先需要分清服務器端和客戶端。假設服務器端的服務器 IP 地址是 192.168.0.210,主機名是 localhost.localdomain;客戶端的服務器 IP 地址是 192.168.0.211,主機名是 www1。我們現在要做的是把 192.168.0.211 的日志保存在 192.168.0.210 這臺服務器上。實驗過程如下:
#服務器端設定(192.168.0.210):
[root@localhost ~]# vi /etc/rsyslog.conf
…省略部分輸出…
# Provides TCP syslog reception
$ModLoad imtcp
$InputTCPServerRun 514
#取消這兩句話的注釋,允許服務器使用TCP 514端口接收日志
…省略部分輸出…
[root@localhost ~]# service rsyslog restart
#重啟rsyslog日志服務
[root@localhost ~]# netstat -tlun | grep 514
tcp 0 0 0.0.0.0:514 0.0.0.0:* LISTEN
#查看514端口已經打開
#客戶端設置(192.168.0.211):
[root@www1 ~]# vi /etc/rsyslog.conf
#修改日志服務配置文件
*.* @@192.168.0.210:514
#把所有日志采用TCP協議發送到192.168.0.210的514端口上
[root@www1 ~]# service rsyslog restart
#重啟日志服務
這樣日志服務器和客戶端就搭建完成了,以后 192.168.0.211 這臺客戶機上所產生的所有日志都會記錄到 192.168.0.210 上。比如:
#在客戶機上(192.168.0.211)
[root@wwwl ~]# useradd zhangsan
#添加zhansan用戶提示符的主機名是www1)
#在限務器(192.168.0.210)上
[root@localhost ~]# vi /var/log/secure
#査看服務器的secure日志(注意:主機名是localhost)
Aug 8 23:00:57 wwwl sshd【1408]: Server listening on 0.0.0.0 port 22.
Aug 8 23:00:57 wwwl sshd[1408]: Server listening on :: port 22.
Aug 8 23:01:58 wwwl sshd[1630]: Accepted password for root from 192.168.0.101 port 7036 ssh2
Aug 8 23:01:58 wwwl sshd[1630]: pam_unix(sshd:session): session opened for user root by (uid=0)
Aug 8 23:03:03 wwwl useradd[1654]: new group: name=zhangsan, GID-505
Aug 8 23:03:03 wwwl useradd[1654]: new user: name=zhangsan, UXD=505, GID=505,
home=/home/zhangsan, shell=/bin/bash
Aug 8 23:03:09 wwwl passwd: pam_unix(passwd:chauthtok): password changed for zhangsan
#注意:查看到的日志內容的主機名是www1,說明我們雖然查看的是服務器的日志文件,但是在其中可以看到客戶機的日志內容
需要注意的是,日志服務是通過主機名來區別不同的服務器的。所以,如果我們配置了日志服務,則需要給所有的服務器分配不同的主機名。
六、Linux日志輪替(日志轉儲)及logrotate配置文件分析
日志是重要的系統文件,記錄和保存了系統中所有的重要事件。但是日志文件也需要進行定期的維護,因為日志文件是不斷增長的,如果完全不進行日志維護,而任由其隨意遞增,那么用不了多久,我們的硬盤就會被寫滿。
日志維護的最主要的工作就是把舊的日志文件刪除,從而騰出空間保存新的日志文件。這項工作如果靠管理員手工來完成,那其實是非常煩瑣的,而且也容易忘記。那么 Linux 系統是否可以自動完成日志的輪替工作呢?
logrotate 就是用來進行日志輪替(也叫日志轉儲)的,也就是把舊的日志文件移動并改名,同時創建一個新的空日志文件用來記錄新日志,當舊日志文件超出保存的范圍時就刪除。
1、日志文件的命名規則
日志輪替最主要的作用就是把舊的日志文件移動并改名,同時建立新的空日志文件,當舊日志文件超出保存的范圍時就刪除。那么,舊的日志文件改名之后,如何命名呢?主要依靠 /etc/logrotate.conf 配置文件中的“dateext”參數。
如果配置文件中有“dateext”參數,那么日志會用日期來作為日志文件的后綴,如“secure-20130605”。這樣日志文件名不會重疊,也就不需要對日志文件進行改名,只需要保存指定的日志個數,刪除多余的日志文件即可。
如果配置文件中沒有“dateext”參數,那么日志文件就需要進行改名了。當第一次進行日志輪替時,當前的“secure”日志會自動改名為“secure.1”,然后新建“secure”日志,用來保存新的日志;當第二次進行日志輪替時,“secure.1”會自動改名為“secure.2”,當前的“secure”日志會自動改名為“secure.1”,然后也會新建“secure”日志,用來保存新的日志;以此類推。
2、logrotate配置文件
我們來查看一下 logrotate 的配置文件 /etc/logrotate.conf 的默認內容。
[root@localhost ~]# vi /etc/logrotate.conf
#see "man logrotate" for details
#rotate log files weekly
weekly
#每周對日志文件進行一次輪替
#keep 4 weeks worth of backlogs rotate 4
#保存4個日志文件,也就是說,如果進行了5次日志輪替,就會刪除第一個備份曰志
#create new (empty) log files after rotating old ones create
#在日志輪替時,自動創建新的日志文件
#use date as a suffix of the rotated file dateext
#使用日期作為日志輪替文件的后綴
#uncomment this if you want your log files compressed #compress
#日志文件是否壓縮。如果取消注釋,則日志會在轉儲的同時進行壓縮
#以上日志配置為默認配置,如果需要輪替的日志沒有設定獨立的參數,那么都會遵循以上參數
#如果輪替曰志配置了獨立參數,那么獨立參數的優先級更高
#RPM packages drop log rotation information into this directory include /etc/logrotate.d
#包含/etc/logrotate.d/目錄中所有的子配置文件。也就是說,會把這個目錄中所有的子配置文件讀取進來,進行日志輪替
#no packages own wtmp and btmp -- we'11 rotate them here
#以下兩個輪替曰志有自己的獨立參數,如果和默認的參數沖突,則獨立參數生效
/var/log/wtmp {
#以下參數僅對此目錄有效
monthly
#每月對日志文件進行一次輪替
create 0664 root utmp
#建立的新日志文件,權限是0664,所有者是root,所屬組是utmp組
minsize 1M
#日志文件最小輪替大小是1MB。也就是日志一定要超過1MB才會輪替,否則就算時間達到一個月,也不進行曰志輪替
rotate 1
#僅保留一個曰志備份。也就是只保留wtmp和wtmp.1曰志)
/var/log/btmp {
#以下參數只對/var/log/btmp生效
missingok
#如果日志不存在,則忽略該日志的警告信患
monthly
create 0600 root utmp
rotate 1
}
# system-specific logs may be also be configured here.
在這個配置文件中,主要分為三部分:
- 第一部分是默認設置,如果需要轉儲的日志文件沒有特殊配置,則遵循默認設置的參數;
- 第二部分是讀取 /etc/logrotate.d/ 目錄中的日志輪替的子配置文件,也就是說,在 /etc/logrotate.d/ 目錄中的所有符合語法規則的子配置文件也會進行日志輪替;
- 第三部分是對 wtmp 和 btmp 日志文件的輪替進行設定,如果此設定和默認參數沖突,則當前設定生效(如 wtmp 的當前參數設定的輪替時間是每月,而默認參數的輪替時間是每周,則對 wtmp 這個日志文件來說,輪替時間是每月,當前的設定參數生效)。
logrotate 配置文件的主要參數如表 1 所示。
參參數 | 參數說明 |
---|---|
daily | 日志的輪替周期是毎天 |
weekly | 日志的輪替周期是每周 |
monthly | 日志的輪控周期是每月 |
rotate數宇 | 保留的日志文件的個數。0指沒有備份 |
compress | 當進行日志輪替時,對舊的日志進行壓縮 |
create mode owner group | 建立新日志,同時指定新日志的權限與所有者和所屬組.如create 0600 root utmp |
mail address | 當進行日志輪替時.輸出內存通過郵件發送到指定的郵件地址 |
missingok | 如果日志不存在,則忽略該日志的警告信息 |
nolifempty | 如果曰志為空文件,則不進行日志輪替 |
minsize?大小 | 日志輪替的最小值。也就是日志一定要達到這個最小值才會進行輪持,否則就算時間達到也不進行輪替 |
size大小 | 日志只有大于指定大小才進行日志輪替,而不是按照時間輪替,如size?100k |
dateext | 使用日期作為日志輪替文件的后綴,如secure-20130605 |
sharedscripts | 在此關鍵宇之后的腳本只執行一次 |
prerotate/cndscript | 在曰志輪替之前執行腳本命令。endscript標識prerotate腳本結束 |
postrolaie/endscripl | 在日志輪替之后執行腳本命令。endscripi標識postrotate腳本結束 |
這些參數中較為難理解的應該是 prerotate/endscript 和 postrotate/endscript,我們利用“man logrotate”中的例子來解釋一下這兩個參數。例如:
"/var/log/httpd/access.log" /var/log/httpd/error.log {
#日志輪替的是/var/log/httpd/中RPM包默認安裝的apache正確訪問日志和錯誤日志
??? rotate 5
??? #輪替5次
??? mail www@my.org
??? #把信息發送到指定郵箱
??? size 100k
??? #日志大于100KB時才進行日志輪替,不再按照時間輪替
??? sharedscripts
??? #以下腳本只執行一次
??? postrotate
??? #在日志輪替結束之后,執行以下腳本
??? /usr/bin/killall -HUP httpd
??? #重啟apache 服務
endscript
#腳本結束
}
prerotate 和 postrotate 主要用于在日志輪替的同時執行指定的腳本,一般用于日志輪替之后重啟服務。這里強調一下,如果你的日志是寫入 rsyslog 服務的配置文件的,那么把新日志加入 logrotate 后,一定要重啟 rsyslog 服務,否則你會發現,雖然新日志建立了,但數據還是寫入了舊的日志當中。那是因為雖然 logrotate 知道日志輪替了,但是 rsyslog 服務并不知道。
同理,如果采用源碼包安裝了 apache、Nginx 等服務,則需要重啟 apache 或 Nginx 服務,同時還要重啟 rsyslog 服務,否則日志也不能正常輪替。
不過,這里有一個典型應用就是給予特定的日志加入 chattr 的 a 屬性。如果系統文件加入了 a 屬性,那么這個文件就只能增加數據,而不能刪除和修改已有的數據,root 用戶也不例外。
因此,我們會給重要的日志文件加入 a 屬性,這樣就可以保護日志文件不被惡意修改。不過,一旦加入了 a 屬性,那么在進行日志輪替時,這個日志文件是不能被改名的,當然也就不能進行日志輪替了。我們可以利用 prerotate 和 postrotate 參數來修改日志文件的 chattr 的 a 屬性。
3、把自己的日志加入日志輪替
如果有些日志默認沒有加入日志輪替(比如源碼包安裝的服務的日志,或者自己添加的日志),那么這些日志默認是不會進行日志輪替的,這樣當然不符合我們對日志的管理要求。如果需要把這些日志也加入日志輪替,那該如何操作呢?
這里有兩種方法:
- 第一種方法是直接在 /etc/logrotate.conf 配置文件中寫入該日志的輪替策略,從而把日志加入輪替;
- 第二種方法是在 /etc/logrotate.d/ 目錄中新建立該日志的輪替文件,在該輪替文件中寫入正確的輪替策略,因為該目錄中的文件都會被包含到主配置文件中,所以也可以把日志加入輪替。
我們推薦第二種方法,因為系統中需要輪替的日志非常多,如果全部直接寫入 /etc/logrotate.conf 配置文件,那么這個文件的可管理性就會非常差,不利于此文件的維護。
說起來很復雜,我們舉個例子。還記得我們自己生成的 /var/log/alert.log 日志嗎?這個日志不是系統默認日志,而是我們通過 /etc/rsyslog.conf 配置文件自己生成的日志,所以默認這個日志是不會進行輪替的。如果我們需要把這個日志加入日志輪替策略,那該怎么實現呢?我們采用第二種方法,也就是在 /etc/logrotate.d/ 目錄中建立此日志的輪替文件。
具體步驟如下:
[root@localhost ~]# chattr +a /var/log/alert.log #先給日志文件賦予chattr的a屬性,保證日志的安全
[root@localhost ~]# vi /etc/logrotate.d/alter
#創建alter輪替文件,把/var/log/alert.log加入輪替
/var/log/alert.log {
??? weekly
??? #每周輪替一次
??? rotate 6
??? #保留6個輪替曰志
??? sharedscripts
??? #以下命令只執行一次
??? prerotate
??? #在日志輪替之前執行
??????? /usr/bin/chattr -a /var/log/alert.log
??????? #在日志輪替之前取消a屬性,以便讓日志可以輪替
??? endscript
??? #腳本結朿
??? sharedscripts
??? postrotate
??? #在日志輪替之后執行
??????? /usr/bin/chattr +a /var/log/alert.log
??????? #在日志輪替之后,重新加入a屬性
??? endscript
??? sharedscripts
??? postrotate
??? /bin/kill -HUP $(/bin/cat /var/run/syslogd.pid 2>/dev/null) fi>/dev/null
??? endscript
??? #重啟rsyslog服務,保證日志輪替正常進行
}
這樣我們自己生成的日志 /var/log/alert.log 也就可以進行日志輪替了,當然這些配置信息也是可以直接寫入 /etc/logrotate.conf 這個配置文件的。
七、Linux logrotate命令用法詳解:進行日志轉儲(輪替)
日志輪替之所以可以在指定的時間備份日志,是因為其依賴系統定時任務。如果大家還記得 /etc/cron.daily/ 目錄,就會發現這個目錄中是有 logrotate 文件的,查看一下這個文件,命令如下:
[root@localhost ~]# vi /etc/cron.daily/logrotate
#!/bin/sh
/usr/sbin/logrotate /etc/logrotate.conf >/dev/null 2>&1
#最主要的就是執行了logrotate命令
EXITVALUE=$?
if [ $EXITVALUE!= 0 ]; then
/usr/bin/logger -t logrotate "ALERT exited abnormally with [$EXITVALUE]"
fi
exit 0
也就是說,系統每天都會執行 /etc/cron.daily/logrotate 文件,運行這個文件中的“/usr/sbin/logrotate/etc/logrotate.conf>/dev/null 2>&1”命令。logrotate 命令會依據 /etc/logrotate.conf 配置文件的配置,來判斷配置文件中的日志是否符合日志輪替的條件(比如,日志備份時間已經滿一周),如果符合,日志就會進行輪替。所以說,日志輪替還是由 crond 服務發起的。
logrotate 命令的格式是什么樣的呢?我們來學習一下。
[root@localhost ~]# logrotate [選項] 配置文件名
選項:
- 如果此命令沒有選項,則會按照配置文件中的條件進行日志輪替
- -v:顯示日志輪替過程。加入了-v選項,會顯示日志的輪替過程
- -f: 強制進行日志輪替。不管日志輪替的條件是否符合,強制配置文件中所有的日志進行輪替
我們執行 logrotate 命令,并查看一下執行過程。
[root@localhost ~]# logrotate -v /etc/logrotate.conf
#查看日志輪替的流程
…省略部分輸出…
rotating pattern:/var/log/alert.log weekly (6 rotations)
#這就是我們自己加入輪替的alert.log日志
empty log files are rotated, old logs are removed
considering log /var/log/alert.log
log does not need rotating
#時間不夠一周,所以不進行日志輪替
…省略部分輸出…
我們發現,/var/log/alert.log 加入了日志輪替,已經被 logrotate 識別并調用了,只是時間沒有達到輪替的標準,所以沒有進行輪替。那我們強制進行一次日志輪替,看看會有什么結果。
[root@localhost ~]# logrotate -vf /etc/logrotate.conf
#強制進行日志輪替,不管是否符合輪替條件
…省略部分輸出…
rotating pattern:/var/log/alert.log forced from command line (6 rotations)
empty log files are rotated, old logs are removed
considering log /var/log/alert.log
log needs rotating
#日志需要輪替
rotating log /var/log/alert.log,log->rotateCount is 6
dateext suffix '-20130607'
#提取日期參數
glob pattern '-[0-9][0-9][0-9][0-9][0-9][0-9][0-9][0-9]'
glob finding old rotated logs failed
running prerotate script
fscreate context set to unconfined_u:object_r:var_log_t:s0
renaming /var/log/alert.log to /var/log/alert.log-20130607
#舊的日志被重命名
creating new /var/log/alert.log mode = 0600 uid = 0 gid = 0
#創建新日志文件,同時指定權限、所有者和屬組
running postrotate script
…省略部分輸出…
我們發現,alert.log 日志已經完成了日志輪替。查看一下新生成的日志和舊日志,如下:
[root@localhost ~]# ll /var/log/alert.log*
-rw-------.1 root root 0 6月 7 10:07 /var/log/alert.log
-rw-------.1 root root 237 6月 7 09:58 /var/log/alert.log-20130607
#舊的日志文件已經輪替
[root@localhost ~]# lsattr /var/log/alert.log
-----a-------e- /var/log/alert.log
#新的日志文件被自動加入了chattr的a屬性
logrotate 命令在使用“-f”選項之后,就會不管日志是否符合輪替條件,而強制把所有的日志都進行輪替。
八、Linux日志分析工具(logwatch)安裝及使用
日志是非常重要的系統文件,管理員每天的重要工作就是分析和查看服務器的日志,判斷服務器的健康狀態。但是日志管理又是一項非常枯燥的工作,如果需要管理員手工查看服務器上所有的日志,那實在是一項非常痛苦的工作。有些管理員就會偷懶,省略日志的檢測工作,但是這樣做非常容易導致服務器出現問題。
那么我們有取代的方案嗎?有,那就是日志分析工具。這些日志分析工具會詳細地查看日志,同時分析這些日志,并且把分析的結果通過郵件的方式發送給 root 用戶。這樣,我們每天只要查看日志分析工具的郵件,就可以知道服務器的基本情況,而不用挨個檢查日志了。這樣系統管理員就可以從繁重的日常工作中解脫出來,去處理更加重要的工作。
在 CentOS 中自帶了一個日志分析工具,就是?logwatch。不過這個工具默認沒有安裝(因為我們選擇的是“Basic Server”),所以需要手工安裝。安裝命令如下:
[root@localhost Packages]# yum -y install logwatch
安裝完成之后,需要手工生成 logwatch 的配置文件。默認配置文件是 /etc/logwatch/conf/logwatch.conf,不過這個配置文件是空的,需要把模板配置文件復制過來。命令如下:
[root@localhost ~]# cp /usr/share/logwatch/default.conf/logwatch.conf /etc/logwatch/conf/logwatch.conf
#復制配置文件
這個配置文件的內容中絕大多數是注釋,我們把注釋去掉,那么這個配置文件的內容如下所示:
[root@localhost ~]# vi /etc/logwatch/conf/logwatch.conf
#查看配置文件
LogDir = /var/log
#logwatch會分析和統計/var/log/中的日志
TmpDir = /var/cache/logwatch
#指定logwatch的臨時目錄
MailTo = root
#日志的分析結果,給root用戶發送郵件
MailFrom = Logwatch
#郵件的發送者是Logwatch,在接收郵件時顯示
Print =
#是否打印。如果選擇“yes”,那么日志分析會被打印到標準輸出,而且不會發送郵件。我們在這里不打印,#而是給root用戶發送郵件
#Save = /tmp/logwatch
#如果開啟這一項,日志分析就不會發送郵件,而是保存在/tmp/logwatch文件中
#如果開啟這一項,日志分析就不會發送郵件,而是保存在/tmp/logwatch文件中
Range = yesterday
#分析哪天的日志。可以識別“All”“Today”“Yesterday”,用來分析“所有日志”“今天日志”“昨天日志”
Detail = Low
#日志的詳細程度。可以識別“Low”“Med”“High”。也可以用數字表示,范圍為0~10,“0”代表最不詳細,“10”代表最詳細
Service = All
#分析和監控所有日志
Service = "-zz-network"
#但是不監控“-zz-network”服務的日志。“-服務名”表示不分析和監控此服務的日志
Service = "-zz-sys"
Service = "-eximstats"
這個配置文件基本不需要修改(我在實驗時把 Range 項改為了 All,否則一會兒的實驗可以分析的日志過少),它就會默認每天執行。它為什么會每天執行呢?聰明的讀者已經想到了,一定是 crond 服務的作用。沒錯,logwatch 一旦安裝,就會在 /etc/cron.daily/ 目錄中建立“0logwatch”文件,用于在每天定時執行 logwatch 命令,分析和監控相關日志。
如果想要讓這個日志分析馬上執行,則只需執行 logrotate 命令即可。命令如下:
[root@localhost ~]# logwatch
#馬上執行logwatch日志分析工具
[root01ocalhost ~]# mail
#查看郵件
Heirloom Mail version 12.4 7/29/08. Type ? for help, "/var/spool/mail/root": 5 messages 1 new 2 unread
1 logwatch@localhost.1 Fri Jun 7 11:17 42/1482 "Logwatch for localhost.localdomain (Linux)"
U 2 logwatch@localhost.1 Fri Jun 7 11:19 42/1481 "Logwatch for localhost.localdomain (Linux)"
3 logwatch@localhost.1 Fri Jun 7 11:23 1234/70928 "Logwatch for localhost.localdomain (Linux)"
4 logwatch@localhost.1 Fri Jun 7 11:24 190/5070 "Logwatch for localhost.localdomain (Linux)"
5 logwatch@localhost.1 Fri Jun 7 11:55 41/1471 "Logwatch for localhost.localdomain (Linux)"
>N 6 logwatch@localhost.1 Fri Jun 7 11:57 189/5059 "Logwatch for localhost.localdomain (Linux)"
#第6封郵件就是剛剛生成的曰志分析郵件,"N"代表沒有查看
& 6
Message 6:
From root@localhost.localdomain Fri Jun 7 11:57:35 2013 Return-Path: <root@localhost.localdomain>
X-Original-To: root
Delivered-To: root@localhost.localdomain
To: root@localhost.localdomain
From: logwatch@localhost.localdomain
Subject: Logwatch for localhost.localdomain (Linux)
Content-Type: text/plain; charset="iso-8859-1"
Date: Fri, 7 Jun 2013 11:57:33 +0800 (CST)
Status: R
######## Logwatch 7.3.6 (05/19/07) ################
Processing Initiated: Fri Jun 7 11:57:33 2013
Date Range Processed: all
Detail Level of Output: 0
Type of Output: unformatted
Logfiles for Host: localhost.localdomain
###################################################
#上面是曰志分析的時間和日期
...省略部分輸出...
--------- Connections (secure-log) Begin-----------
#分析secure.log日志的內容。統計新建立了哪些用戶和組,以及錯誤登錄信息 New Users:
??? bb (501)
??? def (503)
??? hjk (504)
??? zhangsan (505)
??? dovecot (97)
??? dovenull (498)
??? aa (500)
New Groups:
??? bb (501)
??? def (503)
??? hjk (504)
??? zhangsan (505)
??? dovecot (97)
??? dovenull (498)
??? aa (500)
Failed logins:
??? User root:
??? (null): 3 Time(s)
Root logins on tty's: 7 Time(s).
**Unmatched Entries**
groupadd: group added to /etc/group: name=dovecot, GID=97: 1 Time(s)
groupadd: group added to /etc/group: name=dovenul1, GID=498: 1 Time(s)
groupadd: group added to /etc/gshadow: name=dovecot: 1 Time(s)groupadd: group added to /etc/gshadow: name=dovenull: 1 Time(s)
--------Connections (secure-log)End-------
-------------SSHD Begin-------------------
#分析SSHD的日志。可以知道哪些IP地址連接過服務器
SSHD Killed: 7 Time(s)
SSHD Started: 24 Time(s)
Users logging in through sshd:
192.168.0.104: 10 times
192.168.0.108: 8 times
192.168.0.101: 6 times
192.168.0.126: 4 times
192.168.0.100: 3 times
192.168.0.105: 3 times
192.168.0.106: 2 times
192.168.0.102: 1 time
192.168.0.103: 1 time
SFTP subsystem requests: 3. Time(s)
**Unmatched Entries**
Exiting on signal 15 : 6 time(s)
----------------SSHD End-----------
--------------- yum Begin ---------
#統計yum安裝的軟件。可以知道我們安裝了哪些軟件
Packages Installed:
??? perl-YAML-Syck-1.07-4.el6.i686
??? perl-Date-Manip-6.24-1.el6.noarch
??? logwatch-7.3.6-49.el6.noarch
-----------yum End-------------
--------Disk Space Begin-------
#統計磁盤空間情況
Filesystem Size Used Avail Use% Mounted on
/dev/sda3 20G 1.9G 17G 11% /
/dev/sda1 194M 26M 158M 15% /boot
/dev/sr0 3.5G 3.5G 0 100% /mnt/cdrom
---------Disk Space End-----------------
#########Logwatch End ##################
有了這個日志分析工具,日志管理工作就會輕松很多。當然,在 Linux 中可以支持很多日志分析工具,我們在這里只介紹了 CentOS 自帶的 logwatch,大家可以根據自己的習慣選擇相應的日志分析工具。
??十二月19日上午發?