一、Logrotate介绍

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

二、配置详解

1.主配置文件

[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轮转配置

[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
    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的轮转配置中相当重要
dateformat -%Y-%m-%d-%s                           # 定义切割日志的后缀
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.检查配置文件

[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

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

[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

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

Logo

AtomGit 是由开放原子开源基金会联合 CSDN 等生态伙伴共同推出的新一代开源与人工智能协作平台。平台坚持“开放、中立、公益”的理念,把代码托管、模型共享、数据集托管、智能体开发体验和算力服务整合在一起,为开发者提供从开发、训练到部署的一站式体验。

更多推荐