中文字幕av专区_日韩电影在线播放_精品国产精品久久一区免费式_av在线免费观看网站

溫馨提示×

溫馨提示×

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

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

linux下日志定時輪詢的流程詳解

發布時間:2020-10-13 19:21:37 來源:腳本之家 閱讀:120 作者:cooffeelis 欄目:服務器

logrotate介紹

對于Linux系統安全來說,日志文件是極其重要的工具。日志文件包含了關于系統中發生的事件的有用信息,在排障過程中或者系統性能分析時經常被用到。當日志文件不斷增長的時候,就需要定時切割,否則,寫日志的速度和性能也會下降,更不便于我們歸檔,查詢。

所以便有了使用logrotate的時候 ,logrotate是個十分有用的工具,它可以自動對日志進行截斷(或輪循)、壓縮以及刪除舊的日志文件。例如,你可以設置logrotate,讓/var/log/foo日志文件每30天輪循,并刪除超過6個月的日志。配置完后,logrotate的運作完全自動化,不必進行任何進一步的人為干預。

logrotate配置文件位置

Linux系統默認安裝logrotate工具,它默認的配置文件在:

/etc/logrotate.conf

/etc/logrotate.d/

logrotate.conf 才主要的配置文件,logrotate.d 是一個目錄,該目錄里的所有文件都會被主動的讀入/etc/logrotate.conf中執行。

另外,如果 /etc/logrotate.d/ 里面的文件中沒有設定一些細節,則會以/etc/logrotate.conf這個文件的設定來作為默認值。

實際運行時,Logrotate會調用配置文件/etc/logrotate.conf。

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

定時輪循機制

Logrotate是基于CRON來運行的,其腳本是/etc/cron.daily/logrotate,日志輪轉是系統自動完成的。

logrotate這個任務默認放在cron的每日定時任務cron.daily下面 /etc/cron.daily/logrotate

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

[/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

這里實際操作輪詢的命令最后一行

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

定義好了每日執行任務的腳本cron.daily/logrotate ,再查看crontab的內容,里面設置好了對應的cron.xxly

執行時間

[/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 )

可以看出來了只要是在

  • /etc/cron.daily/ 下面的任務都是每天6:25 執行
  • /etc/cron.weekly/ 下面的任務都是每周日 6:47 執行
  • /etc/cron.monthly/ 下面的任務都是每月1號 6:52 執行

如果等不及cron自動執行日志輪轉,想手動強制切割日志,需要加-f參數;

不過正式執行前最好通過Debug選項來驗證一下(-d參數),這對調試也很重要

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

那么至此,我們就知道logrotate是如何實現自動切割日志的

logrotate配置案例

nginx 常用日志切割配置

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

如果要配置一個每日0點執行切割任務,怎么做到?我們的logrotate默認每天執行時間已經寫到了/etc/cron.daily/目錄下面,而這個目錄下面的任務執行時間上面也說了,在/etc/crontab里面定義了時6:25。

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

/data/log/owan_web/chn_download_stat/chn_app_rec.log {
 copytruncate
 # weekly 注釋了 但是會繼承/etc/logrorate.conf的全局變量,也是weekly
 missingok
 rotate 10
 compress
 delaycompress
 size = 000M # 大小到達size開始轉存 如果設置了size,會無視 daily, weekly,monthly 指令,所以size的優先級比較高
 notifempty
 create 664 www-data ymserver
 su root
 dateext  //這個參數很重要!就是切割后的日志文件以當前日期為格式結尾,如xxx.log-20131216這樣,如果注釋掉,切割出來是按數字遞增,即前面說的 xxx.log-1這種格式
 compress  //是否通過gzip壓縮轉儲以后的日志文件,如xxx.log-20131216.gz ;如果不需要壓縮,注釋掉就行
}

然后去root的crontab配置一個0點執行的任務

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

因為logrotate的切割周期是weekly,每次切割都是根據上一個切割的時間來進行,如果距離上一次有一周時間,就會切割,但是我們設置了crontab的每天切割,既不會進入/etc/cron.daily/的每日切割,也不會每周切割。這樣就能完美定制自己想要的切割日志時間

logrotate參數說明

compress 通過gzip 壓縮轉儲以后的日志

nocompress 不做gzip壓縮處理

create mode owner group 輪轉時指定創建新文件的屬性,如create 0777 nobody nobody

nocreate 不建立新的日志文件

delaycompress 和compress 一起使用時,轉儲的日志文件到下一次轉儲時才壓縮

nodelaycompress 覆蓋 delaycompress 選項,轉儲同時壓縮。

missingok 如果日志丟失,不報錯繼續滾動下一個日志

ifempty 即使日志文件為空文件也做輪轉,這個是logrotate的缺省選項。

notifempty 當日志文件為空時,不進行輪轉

mail address 把轉儲的日志文件發送到指定的E-mail 地址

olddir directory 轉儲后的日志文件放入指定的目錄,必須和當前日志文件在同一個文件系統

noolddir 轉儲后的日志文件和當前日志文件放在同一個目錄下

sharedscripts 運行postrotate腳本,作用是在所有日志都輪轉后統一執行一次腳本。如果沒有配置這個,那么每個日志輪轉后都會執行一次腳本

prerotate 在logrotate轉儲之前需要執行的指令,例如修改文件的屬性等動作;必須獨立成行

postrotate 在logrotate轉儲之后需要執行的指令,例如重新啟動 (kill -HUP) 某個服務!必須獨立成行

daily 指定轉儲周期為每天

weekly 指定轉儲周期為每周

monthly 指定轉儲周期為每月

rotate count 指定日志文件刪除之前轉儲的次數,0 指沒有備份,5 指保留5 個備份

dateext 使用當期日期作為命名格式

dateformat .%s 配合dateext使用,緊跟在下一行出現,定義文件切割后的文件名,必須配合dateext使用,只支持 %Y %m %d %s 這四個參數

size(或minsize) log-size 當日志文件到達指定的大小時才轉儲,log-size能指定bytes(缺省)及KB (sizek)或MB(sizem).
當日志文件 >= log-size 的時候就轉儲。 以下為合法格式:(其他格式的單位大小寫沒有試過)

size = 5 或 size 5 (>= 5 個字節就轉儲)

size = 100k 或 size 100k

size = 100M 或 size 100M

如果設置了size,會無視 daily, weekly,monthly 指令,所以size的優先級比較高

值得注意的一個配置是:copytruncate

copytruncate 如果沒有這個選項的話,操作方式:是將原log日志文件,移動成類似log.1的舊文件, 然后創建一個新的文件。

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

區別是如果進程,比如nginx 使用了一個文件寫日志,沒有copytruncate的話,切割日志時, 把舊日志log->log.1 ,然后創建新日志log。這時候nginx 打開的文件描述符依然時log.1,由沒有信號通知nginx 要換日志描述符,所以它會繼續向log.1寫日志,這樣就不符合我們的要求了。 因為我們想切割日志后,nginx 自動會向新的log 文件寫日志,而不是舊的log.1文件

解決方法有兩個:

1、向上面的nginx 切割日志配置,再postrotate里面寫個腳本

postrotate # 在logrotate轉儲之后需要執行的指令,例如重新啟動 (kill -HUP) 某個服務!必須獨立成行
 [ -s /run/nginx.pid ] && kill -USR1 `cat /run/nginx.pid`
endscript

這樣就是發信號給nginx ,讓nginx 關閉舊日志文件描述符,重新打開新的日志文件描述,并寫入日志

2、使用copytruncate參數,向上面說的,配置了它以后,操作方式是把log 復制一份 成為log.1,然后清空log的內容,使大小為0,那此時log依然時原來的舊log,對進程(nginx)來說,依然打開的是原來的文件描述符,可以繼續往里面寫日志,而不用發送信號給nginx

copytruncate這種方式操作的時候, 拷貝和清空之間有一個時間差,可能會丟失部分日志數據。

nocopytruncate 備份日志文件不過不截斷

總結

以上就是這篇文章的全部內容了,希望本文的內容對大家的學習或者工作能帶來一定的幫助,如果有疑問大家可以留言交流,謝謝大家對億速云的支持。

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

容城县| 桃园市| 高邑县| 平度市| 建宁县| 淳安县| 岳普湖县| 宁远县| 衡东县| 财经| 理塘县| 呼玛县| 安阳市| 阿克苏市| 兴安盟| 武城县| 枣阳市| 维西| 乌拉特中旗| 名山县| 麟游县| 乌兰县| 屏东县| 黎平县| 道孚县| 阳西县| 保靖县| 兴安县| 长垣县| 湟中县| 泰州市| 古交市| 疏勒县| 澄迈县| 泌阳县| 木兰县| 虎林市| 札达县| 清远市| 克拉玛依市| 铁力市|