一 、Nginx-Tomcat 等常用服務(wù)日志分析
在實(shí)際生產(chǎn)中,我們知道哪些應(yīng)用的日志會(huì)自動(dòng)分割嗎?哪些應(yīng)用日志需要我們通過(guò)服務(wù)進(jìn)行定時(shí)分割?接下來(lái)我們來(lái)看看。
對(duì)比的標(biāo)準(zhǔn)
- 是否會(huì)自動(dòng)切割 ?
- 重啟是否會(huì)自動(dòng)分割 ?
Nginx 日志
日志名稱 | 日志描述 | 是否自動(dòng)切割 | 是否需要定時(shí)切割 |
---|---|---|---|
access.log | Nginx 訪問(wèn)日志 | 否 | 是 |
error.log | Nginx 錯(cuò)誤日志 | 否 | 是 |
如果需要單獨(dú)配置網(wǎng)站日志的話需要在 server 模塊添加access_log logs/djx.log ;
Tomcat日志
日志名稱 | 日志描述 | 是否自動(dòng)切割 | 是否需要定時(shí)切割 |
---|---|---|---|
catalina.out | Tomcat 運(yùn)行時(shí)日志和輸出到控制臺(tái)日志(應(yīng)用) | 否 | 是 |
catalina.2019-04-28.log | Tomcat本身運(yùn)行的日志,主要是啟動(dòng)和暫停的。 | 是 | 否 |
localhost_access_log.2019-04-28.txt | 訪問(wèn) Tomcat 的日志,請(qǐng)求時(shí)間和資源,狀態(tài)碼都有記錄 | 是 | 否 |
localhost.2019-04-28.log | 應(yīng)用初始化(listener, filter, servlet)未處理的異常最后被 Tomcat 捕獲而輸出的日志 | 是 | 否 |
host-manager.2019-04-28.log | 放 Tomcat 的自帶的 Host Manager項(xiàng)目的日志信息的 | 是 | 否 |
manager.2019-04-28.log | Tomcat 自帶 Manager項(xiàng)目專有的日志文件 | 是 | 否 |
Tomcat 的日志比較特別和有意思,我也是認(rèn)真看了看才發(fā)現(xiàn)其中的奧秘。
畫重點(diǎn)了
Tomcat 的 catalina.out
日志是 不會(huì)自動(dòng)切割的,所以我們需要對(duì)它進(jìn)行定時(shí)切割,重啟 Tomcat 也是不會(huì)自動(dòng)切割的。
其它的日志 Tomcat 是會(huì)進(jìn)行自動(dòng)切割的,但是會(huì)遵循這樣的一個(gè)規(guī)則:日志隔天切割,有日志才切割,重啟會(huì)切割:
- 日志隔天切割 :含義是 日志在24.00分才會(huì)進(jìn)行切割,如果 00:00:10 產(chǎn)生了當(dāng)天的第一條日志,那么就進(jìn)行切割。
- 有日志才切割 :含義是 如果滿足了隔天的要求,但是第二天一直沒有產(chǎn)生日志,那么就會(huì)直到第二天第一條日志產(chǎn)生時(shí)才進(jìn)行切割。
- 重啟切割 : 含義是 如果上面的條件都不滿足,就是到了第二天,但是一條日志一直都沒有產(chǎn)生,那么在重啟Tomcat 時(shí)是會(huì)進(jìn)行切割的。
上面內(nèi)容有點(diǎn)繞,我們舉幾個(gè)示例理解下。
示例1:
Tomcat 在 2019 年 4 月28號(hào)15.30分啟動(dòng)的,有日志文件 catalina.2019-04-28.log 等。2019 年 4月29號(hào)的第一條日志在 2019 年 4月29號(hào)9.30分。那么日志切割在什么時(shí)候? ? 日志切割是在 2019 年 4月29號(hào)9.30分。
示例2:
Tomcat 在 2019 年 4 月28號(hào)10.30分啟動(dòng)的,有日志文件 catalina.2019-04-28.log 等。在 2019 年 4月29號(hào)3.30分重啟了 Tomcat ,但是在重啟前,Tomcat 在2019 年 4月29號(hào)3.30分當(dāng)天是沒有產(chǎn)生日志的,但在 2019 年 4月29號(hào) 3.50 產(chǎn)生了日志。問(wèn)在什么時(shí)候切割了日志? ? Tomcat 重啟時(shí)就進(jìn)行了切割。
MongoDB 日志
MongoDB 的日志我們平時(shí)是關(guān)注的比較少,但是我們這邊還是做下記錄。
MongoDB 的日志是否切割取決于 MongoDB 的配置參數(shù)。
logRotate= rename/reopen #3.0.0版中的新功能??梢匀≈禐?rename 或 reopen: rename 重命名日志文件。每次重啟都會(huì)重命名日志文件。 reopen 按照典型的 Linux/Unix 日志循環(huán)行為關(guān)閉并重新打開日志文件。使用 reopen 使用的 Linux/Unix logrotate的工具時(shí),以避免日志的丟失。 如果指定 reopen,則還必須使用 logappend logappend= true # 當(dāng) MongoDB 實(shí)例重新啟動(dòng)時(shí),將新的日志內(nèi)容添加到現(xiàn)有日志文件的末尾。如果沒有此選項(xiàng),MongoDB 將備份現(xiàn)有日志并創(chuàng)建新文件。
但是,MongoDB 的日志默認(rèn)是不會(huì)進(jìn)行切割的(如果不重啟的話)。
MongoDB
日志切割 見文章 :MongoDB 日志切割三種方式
Redis 日志
Redis 日志默認(rèn)也是不切割的, 重啟也不切割。 Redis 日志在實(shí)際環(huán)境中我們也是建議進(jìn)行切割的,切割頻率可以降低。我看到有的 Redis 日志達(dá)到 1G,運(yùn)行了2年,那么我們進(jìn)行查找日志就比較不方便的,所以建議 Redis 的日志也進(jìn)行切割。
二 、日志切割服務(wù) logrotate
我們通常會(huì)去尋找對(duì)應(yīng)的日志切割服務(wù),但是我們不知道系統(tǒng)默認(rèn)已經(jīng)默認(rèn)帶了一個(gè)日志的切割服務(wù) logrotate
。像我們系統(tǒng)的日志 /var/log/cron
、/var/log/maillog
、/var/log/messages
等等這些都是通過(guò) logrotate
來(lái)進(jìn)行切割的,我們可以在文件 /etc/logrotate.d/syslog
看到具體的配置。logrotate
可以每天或者每個(gè)月按周期對(duì)日志進(jìn)行自動(dòng)切割和壓縮,以及通過(guò)郵件發(fā)送。logrotate
的自動(dòng)切割是 通過(guò) crond
來(lái)運(yùn)行任務(wù)的。
logrotate 官方鏈接
logrotate 命令以及選項(xiàng)
logrotate [OPTION...] <configfile> -d, --debug # 僅僅是測(cè)試,并不做任何東西。在測(cè)試配置文件是否正確的時(shí)候可以使用。 -f, --force # 指定配置文件 -m, --mail=command # 指定發(fā)送郵件的命令,替代 /bin/mail -s, --state=statefile # 指定狀態(tài)文件的路徑 ,默認(rèn)路徑是 /var/lib/logrotate.status 。 -v, --verbose # 顯示 logrotate 分割信息 -l, --log=STRING # 指定日志文件的路徑 --version # 顯示版本信息
logrotate 配置文件路徑
logrotate
配置文件的位置 位于/etc/logrotate.conf
logrotate
用戶配置文件位于 /etc/logrotate.d/
logrotate
的執(zhí)行狀態(tài)文件/var/lib/logrotate.status
logrotate 配置文件的參數(shù):
compress # 是否通過(guò)gzip壓縮轉(zhuǎn)儲(chǔ)以后的日志文件,如xxx.log-20131216.gz ;如果不需要壓縮,注釋掉就行 compresscmd # 指定壓縮的命令,默認(rèn) gzip uncompresscmd # 用于解壓縮的日志文件的命令 默認(rèn)是 gunzip compressext # 啟用壓縮的擴(kuò)展名,默認(rèn) gzip 的擴(kuò)展名就是 .gz。 copy # 制作日志文件的副本,與create選項(xiàng)互斥。 copytruncate # 用于還在打開中的日志文件,把當(dāng)前日志備份并截?cái)?;是先拷貝再清空的方式,拷貝和清空之間有一個(gè)時(shí)間差,可能會(huì)丟失部分日志數(shù)據(jù)。與create選項(xiàng)互斥。 create mode owner group # 在切割后,創(chuàng)建新的日志文件,并指定數(shù)據(jù)的權(quán)限和所有者和所屬組。 dateext # 這個(gè)參數(shù)很重要!就是切割后的日志文件以當(dāng)前日期YYYYMMDD為格式結(jié)尾,如xxx.log-20131216這樣,如果注釋掉,切割出來(lái)是按數(shù)字遞增,即前面說(shuō)的 xxx.log-1這種格式 dateformat format_string # 指定日志文件后綴日期格式 ifempty # 表示即使是空文件也要選擇,該選項(xiàng)是默認(rèn)值。與 notifempty 相反 notifempty # 當(dāng)日志文件為空時(shí),不進(jìn)行輪轉(zhuǎn),與 ifempty 相反 mailfirst # 當(dāng)配置了郵件地址,指定發(fā)送最新的文件 maillast # 當(dāng)配置了郵件地址,指定發(fā)送最舊的文件,(默認(rèn)設(shè)置) rotate count # 日志保留的次數(shù), 如果該參數(shù)不寫的話,默認(rèn)就是刪除之前所有的文件日志。比如切割了200次,那么只保留最新的180次日志,并刪除舊的20次日志。如果配置文件指定的是 daily,那每天切割一次日志,就意味著保留180天日志。 maxage count # 刪除早于 count 天的日志,如果配置了 mail 則通過(guò)郵件發(fā)送。 daily # 每天 切割 weekly # 每周運(yùn)行一次,通常在每周的第一天。 monthly # 每月運(yùn)行一次切割,通常會(huì)在該月的第一天。 yearly # 如果當(dāng)前年份與上一次年份不相同,就會(huì)進(jìn)行切割 nocompress # 不進(jìn)行壓縮。 size size # 日志文件達(dá)到多大就切割 olddir dir # 切割后存放的目錄 start count # 當(dāng)沒有指定日期后綴,將數(shù)字作為后綴內(nèi)容,默認(rèn)是從 1 開始 ??梢灾付ㄆ渌麛?shù)字開始。 missingok # 如果日志丟失,不報(bào)錯(cuò)繼續(xù)滾動(dòng)下一個(gè)日志 mail 112@163.com # 該參數(shù)與 rotate 是有關(guān)聯(lián)的,當(dāng)超過(guò) rotate 指定次數(shù),文件不是刪除,而是通過(guò)郵件發(fā)送到指定位置。 prerotate # 在logrotate轉(zhuǎn)儲(chǔ)之前需要執(zhí)行的指令 postrotate # 在logrotate轉(zhuǎn)儲(chǔ)之后需要執(zhí)行的指令 ### 3.85 版本增加每個(gè)小時(shí)切割 hourly # 每個(gè)小時(shí)切割
示例配置
# 文件路徑,可以使用通配符。 /opt/tomcat/logs/catalina.out{ compress compressext .gz copytruncate dateext notifempty maillast rotate 180 daily size 10M olddir /opt/logs/tomcat missingok mail 888888@qq.com # 如果我們本地沒有配置好發(fā)送郵件配置的話是發(fā)送不了郵件的。 }
常用命令
logrotate -d -f /etc/logrotate.d/tomcat # 測(cè)試配置文件是否配置正常 logrotate -f /etc/logrotate.d/tomcat # 立刻切割文件,可以將該命令放到定時(shí)任務(wù)中實(shí)現(xiàn)定時(shí)切割
注意事項(xiàng):
當(dāng)我們?cè)O(shè)置好日志按日進(jìn)行切割的時(shí)候,具體的執(zhí)行時(shí)間是在什么時(shí)候呢?我們不要以為是會(huì)在 24.00 的時(shí)候進(jìn)行切割的,它進(jìn)行切割的時(shí)間是隨機(jī)的。這個(gè)隨機(jī)值取決于
crond
服務(wù)的,最終會(huì)取決于文件/etc/anacrontab
,[root@localhost ~]# cat /etc/anacrontab # /etc/anacrontab: configuration file for anacron # See anacron(8) and anacrontab(5) for details. SHELL=/bin/sh PATH=/sbin:/bin:/usr/sbin:/usr/bin MAILTO=root # the maximal random delay added to the base delay of the jobs # 延遲時(shí)間 RANDOM_DELAY=45 # the jobs will be started during the following hours only 執(zhí)行時(shí)間段 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
我們可以發(fā)現(xiàn) 定時(shí)任務(wù)是會(huì)在 3-22點(diǎn)的5分-45分里面進(jìn)行日志切割。
生產(chǎn)環(huán)境中該如何定時(shí)日志分割
我們?cè)趯?shí)際的生產(chǎn)環(huán)境中,我們通常會(huì)進(jìn)行按日進(jìn)行日志分割,也就是我們希望在 24.00 進(jìn)行前一天的日志分割,我們可以通過(guò)
crond
服務(wù)進(jìn)行定時(shí)切割 (logrotate -f /etc/logrotate.d/tomcat ), 但是我們通常在很多應(yīng)用中會(huì)有定時(shí)任務(wù)在 24.00進(jìn)行執(zhí)行,那個(gè)時(shí)間段也就會(huì)產(chǎn)生大量的日志,如果我們?cè)诖藭r(shí)切割,那么我們可能會(huì)導(dǎo)致比較多的重要的日志丟失(并且此時(shí)任務(wù)多,資源消耗多,切割也慢),那么我們建議先咨詢開發(fā),24.00 是否有大量定時(shí)任務(wù),我們可以在 24.00之前幾分鐘或者之后幾分鐘 進(jìn)行切割。這樣就避免大量的日志丟失。
三、日志切割示例
Nginx 切一切
示例:Nginx
日志保存在 /opt/nginx/logs/
,包含日志 access.log
和 error.log
。
/opt/nginx/logs/* { compress compressext .gz copytruncate dateext notifempty maillast rotate 180 daily size 10M olddir /opt/logs/nginx missingok mail 888888@qq.com # 如果我們本地沒有配置好發(fā)送郵件配置的話是發(fā)送不了郵件的。 }
Tomcat 切一切
示例:Tomcat
日志保存在 /opt/tomcat/logs/
,包含日志 catalina.out
,其他日志會(huì)自動(dòng)切割。
/opt/tomcat/logs/catalina.out{ compress compressext .gz copytruncate dateext notifempty maillast rotate 180 daily size 10M olddir /opt/logs/tomcat missingok mail 888888@qq.com # 如果我們本地沒有配置好發(fā)送郵件配置的話是發(fā)送不了郵件的。