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配置比较稳妥

相关推荐
yyuuuzz1 小时前
aws亚马逊云上运维常见问题梳理
运维·服务器·网络·云计算·aws
2201_761199041 小时前
python运维1
运维·开发语言·python
yn002 小时前
Docker 一键部署加密支付网关:从零开始完整教程
运维·docker·容器
杨云龙UP2 小时前
Oracle CDB巡检脚本使用SOP:从HTML原始报告到Word正式交付_2026-05-29
运维·服务器·数据库·oracle·架构·html·巡检
難釋懷2 小时前
Nginx自签名-OpenSSL
运维·chrome·nginx
2301_803538952 小时前
CentOS版本差异详解和系统信息查看方法
linux·运维·centos
IT策士2 小时前
第14篇 Docker Compose 开发环境最佳实践:热重载与调试
运维·docker·容器
运维老郭2 小时前
【Kubernetes 性能排查】线上服务突然变慢?SRE 的 4 层排查法
运维·云原生·kubernetes
小此方2 小时前
Re:Linux系统篇(二十四)进程篇·九:进程从创建到退出的底层机制与写时拷贝全解
linux·运维·驱动开发