什么是日志切割阱冶?
日志切割指的是當(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)一次色洞,常見用法有daily
、weekly
茶鉴、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ù)往清空后的日志文件中寫入。但在日志copy
和truncate
的過程中寫入的日志可能會丟失蒋困。當(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)prerotate
和postrotate
語句執(zhí)行時匹配到多個日志時,prerotate
和postrotate
語句僅僅只會執(zhí)行一次吧凉。正常模式下隧出,輪轉(zhuǎn)時匹配到的每個日志文件都會單獨(dú)執(zhí)行一次prerotate
和postrotate
語句。 -
nosharedscripts
:輪轉(zhuǎn)時匹配到多個日志文件時阀捅,每個日志文件都會執(zhí)行一次prerotate
和postrotate
語句胀瞪。(默認(rèn)配置)