在平時(shí)處理運(yùn)維工作當(dāng)中参淹,必不可少的就是日志切割,不然一個(gè)日志文件幾十個(gè)G乏悄,不僅不方便查詢?nèi)罩拘畔⒄阒担乙膊焕谧鋈罩颈4妗jP(guān)于在Linux上做日志切割之外檩小,除了手搓切割腳本开呐,還有就是Linux系統(tǒng)自帶的一個(gè)切割工具Logrotate。
Logrotate簡單說明
Logrotate可以對日志進(jìn)行輪轉(zhuǎn)规求、壓縮和刪除筐付,還可以將日志發(fā)送到指定郵箱。
-- 可以按照時(shí)間進(jìn)行分割阻肿;
-- 可以按照日志文件大小進(jìn)行分割瓦戚。
Logrotate配置管理
工欲善其事,必先利其器丛塌。所以我們要先要著手了解一下Logrotate的相關(guān)信息较解,通過了解之后才能根據(jù)各個(gè)場景靈活的使用這個(gè)工具。
Logrotate的相關(guān)文件\目錄(如果需要查找所有與之相關(guān)的文件信息可以通過rpm -ql logrotate
進(jìn)行查看)
定時(shí)任務(wù):/etc/cron.daily/logrotate
配置文件:/etc/logrotate.conf
配置目錄:/etc/logrotate.d
執(zhí)行文件:/usr/sbin/logrotate
日志文件:/var/lib/logrotate/logrotate.status
我可以通過查看/etc/logrotate.conf
來查看相關(guān)的配置信息
# 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.
我們可以通過上面查看到赴邻,Logrotate有個(gè)配置目錄印衔,進(jìn)入目錄之后,可以看到一些已經(jīng)創(chuàng)建好的日志切割的規(guī)則文件姥敛,也可以通過這些設(shè)置好的配置文件來學(xué)習(xí)奸焙,如何自己寫一個(gè)配置文件,接下來我們通過對一個(gè)自定義的日志文件進(jìn)行切割測試徒溪。
根據(jù)大小切割
因?yàn)槲募笮】梢员容^自由的控制忿偷,所以用來測試日志切割再好不過了。
首先我們在/etc/logrotate.d
下創(chuàng)建一個(gè)自定義的配置文件onlyproject
(即:vim /etc/Logrotate.d/onlyproject
)臊泌,并寫入以下內(nèi)容
# 指定日志文件位置(絕對路徑)
/var/log/onlyproject.log {
daily
rotate 10
size +10M
compress
delaycompress
missingok
notifempty
create 0600 root root
}
其他參數(shù)選項(xiàng)
compress 通過gzip 壓縮轉(zhuǎn)儲以后的日志
nocompress 不做gzip壓縮處理
copytruncate 用于還在打開中的日志文件鲤桥,把當(dāng)前日志備份并截?cái)啵皇窍瓤截愒偾蹇盏姆绞角牛截惡颓蹇罩g有一個(gè)時(shí)間差茶凳, 可能會丟失部分日志數(shù)據(jù)。
nocopytruncate 備份日志文件不過不截?cái)?create mode owner group 輪轉(zhuǎn)時(shí)指定創(chuàng)建新文件的屬性播揪,如create 0777 nobody nobody
nocreate 不建立新的日志文件
delaycompress 和compress 一起使用時(shí)贮喧,轉(zhuǎn)儲的日志文件到下一次轉(zhuǎn)儲時(shí)才壓縮
nodelaycompress 覆蓋 delaycompress 選項(xiàng),轉(zhuǎn)儲同時(shí)壓縮
missingok 如果日志丟失猪狈,不報(bào)錯繼續(xù)滾動下一個(gè)日志
errors address 專儲時(shí)的錯誤信息發(fā)送到指定的Email 地址
ifempty 即使日志文件為空文件也做輪轉(zhuǎn)箱沦,這個(gè)是logrotate的缺省選項(xiàng)。
notifempty 當(dāng)日志文件為空時(shí)雇庙,不進(jìn)行輪轉(zhuǎn)
mail address 把轉(zhuǎn)儲的日志文件發(fā)送到指定的E-mail 地址
nomail 轉(zhuǎn)儲時(shí)不發(fā)送日志文件
olddir directory 轉(zhuǎn)儲后的日志文件放入指定的目錄谓形,必須和當(dāng)前日志文件在同一個(gè)文件系統(tǒng)
noolddir 轉(zhuǎn)儲后的日志文件和當(dāng)前日志文件放在同一個(gè)目錄下
sharedscripts 運(yùn)行postrotate腳本灶伊,作用是在所有日志都輪轉(zhuǎn)后統(tǒng)一執(zhí)行一次腳本。如果沒有配置這個(gè)寒跳,那么每個(gè)日志輪轉(zhuǎn)后 都會執(zhí)行一次腳本
prerotate 在logrotate轉(zhuǎn)儲之前需要執(zhí)行的指令聘萨,例如修改文件的屬性等動作;必須獨(dú)立成行
postrotate 在logrotate轉(zhuǎn)儲之后需要執(zhí)行的指令童太,例如重新啟動 (kill -HUP) 某個(gè)服務(wù)米辐!必須獨(dú)立成行
daily 指定轉(zhuǎn)儲周期為每天
weekly 指定轉(zhuǎn)儲周期為每周
monthly 指定轉(zhuǎn)儲周期為每月
rotate count 指定日志文件刪除之前轉(zhuǎn)儲的次數(shù),0 指沒有備份书释,5 指保留5 個(gè)備份
dateext 使用當(dāng)期日期作為命名格式
dateformat .%s 配合dateext使用翘贮,緊跟在下一行出現(xiàn),定義文件切割后的文件名爆惧,必須配合dateext使用择膝,只支持 %Y %m %d %s 這四個(gè)參數(shù)
size(或minsize) log-size 當(dāng)日志文件到達(dá)指定的大小時(shí)才轉(zhuǎn)儲
測試是否可正常切割
# 首先將/var/log/onlyproject.log填充為一個(gè)15M大小的文件
head -c 15M < /dev/urandom >> /var/log/onlyproject.log # dd if=/dev/zero of=/var/log/onlyproject.log bs=1M count=15
然后強(qiáng)制執(zhí)行Logrotate
logrotate -f /etc/logrotate.d/onlyproject
[root@localhost log]# ll -h only*
-rw------- 1 root root 0 10月 24 10:54 onlyproject.log
-rw-r--r-- 1 root root 16M 10月 24 10:54 onlyproject.log-20221024.gz
我們通過查看/var/log/
下的內(nèi)容,可以看到已經(jīng)生成了一個(gè)輪詢后的gz包检激。
補(bǔ)充
在配置文件中我們也可以配置一下腳本進(jìn)行操作,例如以下nginx和httpd(這兩個(gè)配置文件都是在服務(wù)創(chuàng)建完成后自動添加的)的切割配置文件中
# Nginx
...
postrotate
/bin/kill -USR1 `cat /run/nginx.pid 2>/dev/null` 2>/dev/null || true
...
# Httpd
...
postrotate
/bin/systemctl reload httpd.service > /dev/null 2>/dev/null || true
...