日志輪轉(zhuǎn)logrotate的使用
參考文檔: https://blog.huoding.com/2013/04/21/246
logrotate是一個(gè)linux系統(tǒng)日志的管理工具娩脾」纷迹可以對(duì)單個(gè)日志文件或者某個(gè)目錄下的文件按時(shí)間/大小進(jìn)行切割磅废,壓縮操作兽埃;指定日志保存數(shù)量;還可以在切割之后運(yùn)行自定義命令。
logrotate是基于crontab運(yùn)行的,所以這個(gè)時(shí)間點(diǎn)是由crontab控制的荐操,具體可以查詢crontab的配置文件/etc/anacrontab。系統(tǒng)會(huì)按照計(jì)劃的頻率運(yùn)行l(wèi)ogrotate珍策,通常是每天托启。在大多數(shù)的Linux發(fā)行版本上,計(jì)劃每天運(yùn)行的腳本位于 /etc/cron.daily/logrotate攘宙。
cron定時(shí)任務(wù)每天運(yùn)行的logrotate腳本:
# cat /etc/cron.daily/logrotate
#!/bin/sh
/usr/sbin/logrotate /etc/logrotate.conf
EXITVALUE=$?
if [ $EXITVALUE != 0 ]; then
/usr/bin/logger -t logrotate "ALERT exited abnormally with [$EXITVALUE]"
fi
exit 0
cron配置文件:
# cat /etc/anacrontab
# /etc/anacrontab: configuration file for anacron
SHELL=/bin/sh
PATH=/sbin:/bin:/usr/sbin:/usr/bin
MAILTO=root
# the maximal random delay added to the base delay of the jobs
RANDOM_DELAY=45
# the jobs will be started during the following hours only
START_HOURS_RANGE=3-22
#period in days delay in minutes job-identifier command
1 5 cron.daily nice run-parts /etc/cron.daily
7 25 cron.weekly nice run-parts /etc/cron.weekly
@monthly 45 cron.monthly nice run-parts /etc/cron.monthly
可修改此配置文件重新定義每天定時(shí)任務(wù)執(zhí)行的時(shí)間
使用logrotate工具實(shí)現(xiàn)nginx日志切割
nginx運(yùn)行日志默認(rèn)保存在nginx安裝目錄下的 /usr/local/nginx/logs 文件夾, 包含access.log和error.log兩個(gè)文件.
- logrotate的配置文件
# rpm -ql logrotate
/etc/cron.daily/logrotate
/etc/logrotate.conf
/etc/logrotate.d
/usr/sbin/logrotate
/usr/share/doc/logrotate-3.8.6
/usr/share/doc/logrotate-3.8.6/CHANGES
/usr/share/doc/logrotate-3.8.6/COPYING
/usr/share/man/man5/logrotate.conf.5.gz
/usr/share/man/man8/logrotate.8.gz
/var/lib/logrotate.status
logrotate的配置文件是 /etc/logrotate.conf, 這個(gè)文件用來(lái)定義全局默認(rèn)參數(shù)
/etc/logrotate.d/ 是用于存儲(chǔ)各種自定義應(yīng)用的配置文件的目錄屯耸。該目錄里的所有文件都會(huì)被主動(dòng)的讀入到 /etc/logrotate.conf中執(zhí)行。該目錄下的應(yīng)用配置文件繼承所有/etc/logrotate.conf 的默認(rèn)參數(shù)
- 創(chuàng)建nginx日志分割文件(路徑: /etc/logrotate.d/nginx )
# cd /etc/logrotate.d/
# cat nginx
/usr/local/nginx/logs/access.log /usr/local/nginx/logs/error.log {
daily
minsize 10M
rotate 15
dateext
create
compress
delaycompress
sharedscripts
postrotate
/bin/kill -USR1 `cat /usr/local/nginx/logs/nginx.pid` 2> /dev/null || true
endscript
}
minsize 10M 文件必須大于10M蹭劈,且周期到了疗绣,才會(huì)輪轉(zhuǎn)
daily: 日志文件分割頻度∑倘停可選值為 daily持痰,monthly,weekly祟蚀,yearly
rotate 7: 一次將存儲(chǔ)7個(gè)歸檔日志工窍。對(duì)于第8個(gè)歸檔,時(shí)間最久的歸檔將被刪除前酿。
missingok: 在日志輪循期間患雏,任何錯(cuò)誤將被忽略,例如“文件無(wú)法找到”之類的錯(cuò)誤罢维。
dateext 使用日期作為命名格式
compress: 在輪循任務(wù)完成后淹仑,已輪循的歸檔將使用gzip進(jìn)行壓縮。
nocompress: 如果你不希望對(duì)日志文件進(jìn)行壓縮肺孵,設(shè)置這個(gè)參數(shù)即可
delaycompress: 總是與compress選項(xiàng)一起用匀借,delaycompress選項(xiàng)指示logrotate不要將最近的歸檔壓縮,壓縮將在下一次輪循周期進(jìn)行平窘。這在你或任何軟件仍然需要讀取最新歸檔時(shí)很有用吓肋。
notifempty: 如果日志文件為空,輪循不會(huì)進(jìn)行瑰艘。
sharedscripts 表示postrotate腳本在壓縮了日志之后只執(zhí)行一次
create 644 www root: 以指定的權(quán)限創(chuàng)建全新的日志文件是鬼,同時(shí)logrotate也會(huì)重命名原始日志文件。
postrotate/endscript: 最通常的作用是讓?xiě)?yīng)用重啟紫新,以便切換到新的日志文件, 在所有其它指令完成后均蜜,postrotate和endscript里面指定的命令將被執(zhí)行。在這種情況下芒率,nginx 進(jìn)程將立即再次讀取其配置并繼續(xù)運(yùn)行囤耳。
如何告訴應(yīng)用程序重新打開(kāi)日志文件?
以Nginx為例,是通過(guò)postrotate指令發(fā)送USR1信號(hào)來(lái)通知Nginx重新打開(kāi)日志文件的偶芍。但是其他的應(yīng)用程序不一定遵循這樣的約定充择,比如說(shuō)MySQL是通過(guò)flush-logs來(lái)重新打開(kāi)日志文件的。更有甚者腋寨,有些應(yīng)用程序就壓根沒(méi)有提供類似的方法聪铺,此時(shí)如果想重新打開(kāi)日志文件,就必須重啟服務(wù)萄窜,但為了高可用性铃剔,這往往不能接受。還好Logrotate提供了一個(gè)名為copytruncate的指令查刻,此方法采用的是先拷貝再清空的方式键兜,整個(gè)過(guò)程中日志文件的操作句柄沒(méi)有發(fā)生改變,所以不需要通知應(yīng)用程序重新打開(kāi)日志文件穗泵,但是需要注意的是普气,在拷貝和清空之間有一個(gè)時(shí)間差,所以可能會(huì)丟失部分日志數(shù)據(jù)佃延。
kill命令以及USR1信號(hào)解釋
USR1亦通常被用來(lái)告知應(yīng)用程序重載配置文件现诀;例如夷磕,向Apache HTTP服務(wù)器發(fā)送一個(gè)USR1信號(hào)將導(dǎo)致以下步驟的發(fā)生:停止接受新的連接,等待當(dāng)前連接停止仔沿,重新載入配置文件坐桩,重新打開(kāi)日志文件,重啟服務(wù)器封锉,從而實(shí)現(xiàn)相對(duì)平滑的不關(guān)機(jī)的更改绵跷。
kill -HUP pid 或者 killall -HUP pName:如果想要更改配置而不需停止并重新啟動(dòng)服務(wù)。在對(duì)配置文件作必要的更改后成福,發(fā)出該命令以動(dòng)態(tài)更新服務(wù)配置碾局。
根據(jù)約定,當(dāng)你發(fā)送一個(gè)掛起信號(hào)(信號(hào)1或HUP)時(shí)奴艾,大多數(shù)服務(wù)器進(jìn)程(所有常用的進(jìn)程)都會(huì)進(jìn)行復(fù)位操作并重新加載它們的配置文件净当。
日志服務(wù)rsyslog
參考文檔: https://blog.csdn.net/paopaohll/article/details/84388313
通過(guò)logger命令記錄日志:
參考文檔: https://www.cnblogs.com/itsad/p/8043517.html
- 配置rsyslog服務(wù),并重啟服務(wù)
在第一行加入local5.none,使得設(shè)備local5的日志不記錄在messages文件里
將設(shè)備local5的所有級(jí)別的信息都記錄在/var/log/yw.log文件里(修改yw.log文件權(quán)限)
*.info;mail.none;authpriv.none;cron.none;local1.none;local5.none /var/log/message
local5.* /var/log/yw.log
- 通過(guò)logger命令輸出
$ logger -t mysqlbak -p local5.info "info, xxxxxx"
$ logger -t mysqlbak -p local5.error "error, xxxxxx"
- 在logrotate下添加對(duì)應(yīng)rsyslog服務(wù)的配置(可選)
/var/log/cron
/var/log/maillog
/var/log/messages
/var/log/secure
/var/log/spooler
/var/log/yw.log //添加的內(nèi)容
{
sharedscripts
postrotate
/bin/kill -HUP `cat /var/run/syslogd.pid 2> /dev/null` 2> /dev/null || true
endscript
}