logrotate-Linux下的日志切割技術(shù)

什么是日志切割阱冶?

日志切割指的是當(dāng)應(yīng)用程序或操作系統(tǒng)的日志文件滿足設(shè)定的觸發(fā)條件舔示,對其進(jìn)行切割/分割處理彪置。切割后的日志會在原有日志的基礎(chǔ)上多出一個新的日志文件撑螺,且后續(xù)產(chǎn)生的日志也會被寫入到新的日志文件中里伯,直到下一次滿足設(shè)定的觸發(fā)條件時城瞎。

一般情況下,我們習(xí)慣于將各種應(yīng)用程序(Web端程序疾瓮、應(yīng)用服務(wù)脖镀、數(shù)據(jù)庫等)軟件部署在 Linux操作系統(tǒng)上,但眾多軟件部署后運(yùn)行時會產(chǎn)生對應(yīng)的日志記錄爷贫,以便于出現(xiàn)故障后能夠及時排查問題原因认然。但久而久之,隨著時間的推長漫萄,應(yīng)用程序的日志文件可能會變得很龐雜卷员,這對于運(yùn)維、管理腾务、故障排查等來說非常不方便毕骡,因此,及時對日志進(jìn)行定期切割和清理時非常有必要的岩瘦。

常用的日志切割方式:按時間按日志大小未巫。

按時間切割:在進(jìn)行切割日志時,以時間為標(biāo)準(zhǔn)启昧,日志出現(xiàn)的時間滿足設(shè)定的時間閾值時叙凡,則進(jìn)行日志切割。類似的典型用法有:/var/log/messages 日志即按每7天切割一次的規(guī)則進(jìn)行日志切分密末。

按日志大小切割:在進(jìn)行切割日志時握爷,以日志大小為參考標(biāo)準(zhǔn)跛璧,日志的大小滿足設(shè)定的大小時進(jìn)行日志切割。一般應(yīng)用程序的日志多使用容量進(jìn)行切割新啼,例如追城,jenkins

logrotate-日志輪轉(zhuǎn)

Linux 操作系統(tǒng)上切割日志可以通過 logrotate 來實(shí)現(xiàn)。

相比其他日志切割軟件來看燥撞,使用 logrotate 有以下優(yōu)點(diǎn):

  • logrotate 是Linux操作系統(tǒng)上自帶的一款開源的日志切割軟件座柱,因此你無需安裝
  • logrotate 自身已經(jīng)集成進(jìn)操作系統(tǒng)的定時任務(wù)中,因此你無需再配置定時任務(wù)
  • logrotate 自身支持日志壓縮

logrotate 配置文件解析

logrotate 的全局配置文件為 /etc/logrotate.conf物舒。

[root@server ~]# cat /etc/logrotate.conf
# see "man logrotate" for details
# rotate log files weekly
weekly

# keep 4 weeks worth of backlogs
rotate 4

# 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

# no packages own wtmp and btmp -- we'll rotate them here
/var/log/wtmp {
    monthly
    create 0664 root utmp
    minsize 1M
    rotate 1
}

/var/log/btmp {
    missingok
    monthly
    create 0600 root utmp
    rotate 1
}

# system-specific logs may be also be configured here.
  • weekly:表示每周輪轉(zhuǎn)一次色洞,常見用法有 dailyweekly茶鉴、monthly锋玲、yearly

  • rotate:保留的日志副本數(shù)

  • create:日志輪轉(zhuǎn)時創(chuàng)建一個新的日志文件用來接受新產(chǎn)生的日志

  • dateext:切割日志時使用日期作為文件后綴

  • compress:輪轉(zhuǎn)后的日志是否進(jìn)行壓縮

  • include /etc/logrotate.d/:日志輪轉(zhuǎn)時會加載 /etc/logrotate.d/ 目錄下的所有配置文件(ps:該目錄下的配置必須在操作系統(tǒng)中有rpm包存在)

    /var/log/btmp/var/log/wtmp 兩個日志因?yàn)樵诓僮飨到y(tǒng)中沒有對應(yīng)的 rpm 包,因此被當(dāng)作"孤兒"日志涵叮,配置在 /etc/logrotate.conf 全局配置中惭蹂。

自定義logrotate配置

Linux 操作上的一些系統(tǒng)服務(wù)默認(rèn)已經(jīng)配置了日志切割規(guī)則,可以通過查看 /etc/logrotate.d/ 目錄下的文件來查看

[root@server ~]# ls /etc/logrotate.d/
bootlog  chrony  firewalld  jenkins  syslog  wpa_supplicant  yum

倘若操作系統(tǒng)上新部署了一項(xiàng)應(yīng)用程序割粮,或需要對其他的日志文件配置切割規(guī)則盾碗,你可以自定義 logrotate 的配置文件使其生效。這里以 /var/log/audit/audit.log 日志為例

[root@server ~]# cat /etc/logrotate.d/audit

/var/log/audit/*.log {

    missingok           # 日志切割時缺少該日志不會報錯
    weekly              # 每周切割一次
    rotate 10           # 切割后最多保留10個文件
    size +100M          # 當(dāng)前日志容量超過100M時,立即進(jìn)行日志切割
    compress            # 切割后的日志進(jìn)行壓縮
    dateext             # 切割后的日志以時間'年月日'為后綴
    notifempty          # 日志為空時不進(jìn)行切割
    create 0600 root root       # 切割時創(chuàng)建一個新日志文件,模式為0600,日志屬組為root root

}

logrotate 提供了一些命令行參數(shù)舀瓢,用來測試并查看配置及運(yùn)行結(jié)果

# 測試配置文件的語法是否合法
[root@server ~]# logrotate --debug --force /etc/logrotate.d/audit
reading config file /etc/logrotate.d/audit
Allocating hash table for state file, size 15360 B

Handling 1 logs

rotating pattern: /var/log/audit/*.log  forced from command line (10 rotations)
empty log files are not rotated, old logs are removed
considering log /var/log/audit/audit.log
  log needs rotating
rotating log /var/log/audit/audit.log, log->rotateCount is 10
dateext suffix '-20211124'
glob pattern '-[0-9][0-9][0-9][0-9][0-9][0-9][0-9][0-9]'
glob finding old rotated logs failed
fscreate context set to system_u:object_r:auditd_log_t:s0
renaming /var/log/audit/audit.log to /var/log/audit/audit.log-20211124
creating new /var/log/audit/audit.log mode = 0600 uid = 0 gid = 0
compressing log with: /bin/gzip

參數(shù)釋義

壓縮
  • compress:使用壓縮廷雅,默認(rèn)的壓縮方式為 gzip
  • compresscmd:自定義壓縮的命令,默認(rèn)壓縮方式為 gzip
  • uncompresscmd:自定義解壓的命令京髓,默認(rèn)解壓工具為 gunzip
  • compressext:壓縮時使用后綴航缀,默認(rèn) gzip 壓縮格式下后綴為 .gz
  • compressoptions:壓縮選項(xiàng),默認(rèn)使用 gzip堰怨;如果使用其他壓縮選項(xiàng)芥玉,需要設(shè)置 compressoptions 與之匹配
  • delaycompress:延遲壓縮,實(shí)際壓縮生效的時間發(fā)生在下一次日志切割之時
  • nodelaycompress:不使用延遲壓縮备图,即輪轉(zhuǎn)時壓縮(默認(rèn)配置)
  • nocompress:不實(shí)用壓縮
歸檔方式
  • copy:輪轉(zhuǎn)時復(fù)制完整的日志文件灿巧,常用來做當(dāng)前日志文件的鏡像備份。當(dāng)指定 copy 選項(xiàng)時揽涮, create 選項(xiàng)會失效
  • copytruncate:輪轉(zhuǎn)時復(fù)制完整的日志文件并清空原來的日志文件(相當(dāng)于 echo > logfile)抠藕,新寫入的日志會繼續(xù)往清空后的日志文件中寫入。但在日志 copytruncate 的過程中寫入的日志可能會丟失蒋困。當(dāng)指定 copytruncate 選項(xiàng)時盾似,create 選項(xiàng)會失效
  • nocopy:輪轉(zhuǎn)時不會復(fù)制原日志文件
  • nocopytruncate:輪轉(zhuǎn)時復(fù)制原日志文件后不會清空原日志文件的內(nèi)容
  • create:輪轉(zhuǎn)時創(chuàng)建一個新的日志文件,可以設(shè)置創(chuàng)建文件的權(quán)限雪标、所有者颜说、及屬組
  • nocreate:輪轉(zhuǎn)時不會創(chuàng)建新的日志文件
  • createolddir:輪轉(zhuǎn)時如果指定的目錄不存在购岗,則會創(chuàng)建汰聋,支持設(shè)置目錄的權(quán)限门粪、所有者和屬組
  • nocreateolddir:輪轉(zhuǎn)時指定的目錄不存在時不會進(jìn)行創(chuàng)建
歸檔路徑
  • olddir directory:配置目錄后,輪轉(zhuǎn)后的日志會保存在指定的目錄下
  • noolddir:輪轉(zhuǎn)后的日志保存在日志原有的目錄下
歸檔刪除
  • shred:刪除日志時使用 shred -u(粉碎式刪除) 的方式(默認(rèn)關(guān)閉)
  • shredcycles count:刪除日志前會先重寫覆蓋日志文件烹困,達(dá)到設(shè)定的次數(shù)后才進(jìn)行刪除
  • noshred:刪除日志時使用 unlink 的方式刪除(還沒搞懂這個刪除邏輯)
歸檔規(guī)則
  • hourly:每小時進(jìn)行一次日志切割

  • daily:每天進(jìn)行一次日志切割

  • weekly:每周進(jìn)行一次日志切割

  • monthly:每月進(jìn)行一次日志切割

  • yealy:每年進(jìn)行一次日志切割

  • size:按日志大小進(jìn)行切割

  • rotate count:日志輪轉(zhuǎn)時保存的歸檔文件數(shù)量

  • start count:日志輪轉(zhuǎn)時從指定的count開始玄妈,例如,start 9髓梅,則日志輪轉(zhuǎn)后會跳過 0-8 生成 xxx.9 這樣的日志拟蜻,

  • maxage count:輪轉(zhuǎn)后的日志超過設(shè)定的日期會被刪除,只有被輪轉(zhuǎn)的日志才會應(yīng)用到此規(guī)則

  • maxsize size:設(shè)置maxsize后枯饿,如果被輪轉(zhuǎn)的日志大小超過設(shè)置的 size酝锅,則會在設(shè)置的輪轉(zhuǎn)時間(例如:weekly)之前進(jìn)行日志輪轉(zhuǎn)

  • minsize size:設(shè)置minsize后,如果被輪轉(zhuǎn)的日志大小不滿足設(shè)置的size奢方,即便到了設(shè)置的輪轉(zhuǎn)時間也不會觸發(fā)日志輪轉(zhuǎn)

日期格式
  • dateext:切割后日志的后綴名以 "YYYYMMDD" 為格式
  • nodateext:輪轉(zhuǎn)日志時不使用后綴名為日期的格式
  • dateformat:自定義日志后綴的時間格式搔扁,僅 %Y %m %d %H %s 可以被使用。 例如 dateformat %m/%d/%Y
  • dateyesterday:切割日志時使用昨天的時間而不是今天的時間
  • extension:日志文件在輪轉(zhuǎn)后使用指定的 ext 擴(kuò)展名蟋字。如果使用壓縮稿蹲,通常ext還會加上壓縮文件的擴(kuò)展名,通常是 .gz鹊奖。例如苛聘,你有一個日志文件名為 mylog.foo,你可以通過 extension ext 將日志輪轉(zhuǎn)為 mylog.1.foo.gz 而不是 mylog.foo.1.gz
輪轉(zhuǎn)規(guī)則
  • ifempty:日志為空時也會按照規(guī)則進(jìn)行輪轉(zhuǎn)
  • notifempty:日志為空時不進(jìn)行輪轉(zhuǎn)
  • missingok:輪轉(zhuǎn)的日志不存在時忠聚,繼續(xù)下一個日志的輪轉(zhuǎn)设哗,不會報錯
  • nomissingok:輪式時日志不存在,會有報錯提示 (默認(rèn)配置)
郵件配置
  • mail address:配置郵件地址后两蟀,會將輪轉(zhuǎn)的日志信息發(fā)送到郵箱
  • nomail:不發(fā)送輪轉(zhuǎn)的日志信息到任何郵箱 (默認(rèn)配置)
  • mailfirst:配置郵箱后网梢,輪轉(zhuǎn)后將本次生成的日志文件發(fā)送到郵箱
  • maillast:配置郵箱后,將上一次輪轉(zhuǎn)的日志文件發(fā)送到郵箱 (默認(rèn)配置)
歸檔時執(zhí)行的腳本
  • include file_or_directory:輪轉(zhuǎn)前會嘗試讀取 include 配置的文件或目錄垫竞,如果配置的是目錄澎粟,則目錄下的所有文件都會被加載到輪轉(zhuǎn)的配置中;但對于文件擴(kuò)展名以 taboo 結(jié)尾的文件或配置路徑為多個目錄欢瞪、管道等時活烙,加載配置時會被忽略
  • prerotate/endscript:日志輪轉(zhuǎn)前會執(zhí)行自定義的命令(腳本)。通常遣鼓,輪轉(zhuǎn)的日志的完整路徑會作為傳入的第一個參數(shù)
  • postrotate/endscript:日志輪轉(zhuǎn)后會執(zhí)行自定義的命令(腳本)啸盏。通常,輪轉(zhuǎn)的日志的完整路徑會作為傳入的第一個參數(shù)
  • firstaction/endscript:執(zhí)行 prerotate/endscript 前且最少一個日志會被輪轉(zhuǎn)時執(zhí)行該語句骑祟,整個模式會作為第一個參數(shù)傳遞給該語句回懦,當(dāng)語句執(zhí)行異常時气笙,不會再向下執(zhí)行
  • lastaction/endscript:執(zhí)行 postrotate/endscript 前且最少一個已經(jīng)被輪轉(zhuǎn)后執(zhí)行該語句,整個模式會作為第一個參數(shù)傳遞給該語句怯晕,當(dāng)語句執(zhí)行異常時潜圃,僅僅展示錯誤信息
  • preremove/endscript:僅僅當(dāng)刪除輪轉(zhuǎn)過的日志前執(zhí)行該語句。即將被刪除的日志名會作為參數(shù)被傳遞進(jìn)該語句
  • sharedscripts:共享模式舟茶。啟用共享模式后谭期,當(dāng) prerotatepostrotate 語句執(zhí)行時匹配到多個日志時,prerotatepostrotate 語句僅僅只會執(zhí)行一次吧凉。正常模式下隧出,輪轉(zhuǎn)時匹配到的每個日志文件都會單獨(dú)執(zhí)行一次 prerotatepostrotate 語句。
  • nosharedscripts:輪轉(zhuǎn)時匹配到多個日志文件時阀捅,每個日志文件都會執(zhí)行一次 prerotatepostrotate 語句胀瞪。(默認(rèn)配置)
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市饲鄙,隨后出現(xiàn)的幾起案子凄诞,更是在濱河造成了極大的恐慌,老刑警劉巖傍妒,帶你破解...
    沈念sama閱讀 216,470評論 6 501
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件幔摸,死亡現(xiàn)場離奇詭異,居然都是意外死亡颤练,警方通過查閱死者的電腦和手機(jī)既忆,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,393評論 3 392
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來嗦玖,“玉大人患雇,你說我怎么就攤上這事∮畲欤” “怎么了苛吱?”我有些...
    開封第一講書人閱讀 162,577評論 0 353
  • 文/不壞的土叔 我叫張陵,是天一觀的道長器瘪。 經(jīng)常有香客問我翠储,道長,這世上最難降的妖魔是什么橡疼? 我笑而不...
    開封第一講書人閱讀 58,176評論 1 292
  • 正文 為了忘掉前任援所,我火速辦了婚禮,結(jié)果婚禮上欣除,老公的妹妹穿的比我還像新娘住拭。我一直安慰自己,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,189評論 6 388
  • 文/花漫 我一把揭開白布滔岳。 她就那樣靜靜地躺著杠娱,像睡著了一般。 火紅的嫁衣襯著肌膚如雪谱煤。 梳的紋絲不亂的頭發(fā)上摊求,一...
    開封第一講書人閱讀 51,155評論 1 299
  • 那天,我揣著相機(jī)與錄音趴俘,去河邊找鬼睹簇。 笑死,一個胖子當(dāng)著我的面吹牛寥闪,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播磨淌,決...
    沈念sama閱讀 40,041評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼疲憋,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了梁只?” 一聲冷哼從身側(cè)響起缚柳,我...
    開封第一講書人閱讀 38,903評論 0 274
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎搪锣,沒想到半個月后秋忙,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,319評論 1 310
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡构舟,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,539評論 2 332
  • 正文 我和宋清朗相戀三年灰追,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片狗超。...
    茶點(diǎn)故事閱讀 39,703評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡弹澎,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出努咐,到底是詐尸還是另有隱情苦蒿,我是刑警寧澤,帶...
    沈念sama閱讀 35,417評論 5 343
  • 正文 年R本政府宣布渗稍,位于F島的核電站佩迟,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏竿屹。R本人自食惡果不足惜报强,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,013評論 3 325
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望羔沙。 院中可真熱鬧躺涝,春花似錦、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,664評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至苍蔬,卻和暖如春诱建,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背碟绑。 一陣腳步聲響...
    開封第一講書人閱讀 32,818評論 1 269
  • 我被黑心中介騙來泰國打工俺猿, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人格仲。 一個月前我還...
    沈念sama閱讀 47,711評論 2 368
  • 正文 我出身青樓押袍,卻偏偏與公主長得像,于是被迫代替她去往敵國和親凯肋。 傳聞我的和親對象是個殘疾皇子谊惭,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,601評論 2 353

推薦閱讀更多精彩內(nèi)容