溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊(cè)×
其他方式登錄
點(diǎn)擊 登錄注冊(cè) 即表示同意《億速云用戶服務(wù)條款》

linux下日志定時(shí)輪詢的流程詳解

發(fā)布時(shí)間:2020-10-13 19:21:37 來(lái)源:腳本之家 閱讀:120 作者:cooffeelis 欄目:服務(wù)器

logrotate介紹

對(duì)于Linux系統(tǒng)安全來(lái)說(shuō),日志文件是極其重要的工具。日志文件包含了關(guān)于系統(tǒng)中發(fā)生的事件的有用信息,在排障過(guò)程中或者系統(tǒng)性能分析時(shí)經(jīng)常被用到。當(dāng)日志文件不斷增長(zhǎng)的時(shí)候,就需要定時(shí)切割,否則,寫(xiě)日志的速度和性能也會(huì)下降,更不便于我們歸檔,查詢。

所以便有了使用logrotate的時(shí)候 ,logrotate是個(gè)十分有用的工具,它可以自動(dòng)對(duì)日志進(jìn)行截?cái)啵ɑ蜉喲?、壓縮以及刪除舊的日志文件。例如,你可以設(shè)置logrotate,讓/var/log/foo日志文件每30天輪循,并刪除超過(guò)6個(gè)月的日志。配置完后,logrotate的運(yùn)作完全自動(dòng)化,不必進(jìn)行任何進(jìn)一步的人為干預(yù)。

logrotate配置文件位置

Linux系統(tǒng)默認(rèn)安裝logrotate工具,它默認(rèn)的配置文件在:

/etc/logrotate.conf

/etc/logrotate.d/

logrotate.conf 才主要的配置文件,logrotate.d 是一個(gè)目錄,該目錄里的所有文件都會(huì)被主動(dòng)的讀入/etc/logrotate.conf中執(zhí)行。

另外,如果 /etc/logrotate.d/ 里面的文件中沒(méi)有設(shè)定一些細(xì)節(jié),則會(huì)以/etc/logrotate.conf這個(gè)文件的設(shè)定來(lái)作為默認(rèn)值。

實(shí)際運(yùn)行時(shí),Logrotate會(huì)調(diào)用配置文件/etc/logrotate.conf。

可以在/etc/logrotate.d目錄里放置自定義好的配置文件,用來(lái)覆蓋Logrotate的缺省值。

定時(shí)輪循機(jī)制

Logrotate是基于CRON來(lái)運(yùn)行的,其腳本是/etc/cron.daily/logrotate,日志輪轉(zhuǎn)是系統(tǒng)自動(dòng)完成的。

logrotate這個(gè)任務(wù)默認(rèn)放在cron的每日定時(shí)任務(wù)cron.daily下面 /etc/cron.daily/logrotate

/etc/目錄下面還有cron.weekly/, cron.hourly/, cron.monthly/ 的目錄都是可以放定時(shí)任務(wù)的

[/etc]$ cat /etc/cron.daily/logrotate
#!/bin/sh

# Clean non existent log file entries from status file
cd /var/lib/logrotate
test -e status || touch status
head -1 status > status.clean
sed 's/"http://g' status | while read logfile date
do
 [ -e "$logfile" ] && echo "\"$logfile\" $date"
done >> status.clean
mv status.clean status

test -x /usr/sbin/logrotate || exit 0
/usr/sbin/logrotate /etc/logrotate.conf

這里實(shí)際操作輪詢的命令最后一行

/usr/sbin/logrotate /etc/logrotate.conf

定義好了每日?qǐng)?zhí)行任務(wù)的腳本cron.daily/logrotate ,再查看crontab的內(nèi)容,里面設(shè)置好了對(duì)應(yīng)的cron.xxly

執(zhí)行時(shí)間

[/etc]$ vim /etc/crontab
SHELL=/bin/sh
PATH=/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin

# m h dom mon dow user command
17 * * * * root cd / && run-parts --report /etc/cron.hourly
25 6 * * * root test -x /usr/sbin/anacron || ( cd / && run-parts --report /etc/cron.daily )
47 6 * * 7 root test -x /usr/sbin/anacron || ( cd / && run-parts --report /etc/cron.weekly )
52 6 1 * * root test -x /usr/sbin/anacron || ( cd / && run-parts --report /etc/cron.monthly )

可以看出來(lái)了只要是在

  • /etc/cron.daily/ 下面的任務(wù)都是每天6:25 執(zhí)行
  • /etc/cron.weekly/ 下面的任務(wù)都是每周日 6:47 執(zhí)行
  • /etc/cron.monthly/ 下面的任務(wù)都是每月1號(hào) 6:52 執(zhí)行

如果等不及cron自動(dòng)執(zhí)行日志輪轉(zhuǎn),想手動(dòng)強(qiáng)制切割日志,需要加-f參數(shù);

不過(guò)正式執(zhí)行前最好通過(guò)Debug選項(xiàng)來(lái)驗(yàn)證一下(-d參數(shù)),這對(duì)調(diào)試也很重要

# /usr/sbin/logrotate -f /etc/logrotate.d/nginx // 未到時(shí)間或者未到切割條件,強(qiáng)制切割
# /usr/sbin/logrotate -d -f /etc/logrotate.d/nginx // 輸出切割debug信息

那么至此,我們就知道logrotate是如何實(shí)現(xiàn)自動(dòng)切割日志的

logrotate配置案例

nginx 常用日志切割配置

/data/log/nginx/*.log /data/log/nginx/*/*.log { # 對(duì)匹配上的日志文件進(jìn)行切割
 weekly # 每周切割
 missingok  # 在日志輪循期間,任何錯(cuò)誤將被忽略,例如“文件無(wú)法找到”之類的錯(cuò)誤。
 rotate 6  # 保留 6 個(gè)備份
 compress  # 壓縮
 delaycompress # delaycompress 和 compress 一起使用時(shí),轉(zhuǎn)儲(chǔ)的日志文件到下一次轉(zhuǎn)儲(chǔ)時(shí)才壓縮
 notifempty  # 如果是空文件的話,不轉(zhuǎn)儲(chǔ)
 create 0644 www-data ymserver  # mode owner group 轉(zhuǎn)儲(chǔ)文件,使用指定的文件模式創(chuàng)建新的日志文件
 sharedscripts # 下面詳細(xì)說(shuō)
 prerotate # 在logrotate轉(zhuǎn)儲(chǔ)之前需要執(zhí)行的指令,例如修改文件的屬性等動(dòng)作;必須獨(dú)立成行
  if [ -d /etc/logrotate.d/httpd-prerotate ]; then \
   run-parts /etc/logrotate.d/httpd-prerotate; \
  fi \
 endscript
 postrotate # 在logrotate轉(zhuǎn)儲(chǔ)之后需要執(zhí)行的指令,例如重新啟動(dòng) (kill -HUP) 某個(gè)服務(wù)!必須獨(dú)立成行
  [ -s /run/nginx.pid ] && kill -USR1 `cat /run/nginx.pid`
 endscript
 su root ymserver # 輪訓(xùn)日志時(shí)切換設(shè)置的用戶/用戶組來(lái)執(zhí)行(默認(rèn)是root),如果設(shè)置的user/group 沒(méi)有權(quán)限去讓文件容用 create 選項(xiàng)指定的擁有者 ,會(huì)觸發(fā)錯(cuò)誤。
}

如果要配置一個(gè)每日0點(diǎn)執(zhí)行切割任務(wù),怎么做到?我們的logrotate默認(rèn)每天執(zhí)行時(shí)間已經(jīng)寫(xiě)到了/etc/cron.daily/目錄下面,而這個(gè)目錄下面的任務(wù)執(zhí)行時(shí)間上面也說(shuō)了,在/etc/crontab里面定義了時(shí)6:25。

我之前就有個(gè)這樣的需求,看看下面的配置

/data/log/owan_web/chn_download_stat/chn_app_rec.log {
 copytruncate
 # weekly 注釋了 但是會(huì)繼承/etc/logrorate.conf的全局變量,也是weekly
 missingok
 rotate 10
 compress
 delaycompress
 size = 000M # 大小到達(dá)size開(kāi)始轉(zhuǎn)存 如果設(shè)置了size,會(huì)無(wú)視 daily, weekly,monthly 指令,所以size的優(yōu)先級(jí)比較高
 notifempty
 create 664 www-data ymserver
 su root
 dateext  //這個(gè)參數(shù)很重要!就是切割后的日志文件以當(dāng)前日期為格式結(jié)尾,如xxx.log-20131216這樣,如果注釋掉,切割出來(lái)是按數(shù)字遞增,即前面說(shuō)的 xxx.log-1這種格式
 compress  //是否通過(guò)gzip壓縮轉(zhuǎn)儲(chǔ)以后的日志文件,如xxx.log-20131216.gz ;如果不需要壓縮,注釋掉就行
}

然后去root的crontab配置一個(gè)0點(diǎn)執(zhí)行的任務(wù)

wwwadm@host:/etc/logrotate.d$ sudo crontab -l -u root
0 0 * * * /usr/sbin/logrotate /etc/logrotate.d/web_roteate -fv >/tmp/logro.log 2>&1

因?yàn)閘ogrotate的切割周期是weekly,每次切割都是根據(jù)上一個(gè)切割的時(shí)間來(lái)進(jìn)行,如果距離上一次有一周時(shí)間,就會(huì)切割,但是我們?cè)O(shè)置了crontab的每天切割,既不會(huì)進(jìn)入/etc/cron.daily/的每日切割,也不會(huì)每周切割。這樣就能完美定制自己想要的切割日志時(shí)間

logrotate參數(shù)說(shuō)明

compress 通過(guò)gzip 壓縮轉(zhuǎn)儲(chǔ)以后的日志

nocompress 不做gzip壓縮處理

create mode owner group 輪轉(zhuǎn)時(shí)指定創(chuàng)建新文件的屬性,如create 0777 nobody nobody

nocreate 不建立新的日志文件

delaycompress 和compress 一起使用時(shí),轉(zhuǎn)儲(chǔ)的日志文件到下一次轉(zhuǎn)儲(chǔ)時(shí)才壓縮

nodelaycompress 覆蓋 delaycompress 選項(xiàng),轉(zhuǎn)儲(chǔ)同時(shí)壓縮。

missingok 如果日志丟失,不報(bào)錯(cuò)繼續(xù)滾動(dòng)下一個(gè)日志

ifempty 即使日志文件為空文件也做輪轉(zhuǎn),這個(gè)是logrotate的缺省選項(xiàng)。

notifempty 當(dāng)日志文件為空時(shí),不進(jìn)行輪轉(zhuǎn)

mail address 把轉(zhuǎn)儲(chǔ)的日志文件發(fā)送到指定的E-mail 地址

olddir directory 轉(zhuǎn)儲(chǔ)后的日志文件放入指定的目錄,必須和當(dāng)前日志文件在同一個(gè)文件系統(tǒng)

noolddir 轉(zhuǎn)儲(chǔ)后的日志文件和當(dāng)前日志文件放在同一個(gè)目錄下

sharedscripts 運(yùn)行postrotate腳本,作用是在所有日志都輪轉(zhuǎn)后統(tǒng)一執(zhí)行一次腳本。如果沒(méi)有配置這個(gè),那么每個(gè)日志輪轉(zhuǎn)后都會(huì)執(zhí)行一次腳本

prerotate 在logrotate轉(zhuǎn)儲(chǔ)之前需要執(zhí)行的指令,例如修改文件的屬性等動(dòng)作;必須獨(dú)立成行

postrotate 在logrotate轉(zhuǎn)儲(chǔ)之后需要執(zhí)行的指令,例如重新啟動(dòng) (kill -HUP) 某個(gè)服務(wù)!必須獨(dú)立成行

daily 指定轉(zhuǎn)儲(chǔ)周期為每天

weekly 指定轉(zhuǎn)儲(chǔ)周期為每周

monthly 指定轉(zhuǎn)儲(chǔ)周期為每月

rotate count 指定日志文件刪除之前轉(zhuǎn)儲(chǔ)的次數(shù),0 指沒(méi)有備份,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)儲(chǔ),log-size能指定bytes(缺省)及KB (sizek)或MB(sizem).
當(dāng)日志文件 >= log-size 的時(shí)候就轉(zhuǎn)儲(chǔ)。 以下為合法格式:(其他格式的單位大小寫(xiě)沒(méi)有試過(guò))

size = 5 或 size 5 (>= 5 個(gè)字節(jié)就轉(zhuǎn)儲(chǔ))

size = 100k 或 size 100k

size = 100M 或 size 100M

如果設(shè)置了size,會(huì)無(wú)視 daily, weekly,monthly 指令,所以size的優(yōu)先級(jí)比較高

值得注意的一個(gè)配置是:copytruncate

copytruncate 如果沒(méi)有這個(gè)選項(xiàng)的話,操作方式:是將原log日志文件,移動(dòng)成類似log.1的舊文件, 然后創(chuàng)建一個(gè)新的文件。

如果設(shè)置了,操作方式:拷貝原日志文件,并且將其變成大小為0的文件。

區(qū)別是如果進(jìn)程,比如nginx 使用了一個(gè)文件寫(xiě)日志,沒(méi)有copytruncate的話,切割日志時(shí), 把舊日志log->log.1 ,然后創(chuàng)建新日志log。這時(shí)候nginx 打開(kāi)的文件描述符依然時(shí)log.1,由沒(méi)有信號(hào)通知nginx 要換日志描述符,所以它會(huì)繼續(xù)向log.1寫(xiě)日志,這樣就不符合我們的要求了。 因?yàn)槲覀兿肭懈钊罩竞螅琻ginx 自動(dòng)會(huì)向新的log 文件寫(xiě)日志,而不是舊的log.1文件

解決方法有兩個(gè):

1、向上面的nginx 切割日志配置,再postrotate里面寫(xiě)個(gè)腳本

postrotate # 在logrotate轉(zhuǎn)儲(chǔ)之后需要執(zhí)行的指令,例如重新啟動(dòng) (kill -HUP) 某個(gè)服務(wù)!必須獨(dú)立成行
 [ -s /run/nginx.pid ] && kill -USR1 `cat /run/nginx.pid`
endscript

這樣就是發(fā)信號(hào)給nginx ,讓nginx 關(guān)閉舊日志文件描述符,重新打開(kāi)新的日志文件描述,并寫(xiě)入日志

2、使用copytruncate參數(shù),向上面說(shuō)的,配置了它以后,操作方式是把log 復(fù)制一份 成為log.1,然后清空l(shuí)og的內(nèi)容,使大小為0,那此時(shí)log依然時(shí)原來(lái)的舊log,對(duì)進(jìn)程(nginx)來(lái)說(shuō),依然打開(kāi)的是原來(lái)的文件描述符,可以繼續(xù)往里面寫(xiě)日志,而不用發(fā)送信號(hào)給nginx

copytruncate這種方式操作的時(shí)候, 拷貝和清空之間有一個(gè)時(shí)間差,可能會(huì)丟失部分日志數(shù)據(jù)。

nocopytruncate 備份日志文件不過(guò)不截?cái)?/p>

總結(jié)

以上就是這篇文章的全部?jī)?nèi)容了,希望本文的內(nèi)容對(duì)大家的學(xué)習(xí)或者工作能帶來(lái)一定的幫助,如果有疑問(wèn)大家可以留言交流,謝謝大家對(duì)億速云的支持。

向AI問(wèn)一下細(xì)節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如果涉及侵權(quán)請(qǐng)聯(lián)系站長(zhǎng)郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI