nginx不停機(jī)分割日志
nginx不停機(jī)分割日志
本篇文章記錄一下Nginx未停機(jī)下更新日志的過程。
?
Nginx輸出的日志原名為access.log,但是如果時(shí)間長了該日志文件會變得過于龐大,需要使用EmEditor之類的大TXT打開文件才能夠進(jìn)行打開。
?
EMEditor免費(fèi)版雖然功能較少,但是可以免費(fèi)打開及查看大TXT日志文件,其中13G的TXT文件大概需要5秒左右即可打開。
?
nginx共有幾種分割日志的方式。通常主要分為:
1.?linux任務(wù)調(diào)度進(jìn)行更改日志文件名稱,讓每天新的日志仍然傳輸?shù)絘ccess.log之中,到每天半夜將當(dāng)天的access.log文件更改為access-2022-08-14之類的日志名稱,再讓當(dāng)天最新的日志文件輸出到access.log之中。
2.?server中配置map方式
3.?server中配置getTime方式
等等方式通過Nginx的配置文件nginx.conf文件,更改獲取時(shí)間的方式并且疊加到access.log之中即可。
?
下文中將會采用方式三server中配置getTime方式進(jìn)行配置nginx分割日志。
?
不停機(jī)的方式即是通過Nginx自帶的命令進(jìn)行刷新配置文件如下所示,更改完配置文件輸入如下命令即可。
nginx?-t??//查看當(dāng)前配置文件是否正確,如果錯(cuò)誤則需要修改配置文件。
nginx -s reload //刷新配置文件,并且以新的配置文件進(jìn)行運(yùn)行Nginx
nginx?-s?reopen?//重新將數(shù)據(jù)導(dǎo)入到新的日志文件之中。
?
簡單釋義的情況下用上述三條命令即可達(dá)到,更改完配置文件直接進(jìn)行熱部署的效果。但是值得注意的是,Nginx含有worker進(jìn)程,即使更改完配置文件,并且對Nginx進(jìn)行刷新,通過新的配置文件進(jìn)行配置時(shí),如果仍然還有進(jìn)程在訪問Nginx的話,那么因?yàn)閣orker進(jìn)程沒有進(jìn)行刪除,所以新的日志無法正確產(chǎn)生,這種情況下只能強(qiáng)行關(guān)閉nginx進(jìn)行重啟。筆者仍沒有嘗試過大約多久所有的worker會失效,畢竟有些線上項(xiàng)目24小時(shí)都有人進(jìn)行訪問,所以估計(jì)很難進(jìn)行熱部署,不過好在nginx重啟時(shí)間只需要毫秒即可啟動,如果這種熱配置的方式不行的話,只能通過keepalived配置多個(gè)nginx,產(chǎn)生灰度的效應(yīng),停機(jī)其中一個(gè)nginx之后,另外一個(gè)nginx仍然可以運(yùn)行。不過這個(gè)不在本文說明范圍之內(nèi)。
?
順便記錄下nginx停機(jī)及啟動命令。
nginx?-s stop //nginx停機(jī)
start nginx //windows環(huán)境下后臺啟動nginx
./nginx & //linux環(huán)境下后臺啟動nginx
?
nginx分割日志配置
在nginx的server下配置以下代碼
if ($time_iso8601 ~ "^(\d{4})-(\d{2})-(\d{2})T(\d{2}):(\d{2}):(\d{2})")
{
????set $year $1;
????set $month $2;
????set $day $3;
????set $hour $4;
????set $minutes $5;
????set $seconds $6;
}
?
效果如下圖所示。

?
這里給nginx多設(shè)置了幾個(gè)變量。然后在access.log處增加代碼如下所示。
access_log??logs/access_$year-$month-$day-$hour-$minutes-$seconds.log??main;
?
效果如下圖所示。

?
這里是按照每秒分割一個(gè)新的日志,如果需要更改的話只要后面不要增加小時(shí)、分鐘。秒即可。
值得注意的是,以后輸出文件會直接輸出到access_2022-8-14.log之中,立即生效,不會像任務(wù)調(diào)度的方式是等待第二天才生效的。
?
另外再access_log?這行代碼配置的最后含有main定義,該定義對應(yīng)上方的log_format定義,該定義為輸出到access_log都數(shù)據(jù)格式,通常會進(jìn)行詳細(xì)編寫,方便后續(xù)擴(kuò)展由logstash進(jìn)行對日志的解析。nginx本身含有一份默認(rèn)的log_format類型。但是通常這里都根據(jù)業(yè)務(wù)自行編寫的。
?
在上述兩者配置之后,使用nginx刷新配置、nginx重新打開日志文件命令,即可達(dá)到不停機(jī)分割日志的方式。最終效果如下圖所示。
我這里是按照秒進(jìn)行分割的日志。
