logrotate是基于cron来运行的,其脚本是/etc/cron.daily/logrotate,日志轮转是系统自动完成的。

实际运行时,logrotate会调用配置文件/etc/logrotate.conf,可在/etc/logrotate.d/目录里放置自定义好的配置文件,用来覆盖l

ogrotate的缺省值。

logrotate Github:https://github.com/logrotate/logrotate,最新版本  logrotate-3.22.0.tar.xz  (2024-06-01)

CentOS 7 默认版本:logrotate 3.8.6 - Copyright (C) 1995-2001 Red Hat, Inc.

 

1)cron : 定时任务

vim /etc/cron.daily/logrotate

CentOS 5/6

   #/etc/cron.daily/logrotate
   #! /bin/sh

   /usr/sbin/logrotate /etc/logrotate.conf

CentOS 7

#!/bin/sh

/usr/sbin/logrotate -s /var/lib/logrotate/logrotate.status /etc/logrotate.conf
EXITVALUE=$?
if [ $EXITVALUE != 0 ]; then
    /usr/bin/logger -t logrotate "ALERT exited abnormally with [$EXITVALUE]"
fi
exit 0

 

2)logrotate : 日志轮询备份管理

# /usr/sbin/logrotate --help
Usage: logrotate [OPTION...] <configfile>
  -d, --debug               Don't do anything, just test (implies -v)
  -f, --force               Force file rotation
  -m, --mail=command        Command to send mail (instead of `/bin/mail')
  -s, --state=statefile     Path of state file
  -v, --verbose             Display messages during rotation
  -l, --log=STRING          Log file
  --version                 Display version information

Help options:
  -?, --help                Show this help message
  --usage                   Display brief usage message

logrotate命令常用参数:

-d:debug模式,用于测试配置文件是否有错误

-f:强制执行log转储,即手动触发,提前转储

-v:显示执行过程

-m:发送log到指定邮箱

例如:

1)调试转储脚本 logrotate -d /etc/logrotate.d/nginx 

2)执行转储脚本 logrotate -f /etc/logrotate.d/nginx 

3)查看执行过程 logrotate -v /etc/logrotate.d/nginx

4)查看执行日志 vim /var/lib/logrotate/logrotate.status

 

1. logrotate配置

logrotate 是一个日志文件管理工具,用来把旧的日志文件删除,并创建新的日志文件,把它叫做“转储”。

我们可以根据日志文件的大小,也可以根据其天数来转储,并且重启nginx服务,这个过程一般通过 cron 程序来执行。

logrotate 程序还可以用于压缩日志文件,以及发送日志到指定的E-mail 。

logrotate 的配置文件是 /etc/logrotate.conf

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

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

# system-specific logs may be also be configured here.

logrotate提供了多种参数来配置日志文件的转储行为,包括日志文件的压缩、邮件通知、错误处理、日志文件的创建和删除策略等。

主要参数如下表:

参数                      功能

copytruncate                把当前日志备份并截断,清空当前日志,即并不创建新日志文件

nocopytruncate            备份日志文件但是不截断

create mode owner group     转储文件,使用指定的文件模式创建新的日志文件,例如:create 0644 www www

nocreate                       不建立新的日志文件

compress                  通过gzip 压缩转储以后的日志,日志后缀 xxx.log-20240709.gz

nocompress                不需要压缩时,用这个参数

delaycompress            和 compress 一起使用时,转储的日志文件到下一次转储时才压缩

nodelaycompress           覆盖 delaycompress 选项,转储同时压缩。

compresscmd            设置压缩使用的命令,默认为gzip

uncompresscmd      设置解压缩的命令,默认为ungzip

compressext            设置日志压缩后的后缀名,默认值遵循配置的压缩命令

compressoptions     设置压缩选项,如参数"-<1-9>“,指定压缩效率,默认为”-6",值越大,压缩率越高,但速度越慢

 

missingok                 如果日志丢失,不报错继续滚动下一个日志(即忽略错误)

errors address        转储时的错误信息发送到指定的Email 地址,此参数已被弃用,不建议配置

ifempty                   即使是空文件也转储,这是 logrotate 的缺省默认值

notifempty                如果是空文件的话,不转储,推荐此值

mail address              把转储的日志文件发送到指定的E-mail 地址

nomail                      转储时不发送日志文件

olddir directory       转储后的日志文件放入指定的目录,必须和当前日志文件在同一个文件系统

noolddir                   转储后的日志文件和当前日志文件放在同一个目录下

prerotate/endscript       在转储以前需要执行的命令可以放入这个对,这两个关键字必须单独成行

postrotate/endscript      在转储以后需要执行的命令可以放入这个对,这两个关键字必须单独成行

sharedscript         运行postrotate脚本,作用是在所有日志都转储后统一执行一次脚本。若没有配置这个,那么每个日志轮转后都会执行一次脚本

说明:sharedscripts命令的作用就是在运行postrotate里的脚本命令之前检查是否还有日志文件要分割,所有需要日志文件都分割完之后才会运行脚本命令。当然,如果没有日志文件需要分割,postrotate 里的脚本命令同样不会运行。例如,Nginx的access日志和error日志都被分割,那postrotate 里的脚本就会被运行两次,如果脚本命令里是重启服务器,那服务器就会被重启两次,这显然不是我们所希望的。这个时候就需要让logrotate在分割多个文件的时候只运行一次postrotate ,脚本设置命令sharedscripts

 

hourly                  指定转储周期为每小时,需修改 logrotate 放在/etc/cron.hourly/目录下

daily                     指定转储周期为每天

weekly                  指定转储周期为每周,工作日解释如下:0 表示周日,1 表示周一,…,6 表示周六; 特殊值 7 表示每 7 天,与工作日无关。 如果省略 weekday 参数,则默认为 0。

monthly                指定转储周期为每月

yearly                   指定转储周期为每年

maxage                最大保留天数,删除比这个天数大的转储日志

rotate count         指定日志文件删除之前转储的次数,0指没有备份,5 指保留5 个备份

dateext                使用当期日期作为命名格式,日志后缀 xxx.log-20240709 或 xxx.log-20240709.gz,如果注释掉,则以数字方式递增结尾(即xxx.log.1)

nodateext         旧日志文件不使用dateext扩展名,后面序数自增如"*.log.1"

dateformat .%s    配合dateext使用,紧跟在下一行出现,定义文件切割后的文件名,只支持 %Y %m %d %s 这四个参数

tabootext [+] list        让logrotate 不转储指定扩展名的文件,缺省的扩展名是:.rpm-orig, .rpmsave, v, 和 ~

size(或minsize)log-size :当日志文件到达指定大小时才转储,优先级高于周期转储log-size 可指定 bytes (缺省)、KB (sizek)或者MB (sizem),默认1MB,取值可为 100 (bytes)、10K、100M、100G

minsize    同时考虑日志文件大小和设置的轮换时间间隔(如设置了每天轮换一次),当达到轮换时间间隔且日志文件大于时才会进行轮换。执行logrotate时,只有当日志文件超过限制值才会进行切割滚动,不超过阈值不进行滚动(一个周期内完全不滚动),但一个周期内只会执行一次。例:限制minsize值为100M,采用hourly,若一小时内一直不超过100M,则完全不进行滚动;若一小时内多次超过100M(需结合定时任务),则只会执行一次。

maxsize    同时考虑日志文件大小和设置的轮换时间间隔(如设置了每天轮换一次),当达到轮换时间间隔,或者日志文件大于时才会进行轮换。执行logrotate时,只要日志文件大小超过限制值,即使没到下个周期(例如:weekly)也会进行切割滚动,一个周期内会发生多次切割。即一天一切的情况下,若一直不满足maxsize则只会切割一次,但一旦达到阈值,则会发生多次切割。

       minsize size
              Log files are rotated when they grow bigger than size
              bytes, but not before the additionally specified time
              interval (daily, weekly, monthly, or yearly).  The related
              size option is similar except that it is mutually
              exclusive with the time interval options, and it causes
              log files to be rotated without regard for the last
              rotation time, if specified after the time criteria (the
              last specified option takes the precedence).  When minsize
              is used, both the size and timestamp of a log file are
              considered.

       maxsize size
              Log files are rotated when they grow bigger than size
              bytes even before the additionally specified time interval
              (daily, weekly, monthly, or yearly).  The related size
              option is similar except that it is mutually exclusive
              with the time interval options, and it causes log files to
              be rotated without regard for the last rotation time, if
              specified after the time criteria (the last specified
              option takes the precedence).  When maxsize is used, both
              the size and timestamp of a log file are considered.

更多详细的参数,请见:logrotate(8) — Linux manual page

 

2. logrotate 缺省配置

logrotate 缺省的配置文件是 /etc/logrotate.conf

Red Hat Linux 缺省安装的文件内容是:

vim /etc/logrotate.conf

# see "man logrotate" for details
# rotate log files weekly
weekly

# keep 4 weeks worth of backlogs
rotate 4

# send errors to root
errors root

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

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

# RPM packages drop log rotation information into this directory
include /etc/logrotate.d

# no packages own lastlog or wtmp --we'll rotate them here
/var/log/wtmp {
   monthly
   create 0664 root utmp
   rotate 1
}

/var/log/lastlog {
   monthly
   rotate 1
}

# system-specific logs may be configured here

缺省的配置一般放在logrotate.conf 文件的最开始处,影响整个系统。在本例中就是前面12行。

第3行 weekly 指定所有的日志文件每周转储一次。

第6行 rotate 4 指定转储文件的保留 4份。

第9行 errors root 指定错误信息发送给root。

第12行 create 指定 logrotate 自动建立新的日志文件,新的日志文件具有和原来的文件一样的权限。

第15行 #compress 指定不压缩转储文件,如果需要压缩,去掉注释就可以了

 

3. 使用include 选项读取其他配置文件

include 选项允许系统管理员把分散到几个文件的转储信息,集中到一个主要的配置文件。

当 logrotate 从logrotate.conf 读到include 选项时,会从指定文件读入配置信息,就好像他们已经在/etc/logrotate.conf 中一样。

第18行 include /etc/logrotate.d 告诉 logrotate 读入存放在/etc/logrotate.d 目录中的日志转储参数,当系统中安装了RPM 软件包时,使用include 选项十分有用。RPM 软件包的日志转储参数一般存放在/etc/logrotate.d 目录,例如:/etc/logrotate.d/syslog、/etc/logrotate.d/firewalld、/etc/logrotate.d/mariadb

include 选项十分重要,一些应用把日志转储参数存放在 /etc/logrotate.d

典型的应用有:apache, linuxconf, samba, cron 以及syslog

这样,系统管理员只要管理一个 /etc/logrotate.conf 文件就可以了

 

4. 使用include 选项覆盖缺省配置

当 /etc/logrotate.conf 读入文件时,include 指定的文件中的转储参数将覆盖缺省的参数,如下例:

# linuxconf 的参数
/var/log/htmlaccess.log
{
   errors mimvp
   notifempty
   nocompress
   weekly
   prerotate
     /usr/bin/chattr -a /var/log/htmlaccess.log
   endscript
   postrotate
     /usr/bin/chattr +a /var/log/htmlaccess.log
   endscript
}
/var/log/netconf.log
{
   nocompress
   monthly
}

在这个例子中,当 /etc/logrotate.d/linuxconf 文件被读入时,下面的参数将覆盖/etc/logrotate.conf中缺省的参数

notifempty

errors mimvp

 

5. 为指定的文件配置转储参数

经常需要为指定文件配置参数,一个常见的例子就是每月转储/var/log/wtmp。为特定文件而使用的参数格式是:

# 注释

/full/path/to/file

{

option(s)

}

下面的例子就是每月转储 /var/log/wtmp 一次:

#Use logrotate to rotate wtmp
/var/log/wtmp
{
   monthly
   rotate 1
}

 

6. 其他需要注意的问题

a. 尽管花括号的开头可以和其他文本放在同一行上,但是结尾的花括号必须单独成行。

b. 使用 prerotate 和 postrotate 选项

下面的例子是典型的脚本 /etc/logrotate.d/syslog,这个脚本只是对 /var/log/messages 有效。

/var/log/messages
{ 
   prerotate
     /usr/bin/chattr -a /var/log/messages
   endscript
   postrotate
     /usr/bin/kill -HUP syslogd
     /usr/bin/chattr +a /var/log/messages
   endscript
}

第一行指定脚本对 /var/log messages 有效

prerotate 命令指定转储以前的动作

/usr/bin/chattr -a 去掉/var/log/messages文件的“只追加”属性

endscript 结束

postrotate 指定转储后的动作

/usr/bin/killall -HUP syslogd 用来重新初始化系统日志守护程序 syslogd

/usr/bin/chattr +a /var/log/messages 重新为 /var/log/messages 文件指定“只追加”属性,这样防治程序员或用户覆盖此文件。

最后的 endscript 用于结束 postrotate 部分的脚本

c. logrotate 的运行分为三步:

判断系统的日志文件,建立转储计划以及参数,通过cron daemon 运行下面的代码是 Red Hat Linux 缺省的crontab 来每天运行logrotate。

vim /etc/cron.daily/logrotate

d. /var/log/messages 不能产生的原因:

这种情况很少见,但是如果你把/etc/services 中的 514/UDP 端口关掉的话,这个文件就不能产生了。

 

7. cron 定时任务

cron 是一个可以用来根据时间、日期、月份、星期的组合来调度对重复任务的执行的守护进程。

cron 假定系统持续运行。如果当某任务被调度时系统不在运行,该任务就不会被执行。

要使用 cron 服务,你必须安装了 vixie-cron RPM 软件包,而且必须在运行 crond 服务。

要判定该软件包是否已安装,使用 rpm -q vixie-cron 命令。

要判定该服务是否在运行,使用 /sbin/service crond status 命令。

a. 配置 cron 任务

cron 的主配置文件是 /etc/crontab,它包括下面几行:

   SHELL=/bin/bash
   PATH=/sbin:/bin:/usr/sbin:/usr/bin
   MAILTO=root
   HOME=/

   # run-parts
   01 * * * * root run-parts /etc/cron.hourly
   02 4 * * * root run-parts /etc/cron.daily
   22 4 * * 0 root run-parts /etc/cron.weekly
   42 4 1 * * root run-parts /etc/cron.monthly

前四行是用来配置 cron 任务运行环境的变量。

SHELL 变量的值告诉系统要使用哪个 shell 环境(在这个例子里是 bash shell);

PATH 变量定义用来执行命令的路径。

cron 任务的输出被邮寄给 MAILTO 变量定义的用户名。如果 MAILTO 变量被定义为空白字符串(MAILTO=""),电子邮件就不会被寄出。

HOME 变量可以用来设置在执行命令或脚本时使用的主目录。

/etc/crontab 文件中的每一行都代表一项任务,它的格式是:

minute hour day month dayofweek command

minute — 分钟,从 0 到 59 之间的任何整数

hour — 小时,从 0 到 23 之间的任何整数

day — 日期,从 1 到 31 之间的任何整数(如果指定了月份,必须是该月份的有效日期)

month — 月份,从 1 到 12 之间的任何整数(或使用月份的英文简写如 jan、feb 等等)

dayofweek — 星期,从 0 到 7 之间的任何整数,这里的 0 或 7 代表星期日(或使用星期的英文简写如 sun、mon 等等)

command — 要执行的命令(命令可以是 ls /proc >> /tmp/proc 之类的命令,也可以是执行你自行编写的脚本的命令。)

在以上任何值中,星号(*)可以用来代表所有有效的值。譬如,月份值中的星号意味着在满足其它制约条件后每月都执行该命令。

整数间的短线(-)指定一个整数范围。譬如,1-4 意味着整数 1、2、3、4

用逗号(,)隔开的一系列值指定一个列表。譬如,3, 4, 6, 8 标明这四个指定的整数。

正斜线(/)可以用来指定间隔频率。在范围后加上 /<integer> 意味着在范围内可以跳过 integer。譬如,0-59/2 可以用来在分钟字段定义每两分钟。间隔频率值还可以和星号一起使用。例如,*/3 的值可以用在月份字段中表示每三个月运行一次任务。

开头为井号(#)的行是注释,不会被处理。

如你在 /etc/crontab 文件中所见,它使用 run-parts 脚本来执行 /etc/cron.hourly、/etc/cron.daily、/etc/cron.weekly 和 /etc/cron.monthly 目录中的脚本,这些脚本被相应地每小时、每日、每周、或每月执行。这些目录中的文件应该是 shell 脚本。

如果某 cron 任务需要根据调度来执行,而不是每小时、每日、每周、或每月地执行,它可以被添加到 /etc/cron.d 目录中。该目录中的所有文件使用和 /etc/crontab 中一样的语法。范例请参见下例。

   # record the memory usage of the system every monday 
   # at 3:30AM in the file /tmp/meminfo
   30 3 * * mon cat /proc/meminfo >> /tmp/meminfo
   # run custom script the first day of every month at 4:10AM
   10 4 1 * * /root/scripts/backup.sh

根用户以外的用户可以使用 crontab 工具来配置 cron 任务。所有用户定义的 crontab 都被保存在 /var/spool/cron 目录中,并使用创建它们的用户身份来执行。要以某用户身份创建一个 crontab 项目,登录为该用户,然后键入 crontab -e 命令,使用由 VISUAL 或 EDITOR 环境变量指定的编辑器来编辑该用户的 crontab。该文件使用的格式和 /etc/crontab 相同。当对 crontab 所做的改变被保存后,该 crontab 文件就会根据该用户名被保存,并写入文件 /var/spool/cron/username 中。

cron 守护进程每分钟都检查 /etc/crontab 文件、etc/cron.d/ 目录、以及 /var/spool/cron 目录中的改变。如果发现了改变,它们就会被载入内存。这样,当某个 crontab 文件改变后就不必重新启动守护进程了。

b. 控制对 cron 的使用

/etc/cron.allow 和 /etc/cron.deny 文件被用来限制对 cron 的使用。这两个使用控制文件的格式都是每行一个用户。两个文件都不允许空格。如果使用控制文件被修改了,cron 守护进程(crond)不必被重启。使用控制文件在每次用户添加或删除一项 cron 任务时都会被读取。

无论使用控制文件中的规定如何,根用户都总是可以使用 cron。

如果 cron.allow 文件存在,只有其中列出的用户才被允许使用 cron,并且 cron.deny 文件会被忽略。

如果 cron.allow 文件不存在,所有在 cron.deny 中列出的用户都被禁止使用 cron。

c. 启动和停止服务

要启动 cron 服务,使用 /sbin/service crond start 命令。

要停止该服务,使用 /sbin/service crond stop 命令。

推荐在引导时启动该服务:systemctl enable crond.service 

 

 

参考推荐

Nginx 日志轮询及压缩保存天数

Apache 日志分割轮询配置详解

Linux crond 不执行原因分析

Linux 定时运行命令脚本:crontab

CentOS 7 sytemctl 自定义服务开机启动

LNMP(CentOS+Nginx+Mysql+PHP)服务器环境配置