认识与分析日志文件
了解日志文件是很重要的事情。日志文件可以記錄系統在什么時間、哪臺主機、哪個服務、出現了什么信息等。可以在系統出現問題的第一時間段從日志中找到解決方案
1、什么是日志文件
詳細而確實地分析以及備份系統的日志文件是一個SA應該要進行的任務之一。
1.1、日志文件的重要性
解決系統方面的錯誤;
解決網絡服務的問題;
過往事件記錄簿。
1.2、Linux常見日志文件名
日志文件可以幫助我們了解很多系統重要的事件,包括登錄者的信息部分,因此日志文件的權限通常是設置為僅有root能夠讀取而已。
一般而言,有以下這些:
/var/log/boot.log:開機的時候系統核心去偵測與啟動,接下來開始各種核心支援的功能啟動等;
/var/log/cron:例行性工作crontab;
/var/log/dmesg:記錄系統再開機的時候核心偵測過程中所產生的各種信息;
/var/log/lastlog:記錄系統上面所有賬號最近一次登錄系統的相關信息;
/var/log/mailog或/var/log/mail/*:記錄郵件信息的往來;
/var/log/messages:這個文件很重要,幾乎系統發生的錯誤信息都會記錄在這個文件中;
/var/log/secure:基本上,只要牽涉到需要輸入賬號密碼的軟件時,那么當登錄時都會被記錄到此文件中。
/var/log/httpd/*,/var/log/samba/*:不同的網絡服務會使用他們自己的日志文件來記錄他們自己產生的各種信息。
1.3、日志文件所需相關服務(daemon)與進程
日志文件是怎么產生的呢?基本上有兩種方式,一種由軟件開發商自定義寫入的日志文件與相關格式,例如www軟件Apache就是這樣處理的;另一種則是由Linux distribution提供的日志文件管理服務來統一管理,你只要將信息丟給這個服務后,它就會自己分門別類地將各種信息放置到相關的日志文件去!Centos提供rsyslog.service這個服務來管理。
rsyslog.service
不過要注意,如果任憑日志文件持續記錄的話,那么日志容量將無限增大。日志文件太大可能會導致讀寫效率不佳(從磁盤讀入內存,越大的文件消耗內存越多),所以需要對日志文件備份和更新。我們可以通過logrotate(日志輪替)命令來自動化處理日志文件容量與更新。
logrotate就是將舊的日志文件更改名稱,然后新建一個空的日志文件。如此一來,新的文件將重新開始記錄,然后將舊的日志保留一陣子,那就可以達到日志的輪轉。
針對日志文件所需的功能,我們需要的服務于進程有:
systemd-journald.service:最主要的信息收受者,由systemd提供;
rsystem.service:主要登錄系統于網絡等服務的信息;
logrotate:主要在進行日志的輪替功能
Centos7.x使用systemd提供的journalctl日志管理
基本上,系統由systemd所管理,那所有經由systemd啟動的服務()如果在啟動或結束的過程中發生了一些問題或是正常的信息),就會將該信息由systemd-journald.service以二進制的方式記錄下來,之后再將信息發個rsyslog.service作進一步的記載。
systemd-journald.service的記錄主要都放置與內存中,因此在存取方面效能比較好。我們也能透過journalctl以及systemctl status unit.service 來查看各個不同服務的日志。
1.4、日志文件的一般格式
一般來說,日志文件有以下重要數據:
事件發生日期與時間;
發生此事件的主機名;
啟動此事件的服務名稱或函數名稱;
該信息的實際數據內容。
/var/log/secure
2、rsyslog.service:記錄日志的服務
rsyslog.service
2.1、rsyslog.service的配置文件:/etc/rsyslog.conf
rsyslogd針對各種服務與信息記錄在某些文件的配置文件就是/etc/rsyslog.conf,這個文件規定了,什么服務的什么等級信息以及需要被記錄在哪里(設備或文件)這三個東西。
rsyslog.conf
服務名稱
Linux核心的syslog函數自行制定的服務名稱,軟件開發商可以透過呼叫上述的服務名稱來記錄他們的軟件。Linux核心的syslog認識的服務類型主要有以下這些:
syslog所制定的服務名稱與軟件呼叫方式
信息等級:
同一服務產生的信息也是有差別的。信息到底有多少種嚴重的等級呢?基本上,Linux核心的syslog將信息分為七個主要等級:
日志信息等級
基本上,在0(emerg)到6(info)等級間,越高代表越沒事,越靠近0則代表 事情危險了。除了0到6之外還有兩個比較特殊的等級,那就是debug與none。
特別留意一下在信息等級前還有個[=!]的連接符號:
.:代表比后面還要高的等級(含該等級)都要被記錄下來。如mail.info表示只要是mail的信息并且等級高于info就被記錄下來;
.=:代表所需要的等級就是后面接的等級而已,其他的不要;
.!:低于該等級的信息才會被記錄。
一般來說,比較常用的是“.”這個連接符號。
服務、daemon與函數名稱
區分下syslog、rsyslogd、rsyslog.service
rsyslog.conf語法練習
如將mail的相關資料寫入/var/log/maillog當中,那么在/etc/syslog.conf的如何設計?
mail.info /var/log/maillog
#任何等級大于info的信息都會被寫入到后面界的文件當中。
Centos7中預設的rsyslog.conf內容
/etc/rsyslog.conf文件
#kern.*:只要是內核產生的信息,全部送到console(終端機)去;
*.info;mail.none;authpriv.none;cron.none:由于mail,news,cron等類型生成的信息較多,且已經寫入下面的數個文件中,因此在/var/log/messages 里面就不記錄這些選項。除此之外的其他信息的記錄到/var/log/messages中;
authpriv.*:認證方面的信息均寫入/var/log/secure;
mail:郵件方面信息則均寫入/var/log/maillog;
cron:例行性工作調度均寫入/var/log/cron文件;
*.emerg:當產生嚴重等級錯誤時,將該等級的信息以wall的方式廣播給所有在系統登錄的賬號,要這么做的原因是希望在線的使用者能趕快通知管理員處理可怕的錯誤;
uucp,news.crit:新聞組方面的信息;
local7.*:將本機開機時應該顯示到屏幕的信息寫入到/var/log/boot.log中。
自行增加日志文件的功能
2.2、日志文件的安全性設置
如果一個很厲害的黑客,入侵了別人的電腦,干了壞事又不想留下證據,這就需要把日志文件清除干凈。如果你發現你主機下的log文件不見了,那就需要注意啦。
使用chattr +a這個屬性讓我們的日志文件只能被增加,不能被刪除和寫入。只有chattr -a 后才能刪除或移動改文件。使用此命令要注意哈,很容易由于自己忘記導致系統的重要信息無法記錄。
chattr
2.3、日志文件服務器的設置
將其他主機的日志文件放到日志文件服務器上。
server端假設
client端
3、日志文件的輪替(logrotate)
rsyslog利用的是daemon的方式來啟動,當有需求的時候立刻就會被執行,但是logrotate卻是在規定時間到了之后才進行日志文件的輪替,所以logrotate是掛在cron下面的。
3.1、logrotate的配置文件
/etc/logrotate.conf #主要參數 文件
/etc/logrotate.d/ #這個文件類似于nginx中的include的文件
logrotate的主要功能就是將舊的日志文件移動成舊文件,并且重新新建一個新的空的文件來記錄,執行結果如下所示:
logrotate
如上圖所示,當第一次執行完rotate之后,原本的message變成message.1,第二次執行后,message.1會變成message.2,繼續執行下去,但只保留三個message。
/etc/logrotate
重要的 logrotate 選項:
compress --> 壓縮日志文件的所有非當前版本;
nocompress -->不希望對日志文件進行壓縮;
daily,weekly,monthly --> 按指定計劃輪換日志文件,每天每周每月;
delaycompress --> 壓縮所有版本,除了當前和下一個最近的;
endscript --> 標記 prerotate 或 postrotate 腳本的結束;
errors "emailid" --> 給指定郵箱發送錯誤通知;
missingok --> 如果日志文件丟失,不要顯示錯誤;
notifempty --> 如果日志文件為空,則不輪換日志文件
olddir "dir" --> 指定日志文件的舊版本放在 “di” 中
postrotate --> 引入一個在日志被輪換后執行的腳本
prerotate --> 引入一個在日志被輪換前執行的腳本
rotate 'n' --> 在輪換方案中保存日志的 n 個版本
sharedscripts --> 對于整個日志組只運行一次腳本
size='logsize' --> 在日志大小大于 logsize(例如 100K,4M)時輪換
create 644 nginx adm,以指定的權限創建全新的日志文件,同事logrotate也會重命名原始日志文件;
接下來我們在/etc/logrotate.d/syslog輪替syslog這個文件
/etc/logrotate.d/syslog
在上面的例子中我們來談一下logrotate的寫法:
文件名:如/var/log/cron;
參數:進行輪替的參數用{ }括起來;
執行腳本:可調用外部命令來執行。prerotate,在啟動logrotate之前進行的命令;postrotate,在做完logrotate之后啟動的命令。這兩者在對于已加上特殊屬性的文件處理上面是相當重要的執行程序。
關于cron.daily什么時候運行:
/etc/anacrontab
所以,在凌晨3點到10點之間的時間(重新啟動后,機器上線5分鐘^^)后,運行/etc/cron.daily。如果沒有重新啟動,則該作業應在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去調度。
/etc/cron.d/0hourly #cron調度
/etc/cron.d/0hourly
/etc/cron.hourly/0anacron #出發執行anacron
/etc/cron.hourly/0anacron
/etc/anacrontab #執行/etc/cron.daily目錄下任務
/etc/anacrontab
/etc/cron.daily/logrotate #logrotate任務最終被觸發
/etc/cron.daily/logrotate
anacron -n #可以實現忽略配置文件中延遲執行的時間并包含-s選項。
4、system-journald.service簡介
在有了systemd之后,由于是內存喚醒的,它可以主動呼叫system-journald來協助記載登錄信息,因此在開機過程中所有信息,包括啟動服務失敗等情況等等,都直接記錄到systemd-journald里面去了。
systemd-journald用來管理與查詢這次開機后的登錄信息,而rsyslogd可以用來記錄以前和現在的所有資料到磁盤文件,方便未來進行查詢。
systemd-journald所記錄的信息是在內存中,但系統利用文件的形態將它記錄到/run/log下。/run在CentOS7中其實就是內存中的資料。
4.1、使用journalctl觀察登錄信息
systemd-journald.service的資料如何查閱?很簡單,通過journalctl即可。
journalctl命令
4.2、logger指令的應用
讓你的資料信息存儲到登錄文件中,試試logger這個命令。
logger
4.3、保存journal的方式
再次強調,systemd-journald.service的信息是不會放到下一次開機的,所以重新開機過后,那之前的信息統統沒有。我們大概都有啟動rsyslogd這個服務來進行后續的登錄文件存放,不過如果你比較喜歡journalctl的存取方式,那么也可以將其保存下來。
systemd-journald.service的配置文件/etc/systemd/journald.conf,如果你想要保存journalctl的信息,那么先得建立一個/var/log/journal目錄,并且修改一下該目錄的權限,那么以后重新啟動journald之后,日志文件就會主動復制一份到/var/log/journal目錄下。
需要注意,整個日志容量會持續增大,所以最好觀察系統可用容量。建議放置到/run/log的內存中,以加快存取速度。
5、分析日志文件
日志的分析是很重要的!你可以自行vim或者是journalctl進入日志去查看相關信息。Centos提供了logwatch這個日志分析程式。
yum install logwatch.noarch -y
logwatch
5.2、自定義日志分析腳本
wget http://linux.vbird.org//linux_basic/0570syslog//logfile_centos7.tar.gz
#鳥哥寫的
重點回顧:
日志文件可以記錄一個事件的何時、何地、何人、何事等信息,故系統有問題是務必查詢日志文件;
系統的日志預設都集中在/var/log目錄內,其中又以messages記錄的信息最多;
系統日志文件的主要服務程序為:systemd-journald.service,rsyslog.service,rsyslogd;
rsyslogd的配置文件在/etc/rsyslog.conf,語法為"服務,等級,裝置";等級從不嚴重到嚴重依次有info,notice,warning,error,critical,alert,emergency等;
rsyslogd本身有提供日志文件服務器的功能,修改/etc/rsyslog.conf內容即可;
logrotate程序利用crontab來進行日志文件的輪替功能;
logrotate的配置文件為/etc/logrotate.conf,而額外的設置則可寫入/etc/logrotate.d/*內;
CentOS7由于內建systemd-journald.service的功能,可以使用journalctl直接從內存中讀取日志,查詢效果較佳;
logwatch為CentOS7預設提供的一個日志分析軟件。
總結
- 上一篇: 《环太平洋2》导演力邀《权力的游戏》女星
- 下一篇: NetCDF 格式化数据概述