偷偷摘套内射激情视频,久久精品99国产国产精,中文字幕无线乱码人妻,中文在线中文a,性爽19p

Linux日志定時(shí)輪詢流程詳解

系統(tǒng) Linux
對(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ì)下降,更不便于我們歸檔,查詢。

Linux日志定時(shí)輪詢流程詳解

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)的配置文件在:

  1. /etc/logrotate.conf 
  2.  
  3. /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ù)的

  1. [/etc]$ cat /etc/cron.daily/logrotate 
  2.  
  3. #!/bin/sh 
  4.  
  5.   
  6.  
  7. # Clean non existent log file entries from status file 
  8.  
  9. cd /var/lib/logrotate 
  10.  
  11. test -e status || touch status 
  12.  
  13. head -1 status > status.clean 
  14.  
  15. sed 's/"//g' status | while read logfile date 
  16.  
  17. do 
  18.  
  19.     [ -e "$logfile" ] && echo "\"$logfile\" $date" 
  20.  
  21. done >> status.clean 
  22.  
  23. mv status.clean status 
  24.  
  25.   
  26.  
  27. test -x /usr/sbin/logrotate || exit 0 
  28.  
  29. /usr/sbin/logrotate /etc/logrotate.conf  

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

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

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

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

  1. [/etc]$ vim /etc/crontab 
  2.  
  3. SHELL=/bin/sh 
  4.  
  5. PATH=/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin 
  6.  
  7.   
  8.  
  9. # m h dom mon dow user    command 
  10.  
  11. 17 *    * * *    root    cd / && run-parts --report /etc/cron.hourly 
  12.  
  13. 25 6    * * *    root    test -x /usr/sbin/anacron || ( cd / && run-parts --report /etc/cron.daily ) 
  14.  
  15. 47 6    * * 7    root    test -x /usr/sbin/anacron || ( cd / && run-parts --report /etc/cron.weekly ) 
  16.  
  17. 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)試也很重要

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

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

logrotate配置案例

nginx 常用日志切割配置

  1. /data/log/nginx/*.log /data/log/nginx/*/*.log { # 對(duì)匹配上的日志文件進(jìn)行切割 
  2.  
  3.     weekly # 每周切割 
  4.  
  5.     missingok     # 在日志輪循期間,任何錯(cuò)誤將被忽略,例如“文件無(wú)法找到”之類(lèi)的錯(cuò)誤。 
  6.  
  7.     rotate 6      # 保留 6 個(gè)備份 
  8.  
  9.     compress     # 壓縮 
  10.  
  11.     delaycompress    # delaycompress 和 compress 一起使用時(shí),轉(zhuǎn)儲(chǔ)的日志文件到下一次轉(zhuǎn)儲(chǔ)時(shí)才壓縮 
  12.  
  13.     notifempty     # 如果是空文件的話,不轉(zhuǎn)儲(chǔ) 
  14.  
  15.     create 0644 www-data ymserver     # mode owner group 轉(zhuǎn)儲(chǔ)文件,使用指定的文件模式創(chuàng)建新的日志文件 
  16.  
  17.     sharedscripts # 下面詳細(xì)說(shuō) 
  18.  
  19.     prerotate # 在logrotate轉(zhuǎn)儲(chǔ)之前需要執(zhí)行的指令,例如修改文件的屬性等動(dòng)作;必須獨(dú)立成行 
  20.  
  21.         if [ -d /etc/logrotate.d/httpd-prerotate ]; then \ 
  22.  
  23.             run-parts /etc/logrotate.d/httpd-prerotate; \ 
  24.  
  25.         fi \ 
  26.  
  27.     endscript 
  28.  
  29.     postrotate  # 在logrotate轉(zhuǎn)儲(chǔ)之后需要執(zhí)行的指令,例如重新啟動(dòng) (kill -HUP) 某個(gè)服務(wù)!必須獨(dú)立成行 
  30.  
  31.         [ -s /run/nginx.pid ] && kill -USR1 `cat /run/nginx.pid` 
  32.  
  33.     endscript 
  34.  
  35.     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ò)誤。 
  36.  
  37.  

如果要配置一個(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è)這樣的需求,看看下面的配置

  1. /data/log/owan_web/chn_download_stat/chn_app_rec.log { 
  2.  
  3.     copytruncate 
  4.  
  5.     # weekly 注釋了 但是會(huì)繼承/etc/logrorate.conf的全局變量,也是weekly 
  6.  
  7.     missingok 
  8.  
  9.     rotate 10 
  10.  
  11.     compress 
  12.  
  13.     delaycompress 
  14.  
  15.     size=1000M # 大小到達(dá)size開(kāi)始轉(zhuǎn)存 
  16.  
  17.     notifempty 
  18.  
  19.     create 664 www-data ymserver 
  20.  
  21.     su root 
  22.  
  23.     dateext       //這個(gè)參數(shù)很重要!就是切割后的日志文件以當(dāng)前日期為格式結(jié)尾,如xxx.log-20131216這樣,如果注釋掉,切割出來(lái)是按數(shù)字遞增,即前面說(shuō)的 xxx.log-1這種格式 
  24.  
  25.     compress      //是否通過(guò)gzip壓縮轉(zhuǎn)儲(chǔ)以后的日志文件,如xxx.log-20131216.gz ;如果不需要壓縮,注釋掉就行 
  26.  
  27.  

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

  1. wwwadm@host:/etc/logrotate.d$ sudo crontab -l -u root 
  2.  
  3. 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 

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

copytruncate 如果沒(méi)有這個(gè)選項(xiàng)的話,操作方式:是將原log日志文件,移動(dòng)成類(lèi)似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)槲覀兿肭懈钊罩竞?,nginx 自動(dòng)會(huì)向新的log 文件寫(xiě)日志,而不是舊的log.1文件

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

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

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

參考

《Linux下logrotate日志輪詢操作梳理》 

責(zé)任編輯:龐桂玉 來(lái)源: 數(shù)據(jù)庫(kù)開(kāi)發(fā)
相關(guān)推薦

2025-06-09 07:11:56

2011-06-28 13:38:15

Arm linux QT

2011-07-18 16:36:15

syslogLinux日志管理

2022-12-07 08:39:07

2010-09-30 10:06:35

2009-11-23 09:54:52

2012-12-31 13:36:28

Android開(kāi)發(fā)Alarmmanage

2022-07-14 08:36:28

NacosApollo長(zhǎng)輪詢

2009-11-13 09:40:27

linux定時(shí)執(zhí)行crontab

2015-12-30 10:29:40

Git協(xié)作流程詳解

2020-12-07 11:52:55

Linux開(kāi)機(jī)流程

2024-12-16 08:10:00

Spring開(kāi)發(fā)

2025-04-29 08:25:00

logrotateLinux日志輪轉(zhuǎn)

2025-05-14 08:10:00

redo logMySQL重做日志

2025-04-24 10:34:45

2010-11-19 13:01:31

Oracle日志文件

2020-12-21 07:31:23

實(shí)現(xiàn)單機(jī)JDK

2024-12-27 08:24:55

2009-08-03 12:21:03

linux at命令linux at命令詳定時(shí)關(guān)機(jī)

2015-08-14 09:47:36

Linux日志基礎(chǔ)
點(diǎn)贊
收藏

51CTO技術(shù)棧公眾號(hào)