nginx不停机分割日志
nginx不停机分割日志
本篇文章记录一下Nginx未停机下更新日志的过程。
Nginx输出的日志原名为access.log,但是如果时间长了该日志文件会变得过于庞大,需要使用EmEditor之类的大TXT打开文件才能够进行打开。
EMEditor免费版虽然功能较少,但是可以免费打开及查看大TXT日志文件,其中13G的TXT文件大概需要5秒左右即可打开。
nginx共有几种分割日志的方式。通常主要分为:
1. linux任务调度进行更改日志文件名称,让每天新的日志仍然传输到access.log之中,到每天半夜将当天的access.log文件更改为access-2022-08-14之类的日志名称,再让当天最新的日志文件输出到access.log之中。
2. server中配置map方式
3. server中配置getTime方式
等等方式通过Nginx的配置文件nginx.conf文件,更改获取时间的方式并且叠加到access.log之中即可。
下文中将会采用方式三server中配置getTime方式进行配置nginx分割日志。
不停机的方式即是通过Nginx自带的命令进行刷新配置文件如下所示,更改完配置文件输入如下命令即可。
nginx -t //查看当前配置文件是否正确,如果错误则需要修改配置文件。
nginx -s reload //刷新配置文件,并且以新的配置文件进行运行Nginx
nginx -s reopen //重新将数据导入到新的日志文件之中。
简单释义的情况下用上述三条命令即可达到,更改完配置文件直接进行热部署的效果。但是值得注意的是,Nginx含有worker进程,即使更改完配置文件,并且对Nginx进行刷新,通过新的配置文件进行配置时,如果仍然还有进程在访问Nginx的话,那么因为worker进程没有进行删除,所以新的日志无法正确产生,这种情况下只能强行关闭nginx进行重启。笔者仍没有尝试过大约多久所有的worker会失效,毕竟有些线上项目24小时都有人进行访问,所以估计很难进行热部署,不过好在nginx重启时间只需要毫秒即可启动,如果这种热配置的方式不行的话,只能通过keepalived配置多个nginx,产生灰度的效应,停机其中一个nginx之后,另外一个nginx仍然可以运行。不过这个不在本文说明范围之内。
顺便记录下nginx停机及启动命令。
nginx -s stop //nginx停机
start nginx //windows环境下后台启动nginx
./nginx & //linux环境下后台启动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多设置了几个变量。然后在access.log处增加代码如下所示。
access_log logs/access_$year-$month-$day-$hour-$minutes-$seconds.log main;
效果如下图所示。

这里是按照每秒分割一个新的日志,如果需要更改的话只要后面不要增加小时、分钟。秒即可。
值得注意的是,以后输出文件会直接输出到access_2022-8-14.log之中,立即生效,不会像任务调度的方式是等待第二天才生效的。
另外再access_log 这行代码配置的最后含有main定义,该定义对应上方的log_format定义,该定义为输出到access_log都数据格式,通常会进行详细编写,方便后续扩展由logstash进行对日志的解析。nginx本身含有一份默认的log_format类型。但是通常这里都根据业务自行编写的。
在上述两者配置之后,使用nginx刷新配置、nginx重新打开日志文件命令,即可达到不停机分割日志的方式。最终效果如下图所示。
我这里是按照秒进行分割的日志。
