新聞中心

專業(yè)從事成都網(wǎng)站建設(shè)、網(wǎng)站制作,高端網(wǎng)站制作設(shè)計(jì),小程序設(shè)計(jì),網(wǎng)站推廣的成都做網(wǎng)站的公司。優(yōu)秀技術(shù)團(tuán)隊(duì)竭力真誠服務(wù),采用H5網(wǎng)站設(shè)計(jì)+CSS3前端渲染技術(shù),響應(yīng)式網(wǎng)站設(shè)計(jì),讓網(wǎng)站在手機(jī)、平板、PC、微信下都能呈現(xiàn)。建站過程建立專項(xiàng)小組,與您實(shí)時(shí)在線互動(dòng),隨時(shí)提供解決方案,暢聊想法和感受。
日志維護(hù)的最主要的工作就是把舊的日志文件刪除,從而騰出空間保存新的日志文件。這項(xiàng)工作如果靠管理員手工來完成,那其實(shí)是非常煩瑣的,而且也容易忘記。那么 linux 系統(tǒng)是否可以自動(dòng)完成日志的輪替工作呢?
logrotate 就是用來進(jìn)行日志輪替(也叫日志轉(zhuǎn)儲(chǔ))的,也就是把舊的日志文件移動(dòng)并改名,同時(shí)創(chuàng)建一個(gè)新的空日志文件用來記錄新日志,當(dāng)舊日志文件超出保存的范圍時(shí)就刪除。
日志文件的命名規(guī)則
日志輪替最主要的作用就是把舊的日志文件移動(dòng)并改名,同時(shí)建立新的空日志文件,當(dāng)舊日志文件超出保存的范圍時(shí)就刪除。那么,舊的日志文件改名之后,如何命名呢?主要依靠 /etc/logrotate.conf 配置文件中的“dateext”參數(shù)。
如果配置文件中有“dateext”參數(shù),那么日志會(huì)用日期來作為日志文件的后綴,如“secure-20130605”。這樣日志文件名不會(huì)重疊,也就不需要對(duì)日志文件進(jìn)行改名,只需要保存指定的日志個(gè)數(shù),刪除多余的日志文件即可。
如果配置文件中沒有“dateext”參數(shù),那么日志文件就需要進(jìn)行改名了。當(dāng)?shù)谝淮芜M(jìn)行日志輪替時(shí),當(dāng)前的“secure”日志會(huì)自動(dòng)改名為“secure.1”,然后新建“secure”日志,用來保存新的日志;當(dāng)?shù)诙芜M(jìn)行日志輪替時(shí),“secure.1”會(huì)自動(dòng)改名為“secure.2”,當(dāng)前的“secure”日志會(huì)自動(dòng)改名為“secure.1”,然后也會(huì)新建“secure”日志,用來保存新的日志;以此類推。
logrotate配置文件
我們來查看一下 logrotate 的配置文件 /etc/logrotate.conf 的默認(rèn)內(nèi)容。
[root@localhost ~]# vi /etc/logrotate.conf
#see "man logrotate" for details
#rotate log files weekly
weekly
#每周對(duì)日志文件進(jìn)行一次輪替
#keep 4 weeks worth of backlogs rotate 4
#保存4個(gè)日志文件,也就是說,如果進(jìn)行了5次日志輪替,就會(huì)刪除第一個(gè)備份曰志
#create new (empty) log files after rotating old ones create
#在日志輪替時(shí),自動(dòng)創(chuàng)建新的日志文件
#use date as a suffix of the rotated file dateext
#使用日期作為日志輪替文件的后綴
#uncomment this if you want your log files compressed #compress
#日志文件是否壓縮。如果取消注釋,則日志會(huì)在轉(zhuǎn)儲(chǔ)的同時(shí)進(jìn)行壓縮
#以上日志配置為默認(rèn)配置,如果需要輪替的日志沒有設(shè)定獨(dú)立的參數(shù),那么都會(huì)遵循以上參數(shù)
#如果輪替曰志配置了獨(dú)立參數(shù),那么獨(dú)立參數(shù)的優(yōu)先級(jí)更高
#RPM packages drop log rotation information into this directory include /etc/logrotate.d
#包含/etc/logrotate.d/目錄中所有的子配置文件。也就是說,會(huì)把這個(gè)目錄中所有的子配置文件讀取進(jìn)來,進(jìn)行日志輪替
#no packages own wtmp and btmp -- we'11 rotate them here
#以下兩個(gè)輪替曰志有自己的獨(dú)立參數(shù),如果和默認(rèn)的參數(shù)沖突,則獨(dú)立參數(shù)生效
/var/log/wtmp {
#以下參數(shù)僅對(duì)此目錄有效
monthly
#每月對(duì)日志文件進(jìn)行一次輪替
create 0664 root utmp
#建立的新日志文件,權(quán)限是0664,所有者是root,所屬組是utmp組
minsize 1M
#日志文件最小輪替大小是1MB。也就是日志一定要超過1MB才會(huì)輪替,否則就算時(shí)間達(dá)到一個(gè)月,也不進(jìn)行曰志輪替
rotate 1
#僅保留一個(gè)曰志備份。也就是只保留wtmp和wtmp.1曰志)
/var/log/btmp {
#以下參數(shù)只對(duì)/var/log/btmp生效
missingok
#如果日志不存在,則忽略該日志的警告信患
monthly
create 0600 root utmp
rotate 1
}
# system-specific logs may be also be configured here.
在這個(gè)配置文件中,主要分為三部分:
- 第一部分是默認(rèn)設(shè)置,如果需要轉(zhuǎn)儲(chǔ)的日志文件沒有特殊配置,則遵循默認(rèn)設(shè)置的參數(shù);
- 第二部分是讀取 /etc/logrotate.d/ 目錄中的日志輪替的子配置文件,也就是說,在 /etc/logrotate.d/ 目錄中的所有符合語法規(guī)則的子配置文件也會(huì)進(jìn)行日志輪替;
- 第三部分是對(duì) wtmp 和 btmp 日志文件的輪替進(jìn)行設(shè)定,如果此設(shè)定和默認(rèn)參數(shù)沖突,則當(dāng)前設(shè)定生效(如 wtmp 的當(dāng)前參數(shù)設(shè)定的輪替時(shí)間是每月,而默認(rèn)參數(shù)的輪替時(shí)間是每周,則對(duì) wtmp 這個(gè)日志文件來說,輪替時(shí)間是每月,當(dāng)前的設(shè)定參數(shù)生效)。
logrotate 配置文件的主要參數(shù)如表 1 所示。
| 參 致 | 參數(shù)說明 |
|---|---|
| daily | 日志的輪替周期是毎天 |
| weekly | 日志的輪替周期是每周 |
| monthly | 日志的輪控周期是每月 |
| rotate數(shù)宇 | 保留的日志文件的個(gè)數(shù)。0指沒有備份 |
| compress | 當(dāng)進(jìn)行日志輪替時(shí),對(duì)舊的日志進(jìn)行壓縮 |
| create mode owner group | 建立新日志,同時(shí)指定新日志的權(quán)限與所有者和所屬組.如create 0600 root utmp |
| mail address | 當(dāng)進(jìn)行日志輪替時(shí).輸出內(nèi)存通過郵件發(fā)送到指定的郵件地址 |
| missingok | 如果日志不存在,則忽略該日志的警告信息 |
| nolifempty | 如果曰志為空文件,則不進(jìn)行日志輪替 |
| minsize 大小 | 日志輪替的最小值。也就是日志一定要達(dá)到這個(gè)最小值才會(huì)進(jìn)行輪持,否則就算時(shí)間達(dá)到也不進(jìn)行輪替 |
| size大小 | 日志只有大于指定大小才進(jìn)行日志輪替,而不是按照時(shí)間輪替,如size 100k |
| dateext | 使用日期作為日志輪替文件的后綴,如secure-20130605 |
| sharedscripts | 在此關(guān)鍵宇之后的腳本只執(zhí)行一次 |
| prerotate/cndscript | 在曰志輪替之前執(zhí)行腳本命令。endscript標(biāo)識(shí)prerotate腳本結(jié)束 |
| postrolaie/endscripl | 在日志輪替之后執(zhí)行腳本命令。endscripi標(biāo)識(shí)postrotate腳本結(jié)束 |
這些參數(shù)中較為難理解的應(yīng)該是 prerotate/endscript 和 postrotate/endscript,我們利用“man logrotate”中的例子來解釋一下這兩個(gè)參數(shù)。例如:
"/var/log/httpd/access.log" /var/log/httpd/error.log {
#日志輪替的是/var/log/httpd/中RPM包默認(rèn)安裝的apache正確訪問日志和錯(cuò)誤日志
rotate 5
#輪替5次
mail [email protected]
#把信息發(fā)送到指定郵箱
size 100k
#日志大于100KB時(shí)才進(jìn)行日志輪替,不再按照時(shí)間輪替
sharedscripts
#以下腳本只執(zhí)行一次
postrotate
#在日志輪替結(jié)束之后,執(zhí)行以下腳本
/usr/bin/killall -HUP httpd
#重啟apache 服務(wù)
endscript
#腳本結(jié)束
}
prerotate 和 postrotate 主要用于在日志輪替的同時(shí)執(zhí)行指定的腳本,一般用于日志輪替之后重啟服務(wù)。這里強(qiáng)調(diào)一下,如果你的日志是寫入 rsyslog 服務(wù)的配置文件的,那么把新日志加入 logrotate 后,一定要重啟 rsyslog 服務(wù),否則你會(huì)發(fā)現(xiàn),雖然新日志建立了,但數(shù)據(jù)還是寫入了舊的日志當(dāng)中。那是因?yàn)殡m然 logrotate 知道日志輪替了,但是 rsyslog 服務(wù)并不知道。
同理,如果采用源碼包安裝了 apache、Nginx 等服務(wù),則需要重啟 apache 或 Nginx 服務(wù),同時(shí)還要重啟 rsyslog 服務(wù),否則日志也不能正常輪替。
不過,這里有一個(gè)典型應(yīng)用就是給予特定的日志加入 chattr 的 a 屬性。如果系統(tǒng)文件加入了 a 屬性,那么這個(gè)文件就只能增加數(shù)據(jù),而不能刪除和修改已有的數(shù)據(jù),root 用戶也不例外。
因此,我們會(huì)給重要的日志文件加入 a 屬性,這樣就可以保護(hù)日志文件不被惡意修改。不過,一旦加入了 a 屬性,那么在進(jìn)行日志輪替時(shí),這個(gè)日志文件是不能被改名的,當(dāng)然也就不能進(jìn)行日志輪替了。我們可以利用 prerotate 和 postrotate 參數(shù)來修改日志文件的 chattr 的 a 屬性。
把自己的日志加入日志輪替
如果有些日志默認(rèn)沒有加入日志輪替(比如源碼包安裝的服務(wù)的日志,或者自己添加的日志),那么這些日志默認(rèn)是不會(huì)進(jìn)行日志輪替的,這樣當(dāng)然不符合我們對(duì)日志的管理要求。如果需要把這些日志也加入日志輪替,那該如何操作呢?
這里有兩種方法:
- 第一種方法是直接在 /etc/logrotate.conf 配置文件中寫入該日志的輪替策略,從而把日志加入輪替;
- 第二種方法是在 /etc/logrotate.d/ 目錄中新建立該日志的輪替文件,在該輪替文件中寫入正確的輪替策略,因?yàn)樵撃夸浿械奈募紩?huì)被包含到主配置文件中,所以也可以把日志加入輪替。
我們推薦第二種方法,因?yàn)橄到y(tǒng)中需要輪替的日志非常多,如果全部直接寫入 /etc/logrotate.conf 配置文件,那么這個(gè)文件的可管理性就會(huì)非常差,不利于此文件的維護(hù)。
說起來很復(fù)雜,我們舉個(gè)例子。還記得我們自己生成的 /var/log/alert.log 日志嗎?這個(gè)日志不是系統(tǒng)默認(rèn)日志,而是我們通過 /etc/rsyslog.conf 配置文件自己生成的日志,所以默認(rèn)這個(gè)日志是不會(huì)進(jìn)行輪替的。如果我們需要把這個(gè)日志加入日志輪替策略,那該怎么實(shí)現(xiàn)呢?我們采用第二種方法,也就是在 /etc/logrotate.d/ 目錄中建立此日志的輪替文件。
具體步驟如下:
[root@localhost ~]# chattr +a /var/log/alert.log #先給日志文件賦予chattr的a屬性,保證日志的安全
[root@localhost ~]# vi /etc/logrotate.d/alter
#創(chuàng)建alter輪替文件,把/var/log/alert.log加入輪替
/var/log/alert.log {
weekly
#每周輪替一次
rotate 6
#保留6個(gè)輪替曰志
sharedscripts
#以下命令只執(zhí)行一次
prerotate
#在日志輪替之前執(zhí)行
/usr/bin/chattr -a /var/log/alert.log
#在日志輪替之前取消a屬性,以便讓日志可以輪替
endscript
#腳本結(jié)朿
sharedscripts
postrotate
#在日志輪替之后執(zhí)行
/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服務(wù),保證日志輪替正常進(jìn)行
}
這樣我們自己生成的日志 /var/log/alert.log 也就可以進(jìn)行日志輪替了,當(dāng)然這些配置信息也是可以直接寫入 /etc/logrotate.conf 這個(gè)配置文件的。
本文名稱:Linux日志輪替(日志轉(zhuǎn)儲(chǔ))及l(fā)ogrotate配置文件分析
當(dāng)前網(wǎng)址:http://m.fisionsoft.com.cn/article/dhsjshg.html


咨詢
建站咨詢
