linux日志輪詢方案
logrotate 簡(jiǎn)介
一般來說,日志是任何故障排除過程中非常重要的一部分,但這些日志會(huì)隨著時(shí)間增長(zhǎng)。在這種情況下,我們需要手動(dòng)執(zhí)行日志清理以回收空間,這是一件繁瑣的管理任務(wù)。為了解決這個(gè)問題,我們可以在 Linux 中配置 logrotate 程序,它可以自動(dòng)執(zhí)行日志文件的輪換、壓縮、刪除和用郵件發(fā)出。
我們可以配置 logrotate 程序,以便每個(gè)日志文件可以在每天、每周、每月或當(dāng)它變得太大時(shí)處理。
logrotate軟件是一個(gè)日志管理工具,用于 切割日志,刪除舊的日志文件,并創(chuàng)建新的日志文件,起到“轉(zhuǎn)儲(chǔ)作用”,可以為系統(tǒng)節(jié)省磁盤空間。一般centos系統(tǒng)已經(jīng)自帶安裝好了。
logrotate是基于 crontab 運(yùn)行的,運(yùn)行時(shí),logrotate 會(huì)調(diào)用配置文件 /etc/logrotate.conf 。可以在 /etc/logrotate.d 目錄里放置自定義好的配置文件,用來覆蓋 logrotate.conf 的缺省值。
logrotate 版本查看
root@test 10:14:51:/usr# logrotate --version logrotate 3.11.0
logrotate 配置文件
- 命令:
/usr/sbin/logrotate
- 配置文件:
/etc/logrotate.conf
這是 logrotate 的主配置文件。logrotate 還在 /etc/logrotate.d/
中存儲(chǔ)了特定服務(wù)的配置。
確保下面的那行包含在 /etc/logrotate.conf 中,以讀取特定服務(wù)日志配置。 include /etc/logrotate.d`
logrotate 歷史:
/var/lib/logrotate/logrotate.status
日志回滾原理
當(dāng)日志達(dá)到某個(gè)特定的大小,我們將日志分類,之前的日志保留一個(gè)備份,再產(chǎn)生的日志創(chuàng)建一個(gè)同名的文件保存新的日志.
重要的 logrotate 選項(xiàng):
compress 通過gzip 壓縮轉(zhuǎn)儲(chǔ)以后的日志 nocompress 不做gzip壓縮處理 copytruncate 用于還在打開中的日志文件,把當(dāng)前日志備份并截?cái)?;是先拷貝再清空的方式,拷貝和清空之間有一個(gè)時(shí)間差,可能會(huì)丟失部分日志數(shù)據(jù)。 nocopytruncate 備份日志文件不過不截?cái)? 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è)日志 errors address 專儲(chǔ)時(shí)的錯(cuò)誤信息發(fā)送到指定的Email 地址 ifempty 即使日志文件為空文件也做輪轉(zhuǎn),這個(gè)是logrotate的缺省選項(xiàng)。 notifempty 當(dāng)日志文件為空時(shí),不進(jìn)行輪轉(zhuǎn) mail address 把轉(zhuǎn)儲(chǔ)的日志文件發(fā)送到指定的E-mail 地址 nomail 轉(zhuǎn)儲(chǔ)時(shí)不發(fā)送日志文件 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í)行一次腳本。如果沒有配置這個(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 指沒有備份,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ǔ)。 以下為合法格式:(其他格式的單位大小寫沒有試過) size = 5 或 size 5 (>= 5 個(gè)字節(jié)就轉(zhuǎn)儲(chǔ)) size = 100k 或 size 100k size = 100M 或 size 100M
sshd 日志回滾實(shí)戰(zhàn)
修改配置文件
[root@ localhost cron.daily]# vim /etc/logrotate.conf /var/log/sshd.log { # 指定的是要切割的日志文件 missingok # 如果文件丟失不報(bào)錯(cuò) monthly # 每月輪換一次 create 0664 root utmp # 設(shè)置sshd.log這個(gè)文件的屬主和屬組 minsize 10M # 文件超過10M進(jìn)行回滾 rotate 2 # 日志進(jìn)行分割后,保留兩份歷史數(shù)據(jù) }
重啟rsyslog
[root@ localhost cron.daily]# systemctl restart rsyslog
強(qiáng)制切割
[root@ localhost cron.daily]# logrotate –vf /etc/logrotate.conf [root@ localhost cron.daily]# cd /var/log/ [root@ localhost log]# ll sshd.log -rw------- 1 root root 0 2019-11-29 14:00 sshd.log # 切割完之后,源文件大小變?yōu)?
日志切割,是可以按照文件的大小和時(shí)間來進(jìn)行切割
以系統(tǒng)日志/var/log/message做切割來簡(jiǎn)單說明下:
- 第一次執(zhí)行完rotate(輪轉(zhuǎn))之后,原本的messages會(huì)變成messages.1,而且會(huì)制造一個(gè)空的messages給系統(tǒng)來儲(chǔ)存日志;
- 第二次執(zhí)行之后,messages.1會(huì)變成messages.2,而messages會(huì)變成messages.1,又造成一個(gè)空的messages來儲(chǔ)存日志!
- 如果僅設(shè)定保留三個(gè)日志(即輪轉(zhuǎn)3次)的話,那么執(zhí)行第三次時(shí),則 messages.3這個(gè)檔案就會(huì)被刪除,并由后面的較新的保存日志所取代!也就是會(huì)保存最新的幾個(gè)日志。
- 日志究竟輪換幾次,這個(gè)是根據(jù)配置文件中的rotate參數(shù)來判定的。
測(cè)試和運(yùn)行 logrotate
如果等不及cron自動(dòng)執(zhí)行日志輪轉(zhuǎn),想手動(dòng)強(qiáng)制切割日志,需要加-f參數(shù);不過正式執(zhí)行前最好通過Debug選項(xiàng)來驗(yàn)證一下(-d參數(shù)),這對(duì)調(diào)試也很重要
/usr/sbin/logrotate -f /etc/logrotate.d/nginx /usr/sbin/logrotate -d -f /etc/logrotate.d/nginx
具體 logrotate 命令格式如下:
logrotate [OPTION...] <configfile> -d, --debug :debug 模式,測(cè)試配置文件是否有錯(cuò)誤。 -f, --force :強(qiáng)制轉(zhuǎn)儲(chǔ)文件。 -m, --mail=command :壓縮日志后,發(fā)送日志到指定郵箱。 -s, --state=statefile :使用指定的狀態(tài)文件。 -v, --verbose :顯示轉(zhuǎn)儲(chǔ)過程。
debug 模式
并不會(huì)真正進(jìn)行 rotate 或者 compress 操作,但是會(huì)打印出整個(gè)執(zhí)行的流程,和調(diào)用的腳本等詳細(xì)信息。
logrotate -d <configfile>
verbose 模式
會(huì)真正執(zhí)行操作,打印出詳細(xì)信息。
logrotate -v <configfile>
force 強(qiáng)制執(zhí)行
如果時(shí)間不符合要求,logrotate 也不會(huì)真正執(zhí)行時(shí),如果想要立即執(zhí)行,查看結(jié)果,就使用到了 強(qiáng)制執(zhí)行模式。
logrotate -f <configfile>
添加 crontab 計(jì)劃任務(wù)
執(zhí)行 crontab -e
進(jìn)入 vim 模式,進(jìn)行編輯。
[root@root local]# crontab -e #每天 23點(diǎn)59分進(jìn)行日志切割 59 23 * * * /usr/sbin/logrotate -s /tmp/logrotate.status /etc/logrotate.d/tomcat
解釋:
59 23 * * * cron表達(dá)式
/usr/sbin/logrotate 啟動(dòng)logrotate
-s /tmp/logrotate.status 保存執(zhí)行狀態(tài)
/etc/logrotate.d/tomcat 定時(shí)任務(wù) ,前提是有 tomcat 文件
tomcat 文件內(nèi)容:
/soft/tomcat/logs/catalina.out{ minsize 50M rotate 20 compress copytruncate notifempty }
crontab 常用命令
查看所有的定時(shí)任務(wù) crontab -l
[root@root local]# crontab -l .....(省略) 59 23 * * * /usr/sbin/logrotate -f /etc/logrotate_mytime/nginx_rotate .....(省略)
編輯定時(shí)任務(wù) crontab -e
[root@root local]# crontab -e # 進(jìn)入vim 模式 .....(省略) 59 23 * * * /usr/sbin/logrotate -f /etc/logrotate_mytime/nginx_rotate .....(省略)
常見應(yīng)用的 logrotate 配置
/var/log/nginx/*.log { # 可以指定多個(gè)路徑 daily # 日志輪詢周期,weekly,monthly,yearly rotate 30 # 保存30天數(shù)據(jù),超過的則刪除 size 100M # 超過100M時(shí)分割,單位K,M,G,優(yōu)先級(jí)高于daily compress # 切割后壓縮,也可以為nocompress delaycompress # 切割時(shí)對(duì)上次的日志文件進(jìn)行壓縮 dateext # 日志文件切割時(shí)添加日期后綴 dateformat -%Y-%m-%d missingok # 如果沒有日志文件也不報(bào)錯(cuò) notifempty # 日志為空時(shí)不進(jìn)行切換,默認(rèn)為ifempty create 640 nginx nginx # 使用該模式創(chuàng)建日志文件 sharedscripts # 所有的文件切割之后只執(zhí)行一次下面腳本 postrotate if [ -f /run/nginx.pid ]; then kill -USR1 `cat /run/nginx.pid` fi endscript }
logrotate 默認(rèn)運(yùn)行時(shí)間
logrotate 是基于cron 運(yùn)行的,所以這個(gè)時(shí)間是由 cron 控制的,具體可以查詢 cron 的配置文件/etc/crontab
。
舊版CentOS 的cron 的配置文件是 /etc/crontab
,新版CentOS 改為 /etc/anacrontab
。
總結(jié)
以上為個(gè)人經(jīng)驗(yàn),希望能給大家一個(gè)參考,也希望大家多多支持腳本之家。
相關(guān)文章
Linux中使用crond工具創(chuàng)建定時(shí)任務(wù)的方法
這篇文章主要介紹了Linux中使用crond工具創(chuàng)建定時(shí)任務(wù)的方法,本文通過多種方法給大家介紹的非常詳細(xì),具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2020-02-02CentOS7連接XShell與網(wǎng)絡(luò)配置的方法
這篇文章主要介紹了如何使用CentOS7連接XShell與網(wǎng)絡(luò)配置的方法,可以更好的幫助大家工作和學(xué)習(xí),感興趣的小伙伴可以了解下2020-05-05SSM項(xiàng)目頻繁打成war包部署,使用tomcat和maven實(shí)現(xiàn)熱部署配置
這篇文章主要介紹了SSM項(xiàng)目頻繁打成war包部署操作頻繁?使用tomcat和maven實(shí)現(xiàn)熱部署配置,本文給大家介紹的非常詳細(xì),具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2019-11-11Apache Ant自動(dòng)化腳本入門教程及常用命令介紹
這篇文章主要介紹了Apache Ant自動(dòng)化腳本入門教程及常用命令介紹的相關(guān)資料,需要的朋友可以參考下2016-06-06linux上安裝zookeeper 啟動(dòng)和關(guān)閉的教程
這篇文章主要介紹了linux上安裝zookeeper 啟動(dòng)和關(guān)閉的教程詳解,首先zookeeper運(yùn)行需要java環(huán)境所以必須先裝JDK,具體操作步驟大家一起看看本文吧2018-08-08CentOS8 Linux 8.0.1905的安裝過程(圖解)
這篇文章主要介紹了CentOS Linux 8.0.1905的安裝過程,本文通過圖文并茂的形式給大家介紹的非常詳細(xì),具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2019-10-10