Logrotate配置nginx日志切割

一、Logrotate介绍

logrotate 是Linux系统下的一个日志管理工具,用于简化系统日志文件的管理。它可以自动对日志文件进行轮转、压缩、删除和邮件通知等操作,根据时间或文件大小触发处理,防止日志文件过大。通过配置文件设置规则,通常由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配置比较稳妥

相关推荐
xbzb2 小时前
自定义 yum 软件源:Linux 上 createrepo,Windows 上纯 Python 也能造
linux·运维·windows·python·yum·createrepo
Android系统攻城狮2 小时前
Linux FFmpeg深度解析之avio_open调用流程与实战(三十八)
linux·运维·服务器·ffmpeg·音视频进阶·ffmpeg音视频
瑞克-桑切斯4 小时前
ERP 企业生产管理系统部署手册
运维·docker·云原生·容器·eureka
江屿风4 小时前
【Git-组件】【Git入门:从文档灾难到版本掌控】流食般投喂
运维·笔记·git·组件·版本控制
我不会起名字3224 小时前
K8s 节点磁盘打满导致 Pod 被驱逐:4 类占用与回收顺序
运维·kubernetes·k8s·diskpressure·evicted
雪落漂泊5 小时前
Linux进程(五):进程地址空间篇
linux·运维·服务器
瑞克-桑切斯5 小时前
docker mail商城
运维·docker·容器
AR-26710-5 小时前
Linux Day32——网络,ROCE-IB与以太网
linux·运维
不庸.6 小时前
WPScan 实战入门:从 Docker 靶场到弱密码爆破
运维·安全·web安全·docker·容器·安全性测试·wpscan
Decay__8 小时前
SQL Server 数据库全栈运维实战系列 — 合集索引(24 篇)
运维·数据库·sql·mysql·架构