Logrotate配置nginx日志切割

一、Logrotate介绍

logrotateLinux系统下的一个日志管理工具,用于简化系统日志文件的管理。它可以自动对日志文件进行轮转、压缩、删除和邮件通知等操作,根据时间或文件大小触发处理,防止日志文件过大。通过配置文件设置规则,通常由cron定时任务触发执行。

二、配置详解

1.主配置文件

bash 复制代码
[root@test etc]# vim /etc/logrotate.conf
# see "man logrotate" for details
# rotate log files weekly
weekly

# keep 4 weeks worth of backlogs
rotate 4

# create new (empty) log files after rotating old ones
create

# use date as a suffix of the rotated file
dateext

# uncomment this if you want your log files compressed
#compress

# RPM packages drop log rotation information into this directory
include /etc/logrotate.d   # 自定义的日志轮转配置都放在这里,本次以nginx为例


# 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
}

2.创建nginx轮转配置

bash 复制代码
[root@test etc]# cd /etc/logrotate.d/
[root@test logrotate.d]# vim nginx
/opt/web_app/nginx-1.16.1/logs/*.log {
    daily
    missingok
#    size 100M
    rotate 14
    dateyesterday
    dateext
    dateformat -%Y-%m-%d-%s
    compress
    delaycompress
    notifempty
    create 640 nginx nginx
    sharedscripts
    postrotate
        if [ -f /opt/web_app/nginx-1.16.1/logs/nginx.pid ]; then
            kill -USR1 `cat /opt/web_app/nginx-1.16.1/logs/nginx.pid`
        fi
    endscript
}

3.配置详解

/opt/web_app/nginx-1.16.1/logs/*.log # 想切割的日志绝对路径

daily # 切割时间频率,可选值:daily,weekly,monthly,yearly

missingok # 日志不存在,不报错

size 100M # 当日志到达此大小后切割,一般情况下,与时间频率冲突

rotate 14 # 保留过去14天的日志

dateyesterday # 切割完后保存时间是前一天,这个配置在nginx的轮转配置中相当重要

dateext # 以时间为后缀命名

dateformat -%Y-%m-%d-%s # 定义切割日志的后缀,该参数要配合dateext使用,单独配置不生效

compress # 启用gzip压缩

delaycompress # 下次轮转时压缩文件

notifempty # 空日志文件不切割

create 640 nginx nginx # 创建新文件时的权限、所有者和所属组

sharedscripts # 确保在匹配到多个日志文件时,postrotate脚本只执行一次,这个配置在nginx日志轮转中非常重要,可避免nginx多次重新加载

postrotate # 重新打开日志的脚本

if -f /opt/web_app/nginx-1.16.1/logs/nginx.pid ; then

kill -USR1 `cat /opt/web_app/nginx-1.16.1/logs/nginx.pid`

fi

endscript

4.检查配置文件

bash 复制代码
[root@test logrotate.d]# logrotate --debug /etc/logrotate.d/nginx
reading config file /etc/logrotate.d/nginx
Allocating hash table for state file, size 15360 B

Handling 1 logs

rotating pattern: /opt/web_app/nginx-1.16.1/logs/*.log  after 1 days (14 rotations)
empty log files are not rotated, old logs are removed
considering log /opt/web_app/nginx-1.16.1/logs/access.log
  log does not need rotating (log has been rotated at 2026-5-27 11:15, that is not day ago yet)
considering log /opt/web_app/nginx-1.16.1/logs/error.log
  log does not need rotating (log has been rotated at 2026-5-27 10:0, that is not day ago yet)
not running postrotate script, since no logs were rotated

上面的检查是没有问题的,现在我们修改一个值,看看错误的是什么样的!

bash 复制代码
[root@test logrotate.d]# vim nginx
#    create 640 nginx nginx
    create 840 nginx nginx
# 把640权限改成840,再debug

[root@test logrotate.d]# logrotate --debug /etc/logrotate.d/nginx
reading config file /etc/logrotate.d/nginx
error: /etc/logrotate.d/nginx:12 extra arguments for create
error: found error in /opt/web_app/nginx-1.16.1/logs/*.log , skipping
removing last 1 log configs
Allocating hash table for state file, size 15360 B

Handling 0 logs

# debug提示 文件第12行有错误

三、定时执行

第二部分介绍了logrotate的配置,有了配置之后,就可以执行了,但如何执行呢?

我们可以直接在crontab里面配置精确的执行时间和命令

1.配置crontab

bash 复制代码
[root@test etc]# vim /etc/crontab
SHELL=/bin/bash
PATH=/sbin:/bin:/usr/sbin:/usr/bin
MAILTO=root

# For details see man 4 crontabs

# Example of job definition:
# .---------------- minute (0 - 59)
# |  .------------- hour (0 - 23)
# |  |  .---------- day of month (1 - 31)
# |  |  |  .------- month (1 - 12) OR jan,feb,mar,apr ...
# |  |  |  |  .---- day of week (0 - 6) (Sunday=0 or 7) OR sun,mon,tue,wed,thu,fri,sat
# |  |  |  |  |
# *  *  *  *  * user-name  command to be executed

0 0 * * * root logrotate -f /etc/logrotate.d/nginx

直接写入/etc/crontab配置文件,nginx轮转配置已经放在logrotate下了,而且logrotate会自动周期性执行,那么为什么一定要在crontab里面配置?

2.浅谈anacrontab 和 crontab

anacrontab是周期性补偿调度,适合可能关机或不常运行的设备

crontab 是精确时间点调度器,适合服务器常年开机的场景

简单来说:anacrontab是crontab的补偿方案,anacrontab并不会很准时的执行,如果想在每天0点0分执行切割,那么建议还是选择crontab。

具体区别如下:

特性 crontab anacrontab
全称 Cron Table Anacron Table
设计初衷 确切的时间点执行任务 确保任务在指定周期内至少执行一次
适用场景 服务器、24/7 运行的系统 笔记本电脑、偶尔关机的桌面系统
时间精度 精确到分钟(如每天 02:00) 粗略周期(如每 1 天、每 7 天)
是否依赖系统持续运行 是(若关机则错过任务) 否(开机后检查并补执行)
配置文件位置 /var/spool/cron//etc/crontab /etc/anacrontab
典型用途 备份、日志轮转、监控脚本 系统维护、更新检查、清理临时文件

※所以需要配置准确时间执行任务时,还是选择crontab配置比较稳妥

相关推荐
运维老郭21 小时前
【K8s运维实战】Kubernetes临时存储卷实战:emptyDir核心用法与gitRepo弃用迁移指南
运维·云原生·kubernetes
珠海西格电力21 小时前
云边端协同架构:零碳园区管理系统的技术底座
大数据·运维·人工智能·算法·架构·能源
阿成学长_Cain1 天前
Linux dirs命令详解|Bash目录堆栈管理快速切换目录实战教程
linux·运维·前端·数据库
小羊Yveesss1 天前
2026年微信小程序后端怎么搭建?后台、数据、接口和运维怎么选
运维·微信小程序·小程序
想你依然心痛1 天前
嵌入式Linux安全加固:SELinux、Capabilities与Seccomp——强制访问控制与沙箱
linux·运维·安全
AAA@峥1 天前
容器数据不丢失:Docker 分层存储 + Volume 共享、备份迁移完整指南
运维·docker·容器
MDM.Plus1 天前
苹果MDM技术演进:从远程控制到设备信任体系的构建
运维·服务器·安全·ios·mdm·手机店
REDcker1 天前
macOS 挂载 Linux 远程目录详解
linux·运维·macos
2601_961593421 天前
Mac 上搭建Linux环境吗?VMware + CentOS Stream 9 镜像快速部署
linux·运维·ide·macos·centos
写代码的学渣1 天前
Linux systemd 开机启动日志逐行详细解析报告
linux·运维·服务器