有過服務(wù)端開發(fā)經(jīng)驗的同學應(yīng)該對日志這個東西不陌生, 把程序丟到服務(wù)器上跑, 日志就是我們了解運行情況,甚至解BUG的唯一入口了.
有些程序的日志量會增長得非常快, 比如Nginx, 當一個日志文件大到幾百MB甚至上GB的時候, 要從這個文件找出我們要的信息就基本等于大海撈針了,所以這時候?qū)θ罩具M行管理就顯得格外重要.
日志量大的平臺可以上ELK,利用ES的搜索優(yōu)勢基本不擔心日志數(shù)據(jù)量大的問題.但本文不打算涉及這方面的內(nèi)容.接下來主要講講如何正確得對日志文件做切分.
Linxu上的日志切分有兩種形式, 一種是使用Linux的logrotate工具, 另外一種是使用額外編寫的腳本, 這種形式一般是和日志庫配合使用.
因為業(yè)務(wù)的關(guān)系, 我們最開始拋棄了使用logrotate的方案, 因為我們覺得這會給實施人員增加系統(tǒng)的的維護負擔(后來發(fā)現(xiàn)是我們對logrotate不夠了解).于是我們使用第二種方案, 將日志的切分操作在我們的日志庫里面實現(xiàn), 我們封裝了logrus和lfshook, 利用logrus的hook機制將切分的邏輯嵌入在日志庫里面,代碼調(diào)用的時候會自動觸發(fā)切分操作.我們會這樣做也是受到beego框架的影響, 它的日志庫默認就帶了切分功能.
一切運作得很順利, 直到我們有一次在使用Openresty的時候, 發(fā)現(xiàn)Nginx的日志沒有被切分.因為之前使用Nginx的時候,默認安裝完畢后日志是會自動以天切分的, 于是我們開始找Nginx的配置項,看看是否漏掉了某些配置.但是不找沒關(guān)系,了解后才發(fā)現(xiàn)Nginx是不提供日志切分功能的.What ? 那之前的切分功能是怎么來的?
接下來解決問題的過程中發(fā)現(xiàn)了在/etc/logrotate.d/下有nginx的配置, 同時還有Mysql和其他基礎(chǔ)組件的,這時我們才想到有可能是RPM包(我們的系統(tǒng)是Centos)安裝的時候自動生成了一個logrotate的配置文件,后來一查果然是(命令:rpm -qpl xxx.rpm
).而我們的Openresty包沒有生成這個配置文件,所以導(dǎo)致Nginx的日志文件沒有被切分.
實際上很多軟件都只會做日志的記錄,不會幫忙做切分,這個確實是合理的.這讓我們想起logrus為什么不提供日志切分的功能,而是得由第三方的庫去完成.我們將日志切分的邏輯耦合進代碼里面,現(xiàn)在回過頭來看其實也不是很合理,正確的做法其實還是應(yīng)該在打RPM包的時候, 生成一個logrotate的配置文件, 這樣一來也不會增加實施人員的負擔,而且也可以將切分功能統(tǒng)一到一個地方去做.