logrotate 进行nginx日志分割

时间:2023-03-08 16:00:20

http://www.williamsang.com/archives/1254.html

日志分割常用方法:

  • 自己写脚本分割
  • 使用linux自带的logrotate

前者灵活,可以应对各种需求,自定义文件夹、文件名。后者配置简单,使用方便。

下面我们以分割nginx日志为例介绍一下使用logrotate分割日志实例。

logrotate简单介绍

logrotate使用cron按时调度执行,日志的执行过程原理为不断改名称:比如你有个access.log文件,需要保留4个日志文件,那么logrotate是这么轮转的:

access.log满足轮转条件?(调度时间,日志大小是否满足要求)如果需要轮转则进行下列步骤,否则跳过

access.log.3存在?如果存在则删除

access.log.2如果存在则改名为access.log.3

access.log.1如果存在则改名为access.log.2

access.log如果存在则改名为access.log.1

创建一个空的access.log文件

如下图所示:

logrotate 进行nginx日志分割

logrotate配置文件一般在:

/etc/logrotate.conf 通用配置文件,可以定义全局默认使用的选项。

/etc/logrotate.d/xxx 自定义服务配置文件

我们可以看下/etc/logrotate.conf里面的内容

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
# 一个星期轮转一次
weekly
#保留四个日志
rotate 4
# 轮转旧的日志文件后创建新日志文件
create
# 使用日期作为轮转日志的后缀
dateext
# 压缩存储日志
#compress
# 包含某个目录下的自定义日志轮转
include
/etc/logrotate.d
# no packages own wtmp and btmp -- we'll rotate them here
/var/log/wtmp
{
monthly
create 0664 root utmp
minsize 1M
rotate 1
}
/var/log/btmp
{
missingok
monthly
create 0600 root utmp
rotate 1
}

我们新建一个/etc/logrotate.d/nginx来分割nginx日志,配置文件内容如下:

1
2
3
4
5
6
7
8
9
/data/logs/nginx/access/access.log
/data/logs/nginx/access/default.log {
daily
rotate 15
minsize 10M
sharedscripts
postrotate
  /usr/local/server/nginx/sbin/nginx
-s reload
endscript
}

第一行:指明日志文件位置,多个以空格分隔

第二行:调用频率,有:daily,weekly,monthly可选

第三行:总共轮换多少个日志文件,这里为保留15个

第四行:限制条件,大于10M的日志文件才进行分割,否则不操作

sharedscripts用于指明以下是执行轮转前和轮转后自定义执行的命令,比如postrotate和endscript表示,轮转后,执行nginx的重新加载配置文件,避免日志轮转后不写日志。如果要轮转前执行某个命令可以使用prerotate代替postrotate即可,两者可同时存在。

可以通过man logrotate查看更多选项

默认logrotate是通过crontab定期执行的,我们也可以手动执行查看结果:

  • # logrotate -vf /data/log/nginx/access.log

v选项表示查看详细执行过程

f表示强制执行日志轮转(不然时间不到,日志文件大小等条件不满足,不会执行)

强烈建议执行一下,了解下执行过程。

验证是否执行,查看cron的日志即可

  • # grep logrotate /var/log/cron

参考: