日志系統(Linux系統上常用的日志系統)
操作系統運行過程當中會產生許多信息,這些信息既是我們觀察系統運行過程當中正常的一種途徑(手段、憑借),同時它也為我們提供了當發生故障時定位問題所在的必要信息。
事實上,任何操作系統都提供了日志系統,用於記錄各子系統產生的各種信息。
日志系統定義一個日志信息要基於三種方式定義:
1、信息的詳細程度:系統產生的信息不可能全部進行記錄,因此記錄信息的過程會有信息的詳細程度。根據記錄日志信息的詳細程度不同,可將日志信息分級,稱為日志級別(用於定義不同的日志信息的)。一般來講,不同的日志系統支持的級別不同。在Linux系統上,日志級別通常有固定的幾種。
2、子系統:facility(設施)
3、動作:在系統運行過程當中產生的信息該如何處理呢?是記錄在文件中?還是發送至其它主機讓其它主機記錄?或者使用管道送給其他命令,讓其它命令處理呢?
通常定義日志信息時,需要指明記錄哪一個子系統、記錄哪一個級別及此級別以上的信息以及信息的存儲位置等。
鑒於操作系統上的程序自身都可以產生日志信息並將其記錄到指定位置,但這些日志信息中定義的日志格式不盡相同。故Linux系統上統一創建了一個程序,負責統一記錄各程序產生的日志信息。這就是syslog。
Linux上的日志系統:
1、syslog
2、syslog-ng(ng(next generation,下一代),分為開源版和商業版)
在RedHat 5上使用的是syslog,而在RedHat 6上使用的是syslog-ng。syslog-ng作為syslog的升級版,其功能比syslog要大的多的多。事實上,在RedHat系列的系統上,syslog-ng和syslog使用的配置文件的格式比較接近,雖然事實上syslog-ng和syslog差別比較大。
syslog服務:
專門用來提供記錄日志功能的。可以把每一個程序理解為子系統。
syslog有兩個進程:
syslogd(sys:系統):專門負責記錄非內核的其它設施產生的日志;
klogd(k:內核):專門負責記錄內核產生的日志;
klogd所記錄的日志的詳細程度個syslogd有着巨大不同,所以它們所產生的日志格式相差太大,因為它們兩個各自獨立為一個日志系統。
系統啟動過程中,BIOS將控制權交給kernel(內核實現初始化了,屏幕上會產生許多信息) --> 這些屏幕上的信息顯示在物理終端上(物理終端對應的設備為/dev/console,而后來所看到的信息如給用戶login登錄時看到的信息為虛擬終端,ssh遠程登錄叫偽終端) --> 這些信息在RedHat系列的系統上會被記錄到/var/log/dmesg(可使用cat /var/log/dmesg查看,或者使用dmesg命令查看(dmesg專門用來打開/var/log/dmesg文件並顯示),這些信息都是啟動init程序之前產生的信息) --> 系統控制權由內核轉交給/sbin/init之后 --> 產生的信息由syslog記錄(上面kernel產生的信息由klogd記錄並放置於文件中)
syslogd記錄的信息存放位置:
/var/log/messages:系統標准錯誤日志信息(大多數產生的錯誤信息都在其中)、非內核產生的引導信息(如系統初始化信息)、各子系統產生的信息。所以此文件是記錄信息最多的,而且運行程序日積月累之后可能會變得越來越大的一個文件。當然,它會被多次進行滾動,以免一個文件變得過大。
/var/log/maillogs:郵件系統產生的信息;
/var/log/secure:與安全相關的信息;(權限要求嚴格(600權限),任何一個用戶在登錄時產生的登錄信息,如賬號密碼輸入是否有誤、嘗試登錄過幾次都在其中有記錄)
日志滾動:
日志需要滾動,日志滾動的過程也叫日志切割。
比如第一個日志文件叫messages,過了兩天這個文件變得非常大了,打開文件查看是非常消耗內存的,而且不便管理。所以每隔一段時間,將文件重命名(如:將messages重命名為messages.1),再重新創建一個文件叫messages。以此類推,下一次messages.1重命名為messages.2,message重命名為messages.1,再新建一個messages...
日志滾動可以按文件大小、也可以按時間(如:每周一次)或兩個標准同時進行滾動。
logrotate:系統中進行日志滾動(切割)的工具
對於syslog,其對應的服務也叫syslog。
syslog日志系統的配置文件:/etc/syslog.conf(每一行用來指定每一個子系統產生的哪個級別的日志記錄到什么位置上去)格式如下:
配置文件定義格式為: facility.priority action
action前若加-表示異步寫入
如:
facility:可以理解為日志的來源或設備,目前常用的facility有以下幾種:
auth #認證相關的
authpriv #權限,授權相關的
cron #任務計划相關的
daemon #守護進程相關
kern #內核相關的
lpr #打印相關的
mail #郵件相關的
mark #標記相關的
news #新聞相關的
security #安全相關的,與auth類似
syslog #syslog自己的
user #用戶相關的
uucp #unix to unix cp相關的
local0 到 local7 #用戶自定義使用
* #表示所有的facility
priority:(log level)日志的級別,一般有以下幾種級別(從低到高)(級別越低,記錄的信息越詳細)
debug #程序或系統的調試信息
info #一般信息
notice #不影響正常功能,需要注意的消息
warning/warn #可能影響系統功能,需要提醒用戶的重要事件
err/error #錯誤信息
crit #比較嚴重的
alert #必須馬上處理的
emerg/panic #會導致系統不可用的
* #表示所有的日志級別
none #根*相反,表示啥也沒有
action(動作):日志記錄的位置
系統上的絕對路徑 #普通文件,如:/var/log/xxx
| #管道,通過管道送給其它命令處理
終端 #終端,如:/dev/console
@HOST #遠程主機,如:@10.0.0.1
用戶 #系統用戶,如:root
* #登錄到系統上的所有用戶,一般為emerg級別的日志是這樣定義的
日志定義格式舉例:
mail.info /var/log/mail.log #表示將mail相關的,級別為info及info以上級別的信息記錄到/var/log/mail.log文件中
auth.=info @10.0.0.1 #表示將auth有關的,級別為info的信息記錄到10.0.0.1主機上去
#前提是10.0.0.1要能夠接受其它主機發來的日志信息
user.!error #與user.error相反
*.info #表示記錄所有的日志信息的info級別
mail.* #表示記錄mail相關的所有級別的信息
*.* #記錄所有的日志信息的所有級別
cron.info;mail.info #多個日志來源用";"隔開
cron,mail.info #與cron.info;mail.info意義相同
mail.*;mail.!=info #表示記錄mail相關的除了info級別之外的所有級別的信息
修改/etc/syslog.conf不會立即生效,但會永久有效,若需要立即生效需要重啟syslog服務:
service syslog restart
但若有其它進程往syslog發信息,則可能無法生效:
service syslog reload #讓程序不用重啟就能使配置文件生效
使用遠程日志:
在/etc/syslconfig/syslog中加入-r選項並重啟服務可實現將本機作為日志服務器使用(可接受其它主機的日志信息),如下圖: