国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 系統 > Linux > 正文

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

2024-08-27 23:56:31
字體:
來源:轉載
供稿:網友
日志是重要的系統文件,記錄和保存了系統中所有的重要事件。但是日志文件也需要進行定期的維護,因為日志文件是不斷增長的,如果完全不進行日志維護,而任由其隨意遞增,那么用不了多久,我們的硬盤就會被寫滿。

日志維護的最主要的工作就是把舊的日志文件刪除,從而騰出空間保存新的日志文件。這項工作如果靠管理員手工來完成,那其實是非常煩瑣的,而且也容易忘記。那么 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 這個配置文件的。
發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 保亭| 巫溪县| 西平县| 车致| 南和县| 彰化县| 迁西县| 基隆市| 仪陇县| 潍坊市| 镇沅| 噶尔县| 潞西市| 石狮市| 曲麻莱县| 合山市| 山东省| 双柏县| 北辰区| 阿巴嘎旗| 肥城市| 洛宁县| 台前县| 武宣县| 安溪县| 湄潭县| 拉孜县| 邵东县| 阳原县| 萨迦县| 邢台县| 富源县| 宝丰县| 什邡市| 深州市| 东港市| 文化| 宜兰县| 南江县| 平原县| 嵊泗县|