了解日志文件是很重要的事情。日志文件可以記錄系統(tǒng)在什么時間、哪臺主機、哪個服務(wù)、出現(xiàn)了什么信息等。可以在系統(tǒng)出現(xiàn)問題的第一時間段從日志中找到解決方案。
1、什么是日志文件
詳細而確實地分析以及備份系統(tǒng)的日志文件是一個SA應(yīng)該要進行的任務(wù)之一。
1.1、日志文件的重要性
解決系統(tǒng)方面的錯誤;
解決網(wǎng)絡(luò)服務(wù)的問題;
過往事件記錄簿。
1.2、Linux常見日志文件名
日志文件可以幫助我們了解很多系統(tǒng)重要的事件,包括登錄者的信息部分,因此日志文件的權(quán)限通常是設(shè)置為僅有root能夠讀取而已。
一般而言,有以下這些:
/var/log/boot.log:開機的時候系統(tǒng)核心去偵測與啟動,接下來開始各種核心支援的功能啟動等;
/var/log/cron:例行性工作crontab;
/var/log/dmesg:記錄系統(tǒng)再開機的時候核心偵測過程中所產(chǎn)生的各種信息;
/var/log/lastlog:記錄系統(tǒng)上面所有賬號最近一次登錄系統(tǒng)的相關(guān)信息;
/var/log/mailog或/var/log/mail/*:記錄郵件信息的往來;
/var/log/messages:這個文件很重要,幾乎系統(tǒng)發(fā)生的錯誤信息都會記錄在這個文件中;
/var/log/secure:基本上,只要牽涉到需要輸入賬號密碼的軟件時,那么當(dāng)?shù)卿洉r都會被記錄到此文件中。
/var/log/httpd/*,/var/log/samba/*:不同的網(wǎng)絡(luò)服務(wù)會使用他們自己的日志文件來記錄他們自己產(chǎn)生的各種信息。
1.3、日志文件所需相關(guān)服務(wù)(daemon)與進程
日志文件是怎么產(chǎn)生的呢?基本上有兩種方式,一種由軟件開發(fā)商自定義寫入的日志文件與相關(guān)格式,例如www軟件Apache就是這樣處理的;另一種則是由Linux distribution提供的日志文件管理服務(wù)來統(tǒng)一管理,你只要將信息丟給這個服務(wù)后,它就會自己分門別類地將各種信息放置到相關(guān)的日志文件去!Centos提供rsyslog.service這個服務(wù)來管理。

不過要注意,如果任憑日志文件持續(xù)記錄的話,那么日志容量將無限增大。日志文件太大可能會導(dǎo)致讀寫效率不佳(從磁盤讀入內(nèi)存,越大的文件消耗內(nèi)存越多),所以需要對日志文件備份和更新。我們可以通過logrotate(日志輪替)命令來自動化處理日志文件容量與更新。
logrotate就是將舊的日志文件更改名稱,然后新建一個空的日志文件。如此一來,新的文件將重新開始記錄,然后將舊的日志保留一陣子,那就可以達到日志的輪轉(zhuǎn)。
針對日志文件所需的功能,我們需要的服務(wù)于進程有:
systemd-journald.service:最主要的信息收受者,由systemd提供;
rsystem.service:主要登錄系統(tǒng)于網(wǎng)絡(luò)等服務(wù)的信息;
logrotate:主要在進行日志的輪替功能
Centos7.x使用systemd提供的journalctl日志管理
基本上,系統(tǒng)由systemd所管理,那所有經(jīng)由systemd啟動的服務(wù)()如果在啟動或結(jié)束的過程中發(fā)生了一些問題或是正常的信息),就會將該信息由systemd-journald.service以二進制的方式記錄下來,之后再將信息發(fā)個rsyslog.service作進一步的記載。
systemd-journald.service的記錄主要都放置與內(nèi)存中,因此在存取方面效能比較好。我們也能透過journalctl以及systemctl status unit.service 來查看各個不同服務(wù)的日志。
1.4、日志文件的一般格式
一般來說,日志文件有以下重要數(shù)據(jù):
事件發(fā)生日期與時間;
發(fā)生此事件的主機名;
啟動此事件的服務(wù)名稱或函數(shù)名稱;
該信息的實際數(shù)據(jù)內(nèi)容。

2、rsyslog.service:記錄日志的服務(wù)

2.1、rsyslog.service的配置文件:/etc/rsyslog.conf
rsyslogd針對各種服務(wù)與信息記錄在某些文件的配置文件就是/etc/rsyslog.conf,這個文件規(guī)定了,什么服務(wù)的什么等級信息以及需要被記錄在哪里(設(shè)備或文件)這三個東西。

服務(wù)名稱
Linux核心的syslog函數(shù)自行制定的服務(wù)名稱,軟件開發(fā)商可以透過呼叫上述的服務(wù)名稱來記錄他們的軟件。Linux核心的syslog認識的服務(wù)類型主要有以下這些:


信息等級:
同一服務(wù)產(chǎn)生的信息也是有差別的。信息到底有多少種嚴重的等級呢?基本上,Linux核心的syslog將信息分為七個主要等級:


基本上,在0(emerg)到6(info)等級間,越高代表越?jīng)]事,越靠近0則代表 事情危險了。除了0到6之外還有兩個比較特殊的等級,那就是debug與none。
特別留意一下在信息等級前還有個[=!]的連接符號:
.:代表比后面還要高的等級(含該等級)都要被記錄下來。如mail.info表示只要是mail的信息并且等級高于info就被記錄下來;
.=:代表所需要的等級就是后面接的等級而已,其他的不要;
.!:低于該等級的信息才會被記錄。
一般來說,比較常用的是“.”這個連接符號。
服務(wù)、daemon與函數(shù)名稱
區(qū)分下syslog、rsyslogd、rsyslog.service

rsyslog.conf語法練習(xí)
如將mail的相關(guān)資料寫入/var/log/maillog當(dāng)中,那么在/etc/syslog.conf的如何設(shè)計?
mail.info /var/log/maillog
#任何等級大于info的信息都會被寫入到后面界的文件當(dāng)中。

Centos7中預(yù)設(shè)的rsyslog.conf內(nèi)容

#kern.*:只要是內(nèi)核產(chǎn)生的信息,全部送到console(終端機)去;
*.info;mail.none;authpriv.none;cron.none:由于mail,news,cron等類型生成的信息較多,且已經(jīng)寫入下面的數(shù)個文件中,因此在/var/log/messages 里面就不記錄這些選項。除此之外的其他信息的記錄到/var/log/messages中;
authpriv.*:認證方面的信息均寫入/var/log/secure;
mail:郵件方面信息則均寫入/var/log/maillog;
cron:例行性工作調(diào)度均寫入/var/log/cron文件;
*.emerg:當(dāng)產(chǎn)生嚴重等級錯誤時,將該等級的信息以wall的方式廣播給所有在系統(tǒng)登錄的賬號,要這么做的原因是希望在線的使用者能趕快通知管理員處理可怕的錯誤;
uucp,news.crit:新聞組方面的信息;
local7.*:將本機開機時應(yīng)該顯示到屏幕的信息寫入到/var/log/boot.log中。
自行增加日志文件的功能

2.2、日志文件的安全性設(shè)置
如果一個很厲害的黑客,入侵了別人的電腦,干了壞事又不想留下證據(jù),這就需要把日志文件清除干凈。如果你發(fā)現(xiàn)你主機下的log文件不見了,那就需要注意啦。
使用chattr +a這個屬性讓我們的日志文件只能被增加,不能被刪除和寫入。只有chattr -a 后才能刪除或移動改文件。使用此命令要注意哈,很容易由于自己忘記導(dǎo)致系統(tǒng)的重要信息無法記錄。

2.3、日志文件服務(wù)器的設(shè)置
將其他主機的日志文件放到日志文件服務(wù)器上。



3、日志文件的輪替(logrotate)
rsyslog利用的是daemon的方式來啟動,當(dāng)有需求的時候立刻就會被執(zhí)行,但是logrotate卻是在規(guī)定時間到了之后才進行日志文件的輪替,所以logrotate是掛在cron下面的。
3.1、logrotate的配置文件
/etc/logrotate.conf ? ?#主要參數(shù) 文件
/etc/logrotate.d/ ? ?#這個文件類似于nginx中的include的文件
logrotate的主要功能就是將舊的日志文件移動成舊文件,并且重新新建一個新的空的文件來記錄,執(zhí)行結(jié)果如下所示:

如上圖所示,當(dāng)?shù)谝淮螆?zhí)行完rotate之后,原本的message變成message.1,第二次執(zhí)行后,message.1會變成message.2,繼續(xù)執(zhí)行下去,但只保留三個message。

重要的 logrotate 選項:
compress? ? ? ? ? ? --> 壓縮日志文件的所有非當(dāng)前版本;
nocompress ?-->不希望對日志文件進行壓縮;
daily,weekly,monthly --> 按指定計劃輪換日志文件,每天每周每月;
delaycompress? ? ? ? --> 壓縮所有版本,除了當(dāng)前和下一個最近的;
endscript? ? ? ? ? ? --> 標記 prerotate 或 postrotate 腳本的結(jié)束;
errors "emailid"? ? --> 給指定郵箱發(fā)送錯誤通知;
missingok? ? ? ? ? ? --> 如果日志文件丟失,不要顯示錯誤;
notifempty? ? ? ? ? --> 如果日志文件為空,則不輪換日志文件
olddir "dir"? ? ? ? --> 指定日志文件的舊版本放在 “di” 中
postrotate? ? ? ? ? --> 引入一個在日志被輪換后執(zhí)行的腳本
prerotate? ? ? ? ? ? --> 引入一個在日志被輪換前執(zhí)行的腳本
rotate 'n'? ? ? ? ? --> 在輪換方案中保存日志的 n 個版本
sharedscripts? ? ? ? --> 對于整個日志組只運行一次腳本
size='logsize'? ? ? --> 在日志大小大于 logsize(例如 100K,4M)時輪換
create 644 ?nginx adm,以指定的權(quán)限創(chuàng)建全新的日志文件,同事logrotate也會重命名原始日志文件;
接下來我們在/etc/logrotate.d/syslog輪替syslog這個文件

在上面的例子中我們來談一下logrotate的寫法:
文件名:如/var/log/cron;
參數(shù):進行輪替的參數(shù)用{ }括起來;
執(zhí)行腳本:可調(diào)用外部命令來執(zhí)行。prerotate,在啟動logrotate之前進行的命令;postrotate,在做完logrotate之后啟動的命令。這兩者在對于已加上特殊屬性的文件處理上面是相當(dāng)重要的執(zhí)行程序。
關(guān)于cron.daily什么時候運行:

所以,在凌晨3點到10點之間的時間(重新啟動后,機器上線5分鐘^^)后,運行/etc/cron.daily。如果沒有重新啟動,則該作業(yè)應(yīng)在3:05 AM++以上運行。
** As definedbySTART_HOURS_RANGE
^^ As definedbyFIELD_TWO (i.e. the5after the1inthe cron.daily line)
++ plus a random time between0and45minutesasdefinedbyRANDOM_DELAY
anacron是一個普通程序,還需要cron去調(diào)度。
/etc/cron.d/0hourly ? ?#cron調(diào)度

/etc/cron.hourly/0anacron ? ?#出發(fā)執(zhí)行anacron

/etc/anacrontab ? ?#執(zhí)行/etc/cron.daily目錄下任務(wù)

/etc/cron.daily/logrotate ? ?#logrotate任務(wù)最終被觸發(fā)

anacron ?-n ? ?#可以實現(xiàn)忽略配置文件中延遲執(zhí)行的時間并包含-s選項。
4、system-journald.service簡介
在有了systemd之后,由于是內(nèi)存喚醒的,它可以主動呼叫system-journald來協(xié)助記載登錄信息,因此在開機過程中所有信息,包括啟動服務(wù)失敗等情況等等,都直接記錄到systemd-journald里面去了。
systemd-journald用來管理與查詢這次開機后的登錄信息,而rsyslogd可以用來記錄以前和現(xiàn)在的所有資料到磁盤文件,方便未來進行查詢。
systemd-journald所記錄的信息是在內(nèi)存中,但系統(tǒng)利用文件的形態(tài)將它記錄到/run/log下。/run在CentOS7中其實就是內(nèi)存中的資料。
4.1、使用journalctl觀察登錄信息
systemd-journald.service的資料如何查閱?很簡單,通過journalctl即可。


4.2、logger指令的應(yīng)用
讓你的資料信息存儲到登錄文件中,試試logger這個命令。

4.3、保存journal的方式
再次強調(diào),systemd-journald.service的信息是不會放到下一次開機的,所以重新開機過后,那之前的信息統(tǒng)統(tǒng)沒有。我們大概都有啟動rsyslogd這個服務(wù)來進行后續(xù)的登錄文件存放,不過如果你比較喜歡journalctl的存取方式,那么也可以將其保存下來。
systemd-journald.service的配置文件/etc/systemd/journald.conf,如果你想要保存journalctl的信息,那么先得建立一個/var/log/journal目錄,并且修改一下該目錄的權(quán)限,那么以后重新啟動journald之后,日志文件就會主動復(fù)制一份到/var/log/journal目錄下。

需要注意,整個日志容量會持續(xù)增大,所以最好觀察系統(tǒng)可用容量。建議放置到/run/log的內(nèi)存中,以加快存取速度。
5、分析日志文件
日志的分析是很重要的!你可以自行vim或者是journalctl進入日志去查看相關(guān)信息。Centos提供了logwatch這個日志分析程式。
yum install logwatch.noarch -y

5.2、自定義日志分析腳本
wget http://linux.vbird.org//linux_basic/0570syslog//logfile_centos7.tar.gz
#鳥哥寫的
重點回顧:
日志文件可以記錄一個事件的何時、何地、何人、何事等信息,故系統(tǒng)有問題是務(wù)必查詢?nèi)罩疚募?/p>
系統(tǒng)的日志預(yù)設(shè)都集中在/var/log目錄內(nèi),其中又以messages記錄的信息最多;
系統(tǒng)日志文件的主要服務(wù)程序為:systemd-journald.service,rsyslog.service,rsyslogd;
rsyslogd的配置文件在/etc/rsyslog.conf,語法為"服務(wù),等級,裝置";等級從不嚴重到嚴重依次有info,notice,warning,error,critical,alert,emergency等;
rsyslogd本身有提供日志文件服務(wù)器的功能,修改/etc/rsyslog.conf內(nèi)容即可;
logrotate程序利用crontab來進行日志文件的輪替功能;
logrotate的配置文件為/etc/logrotate.conf,而額外的設(shè)置則可寫入/etc/logrotate.d/*內(nèi);
CentOS7由于內(nèi)建systemd-journald.service的功能,可以使用journalctl直接從內(nèi)存中讀取日志,查詢效果較佳;
logwatch為CentOS7預(yù)設(shè)提供的一個日志分析軟件。