首頁 > linux教程 > Linux系統日志管理 閱讀:0更新時間:2020-03-28 01:03:47

Linux日志輪替(日志轉儲)及logrotate配置文件分析

日志是重要的系統文件,記錄和保存了系統中所有的重要事件。但是日志文件也需要進行定期的維護,因為日志文件是不斷增長的,如果完全不進行日志維護,而任由其隨意遞增,那么用不了多久,我們的硬盤就會被寫滿。

日志維護的最主要的工作就是把舊的日志文件刪除,從而騰出空間保存新的日志文件。這項工作如果靠管理員手工來完成,那其實是非常煩瑣的,而且也容易忘記。那么 linux 系統是否可以自動完成日志的輪替工作呢?

logrotate 就是用來進行日志輪替(也叫日志轉儲)的,也就是把舊的日志文件移動并改名,同時創建一個新的空日志文件用來記錄新日志,當舊日志文件超出保存的范圍時就刪除。

日志文件的命名規則

日志輪替最主要的作用就是把舊的日志文件移動并改名,同時建立新的空日志文件,當舊日志文件超出保存的范圍時就刪除。那么,舊的日志文件改名之后,如何命名呢?主要依靠 /etc/logrotate.conf 配置文件中的“dateext”參數。

如果配置文件中有“dateext”參數,那么日志會用日期來作為日志文件的后綴,如“secure-20130605”。這樣日志文件名不會重疊,也就不需要對日志文件進行改名,只需要保存指定的日志個數,刪除多余的日志文件即可。

如果配置文件中沒有“dateext”參數,那么日志文件就需要進行改名了。當第一次進行日志輪替時,當前的“secure”日志會自動改名為“secure.1”,然后新建“secure”日志,用來保存新的日志;當第二次進行日志輪替時,“secure.1”會自動改名為“secure.2”,當前的“secure”日志會自動改名為“secure.1”,然后也會新建“secure”日志,用來保存新的日志;以此類推。

logrotate配置文件

我們來查看一下 logrotate 的配置文件 /etc/logrotate.conf 的默認內容。

[root@localhost ~]# vi /etc/logrotate.conf
#see "man logrotate" for details
#rotate log files weekly
weekly
#每周對日志文件進行一次輪替
#keep 4 weeks worth of backlogs rotate 4
#保存4個日志文件,也就是說,如果進行了5次日志輪替,就會刪除第一個備份曰志
#create new (empty) log files after rotating old ones create
#在日志輪替時,自動創建新的日志文件
#use date as a suffix of the rotated file dateext
#使用日期作為日志輪替文件的后綴
#uncomment this if you want your log files compressed #compress
#日志文件是否壓縮。如果取消注釋,則日志會在轉儲的同時進行壓縮
#以上日志配置為默認配置,如果需要輪替的日志沒有設定獨立的參數,那么都會遵循以上參數
#如果輪替曰志配置了獨立參數,那么獨立參數的優先級更高
#RPM packages drop log rotation information into this directory include /etc/logrotate.d
#包含/etc/logrotate.d/目錄中所有的子配置文件。也就是說,會把這個目錄中所有的子配置文件讀取進來,進行日志輪替
#no packages own wtmp and btmp -- we'11 rotate them here
#以下兩個輪替曰志有自己的獨立參數,如果和默認的參數沖突,則獨立參數生效
/var/log/wtmp {
#以下參數僅對此目錄有效
monthly
#每月對日志文件進行一次輪替
create 0664 root utmp
#建立的新日志文件,權限是0664,所有者是root,所屬組是utmp組
minsize 1M
#日志文件最小輪替大小是1MB。也就是日志一定要超過1MB才會輪替,否則就算時間達到一個月,也不進行曰志輪替
rotate 1
#僅保留一個曰志備份。也就是只保留wtmp和wtmp.1曰志)
/var/log/btmp {
#以下參數只對/var/log/btmp生效
missingok
#如果日志不存在,則忽略該日志的警告信患
monthly
create 0600 root utmp
rotate 1
}
# system-specific logs may be also be configured here.

在這個配置文件中,主要分為三部分:
  • 第一部分是默認設置,如果需要轉儲的日志文件沒有特殊配置,則遵循默認設置的參數;
  • 第二部分是讀取 /etc/logrotate.d/ 目錄中的日志輪替的子配置文件,也就是說,在 /etc/logrotate.d/ 目錄中的所有符合語法規則的子配置文件也會進行日志輪替;
  • 第三部分是對 wtmp 和 btmp 日志文件的輪替進行設定,如果此設定和默認參數沖突,則當前設定生效(如 wtmp 的當前參數設定的輪替時間是每月,而默認參數的輪替時間是每周,則對 wtmp 這個日志文件來說,輪替時間是每月,當前的設定參數生效)。

logrotate 配置文件的主要參數如表 1 所示。

表 1 logrotate配置文件的主要參數
參 致 參數說明
daily 日志的輪替周期是毎天
weekly 日志的輪替周期是每周
monthly 日志的輪控周期是每月
rotate數宇 保留的日志文件的個數。0指沒有備份
compress 當進行日志輪替時,對舊的日志進行壓縮
create mode owner group 建立新日志,同時指定新日志的權限與所有者和所屬組.如create 0600 root utmp
mail address 當進行日志輪替時.輸出內存通過郵件發送到指定的郵件地址
missingok 如果日志不存在,則忽略該日志的警告信息
nolifempty 如果曰志為空文件,則不進行日志輪替
minsize 大小 日志輪替的最小值。也就是日志一定要達到這個最小值才會進行輪持,否則就算時間達到也不進行輪替
size大小 日志只有大于指定大小才進行日志輪替,而不是按照時間輪替,如size 100k
dateext 使用日期作為日志輪替文件的后綴,如secure-20130605
sharedscripts 在此關鍵宇之后的腳本只執行一次
prerotate/cndscript 在曰志輪替之前執行腳本命令。endscript標識prerotate腳本結束
postrolaie/endscripl 在日志輪替之后執行腳本命令。endscripi標識postrotate腳本結束

這些參數中較為難理解的應該是 prerotate/endscript 和 postrotate/endscript,我們利用“man logrotate”中的例子來解釋一下這兩個參數。例如:

"/var/log/httpd/access.log" /var/log/httpd/error.log {
#日志輪替的是/var/log/httpd/中RPM包默認安裝的apache正確訪問日志和錯誤日志
    rotate 5
    #輪替5次
    mail www@my.org
    #把信息發送到指定郵箱
    size 100k
    #日志大于100KB時才進行日志輪替,不再按照時間輪替
    sharedscripts
    #以下腳本只執行一次
    postrotate
    #在日志輪替結束之后,執行以下腳本
    /usr/bin/killall -HUP httpd
    #重啟apache 服務
endscript
#腳本結束
}

prerotate 和 postrotate 主要用于在日志輪替的同時執行指定的腳本,一般用于日志輪替之后重啟服務。這里強調一下,如果你的日志是寫入 rsyslog 服務的配置文件的,那么把新日志加入 logrotate 后,一定要重啟 rsyslog 服務,否則你會發現,雖然新日志建立了,但數據還是寫入了舊的日志當中。那是因為雖然 logrotate 知道日志輪替了,但是 rsyslog 服務并不知道。

同理,如果采用源碼包安裝了 apache、Nginx 等服務,則需要重啟 apache 或 Nginx 服務,同時還要重啟 rsyslog 服務,否則日志也不能正常輪替。

不過,這里有一個典型應用就是給予特定的日志加入 chattr 的 a 屬性。如果系統文件加入了 a 屬性,那么這個文件就只能增加數據,而不能刪除和修改已有的數據,root 用戶也不例外。

因此,我們會給重要的日志文件加入 a 屬性,這樣就可以保護日志文件不被惡意修改。不過,一旦加入了 a 屬性,那么在進行日志輪替時,這個日志文件是不能被改名的,當然也就不能進行日志輪替了。我們可以利用 prerotate 和 postrotate 參數來修改日志文件的 chattr 的 a 屬性。

把自己的日志加入日志輪替

如果有些日志默認沒有加入日志輪替(比如源碼包安裝的服務的日志,或者自己添加的日志),那么這些日志默認是不會進行日志輪替的,這樣當然不符合我們對日志的管理要求。如果需要把這些日志也加入日志輪替,那該如何操作呢?

這里有兩種方法:
  • 第一種方法是直接在 /etc/logrotate.conf 配置文件中寫入該日志的輪替策略,從而把日志加入輪替;
  • 第二種方法是在 /etc/logrotate.d/ 目錄中新建立該日志的輪替文件,在該輪替文件中寫入正確的輪替策略,因為該目錄中的文件都會被包含到主配置文件中,所以也可以把日志加入輪替。

我們推薦第二種方法,因為系統中需要輪替的日志非常多,如果全部直接寫入 /etc/logrotate.conf 配置文件,那么這個文件的可管理性就會非常差,不利于此文件的維護。

說起來很復雜,我們舉個例子。還記得我們自己生成的 /var/log/alert.log 日志嗎?這個日志不是系統默認日志,而是我們通過 /etc/rsyslog.conf 配置文件自己生成的日志,所以默認這個日志是不會進行輪替的。如果我們需要把這個日志加入日志輪替策略,那該怎么實現呢?我們采用第二種方法,也就是在 /etc/logrotate.d/ 目錄中建立此日志的輪替文件。

具體步驟如下:

[root@localhost ~]# chattr +a /var/log/alert.log #先給日志文件賦予chattr的a屬性,保證日志的安全
[root@localhost ~]# vi /etc/logrotate.d/alter
#創建alter輪替文件,把/var/log/alert.log加入輪替
/var/log/alert.log {
    weekly
    #每周輪替一次
    rotate 6
    #保留6個輪替曰志
    sharedscripts
    #以下命令只執行一次
    prerotate
    #在日志輪替之前執行
        /usr/bin/chattr -a /var/log/alert.log
        #在日志輪替之前取消a屬性,以便讓日志可以輪替
    endscript
    #腳本結朿
    sharedscripts
    postrotate
    #在日志輪替之后執行
        /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服務,保證日志輪替正常進行
}

這樣我們自己生成的日志 /var/log/alert.log 也就可以進行日志輪替了,當然這些配置信息也是可以直接寫入 /etc/logrotate.conf 這個配置文件的。

beylze編程學院,一個分享編程知識和seo優化知識的網站。跟著beylze一起學習,每天都有進步。

通俗易懂,深入淺出,一篇文章只講一個知識點。

文章不深奧,不需要鉆研,在公交、在地鐵、在廁所都可以閱讀,隨時隨地漲姿勢。

文章不涉及代碼,不燒腦細胞,人人都可以學習。

當你決定關注beylze(公眾號:beylze),你已然超越了90%的其他從業者!

相關文章

優秀教程

国产亚洲欧美日韩