linux logrotate 配置说明

Logrotate是一个用于日志管理的工具,用于日志切割、删除旧日志并创建新日志,节省磁盘空间。配置文件包括默认配置/etc/logrotate.conf和自定义配置/etc/logrotate.d/*.conf。参数如daily/weekly/monthly/yearly定义切割周期,rotate和maxage控制保留的日志文件数,create和copytruncate处理日志文件创建。dateformat和dateext用于定制日志文件名的日期格式。测试logrotate可使用debug、verbose和force模式。默认运行时间由cron控制,可通过crontab自定义定时。示例配置展示了不同场景下的logrotate应用,如nginx日志管理。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

1、logrotate介绍

logrotate软件是一个日志管理工具,用于 切割日志,删除旧的日志文件,并创建新的日志文件,起到“转储作用”,可以为系统节省磁盘空间。一般centos系统已经自带安装好了。

logrotate是基于 crontab 运行的,运行时,logrotate 会调用配置文件 /etc/logrotate.conf 。可以在 /etc/logrotate.d 目录里放置自定义好的配置文件,用来覆盖 logrotate.conf 的缺省值。

logrotate 版本查看

root@test 10:14:51:/usr# logrotate --version
logrotate 3.11.0

2、配置logrotate

2.1、配置方式

默认执行脚本: /usr/sbin/logrotate
默认配置文件: /etc/logrotate.conf
自定义配置目录: /etc/logrotate.d/*.conf

/etc/logrotate.conf 通过 include 指令,会引入 /etc/logrotate.d 目录下的自定义的配置文件。

修改配置文件后,并不需要重启服务。 由于 /usr/sbin/logrotate 实际上只是一个可执行文件,不是以 daemon 运行。

默认配置文件: /etc/logrotate.conf ,内容如下:

[root@root /opt]# cat /etc/logrotate.conf

weekly       #  默认每周执行一次日志轮询

rotate 4     #  默认保留4个日志文件

create       # 自动创建新的日志文件,新的文件和原来的文件具有相同的权限

dateext      #  日志切割后,文件以当前日志为结尾,例如:messages-20181125

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

include /etc/logrotate.d     # 将/etc/logrotate.d目录中的配置文件加载进来

/var/log/wtmp {           # 针对wtmp日志的配置参数
    monthly                # 每月切割一次
    create 0664 root utmp  # 新建日志的权限为0644,用户为root,组为utmp
    minsize 1M             # 文件大小超过1M后才会切割
    rotate 1               # 只保留1个日志文件
}

/var/log/btmp {
    missingok
    monthly
    create 0600 root utmp    #新建日志的权限为0644,属主为root,属组为utmp
    rotate 1
}

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

/etc/logrotate.d/ 目录,通常一些第三方软件包的配置, 如 yum,zabbix-agent,syslog,nginx 等。

下面是 yum 的配置内容:

[root@root logrotate.d]# cat yum
/var/log/yum.log {
    missingok
    notifempty
    size 30k
    yearly
    create 0600 root root
}

3、logrotate 参数

参数说明
daily
weekly
monthly
yearly
切割周期,多久切割一次。
daily : 切割周期为 每天
weekly : 切割周期为 每周
monthly : 切割周期为 每月
yearly: 切割周期为 每年
size size当日志文件到达指定的大小时才转储。
默认单位是 bytes。bytes (缺省) 及 KB (sizek) 或 MB (sizem)
如: size 30k、 size 50M
rotate count日志文件保留备份的个数。默认是 0
如:0 指没有备份;5 指保留最近的5个备份,其余的全部删除。
maxage count保留多少天的日志文件。
如:5 指保留最近的5天的日志文件,其余的全部删除。
如果 日志文件按天转储,则 rotatemaxage 基本上是一样的。
tabooext [+] list让 logrotate 不转储指定扩展名的文件,缺省的扩展名是:.rpm-orig, .rpmsave, v, 和~
missingokmissing ok ,在日志轮循期间,错误将被忽略。
例如 “文件无法找到” 之类的错误。
copytruncate
nocopytruncate
copytruncate: 用于还在打开中的日志文件,把当前日志备份并截断。 把正在输出的日志拷 (copy) 一份出来,再清空 (trucate) 原来的日志。
nocopytruncate: 备份日志文件,但是不截断 。
create mode owner group
nocreate
create mode owner group:转储文件,使用指定的文件模式创建新的日志文件。
nocreate: 不建立新的日志文件。
如: create 644 root root
以指定的权限创建全新的日志文件,同时 logrotate 也会重命名原始日志文件。
nocompress
compress
nocompress: 不压缩(默认)
compress: 通过 gzip 压缩转储以后的日志。如 XXX.gz
delaycompress
nodelaycompress
delaycompress: 和 compress 一起使用时,转储的日志文件到下一次转储时才压缩。
nodelaycompress: 覆盖 delaycompress 选项,转储同时压缩。
prerotate
endscript
在所有其它指令完成 执行。这两个关键字必须单独成行
postrotate
endscript
在所有其它指令完成 执行。这两个关键字必须单独成行
sharedscripts共享脚本,整个日志组运行一次脚本 。
比如 nginx 涉及到多个日志文件,一般使用 * 号 通配符:/var/log/nginx/*.log { ... }
sharedscripts 的作用是在 所有的日志文件 都轮转完毕后 统一执行一次脚本
如果没有 sharedscripts ,那么 每个日志文件 轮转完毕后 都会执行一次脚本
errors address转储时的错误信息发送到指定的 Email 地址。
mail address
nomail
mail address : 把转储的日志文件发送到指定的 E-mail 地址
nomail : (默认)转储时不发送日志文件
ifempty
notifempty
ifempty :if empty ,即使是空文件也转储(默认)。
notifempty :not if empty ,如果是空文件的话,不转储。
olddir directory
noolddir
olddir directory :储后的日志文件放入指定的目录,必须和当前日志文件在同一个文件系统。
noolddir : 转储后的日志文件和当前日志文件放在同一个目录下。
dateext在日志名称后面,添加日期后缀。默认是当前日期。默认是 -%Y%m%d 的后缀。
可用 dateformat 选项扩展配置。
如:nginx_access.log --> nginx_access.log-20210120
注意: 格式化日期中不要出现 分号(:) ,因为文件名称是不能含有分号的。
dateformatdateext 的拓展,必须配合 dateext 使用
在V3.9.0 之前,只支持 %Y%m%d%s 参数。
%s 不是秒,是时间戳,也者 随机数,具体我没有验证。
在V3.9.0 及之后,支持 %H 参数。
如: dateformat -%Y-%m-%d
结果:nginx_access.log --> nginx_access.log-2021-01-20
注意: 文件名称中禁止出现分号(:) ,因为文件名称是不能含有分号的。
dateyesterdaydateext 配合使用,日期提前一天。
比如,当前日期是2021-01-20,提前一天就是 2021-01-19
extensiondateextdateformat 配合使用,指定文件的后缀。
如:extension .log
结果:nginx_access.log --> nginx_access-2021-01-20.log
说明:nginx_access.log , 文件名是nginx_access,后缀是.log, 文件名 + -%Y-%m-%d 格式的日期 + .log 后缀,结果是 nginx_access-2021-01-20.log

问题1:rotate 和 maxage 的区别?

它们都是用来控制保存多少日志文件的,区别在于rotate是以个数为单位的,而maxage是以天数为单位的。如果我们是以按天来轮转日志,那么二者的差别就不大了。

问题2:create 和 copytruncate 的区别。

create 和 copytruncate 都是 创建日志文件,但是差别挺大的。

1)create(创建文件):

这也就是默认的方案,可以通过 create 命令配置文件的权限和属组设置;这个方案的思路是 重命名原日志文件,创建新的日志文件。

详细步骤如下:

  • 重命名正在输出日志文件,因为重命名只修改目录以及文件的名称,而进程操作文件使用的是 inode,所以并不影响原程序继续输出日志。

  • 创建新的日志文件,文件名和原日志文件一样,注意,此时只是文件名称一样,而 inode 编号不同,原程序输出的日志还是往原日志文件输出。

  • 最后通过某些方式通知程序,重新打开日志文件;由于重新打开日志文件会用到文件路径而非 inode 编号,所以打开的是新的日志文件。

这也就是 logrotate 的默认操作方式,也就是 mv+create 执行完之后,通知应用重新在新文件写入即可。mv+create 成本都比较低,几乎是原子操作,如果应用支持重新打开日志文件,如 syslog, nginx, mysql 等,那么这是最好的方式。

不过,有些程序并不支持这种方式,压根没有提供重新打开日志的接口;而如果重启应用程序,必然会降低可用性,为此引入了 copytruncate 方式。

2)copytruncate(复制、清空):

该方案是把正在输出的日志拷 (copy) 一份出来,再清空 (trucate) 原来的日志。
详细步骤如下:

  • 将当前正在输出的日志文件复制为目标文件,此时程序仍然将日志输出到原来文件中,此时,原文件名也没有变。
  • 清空日志文件,原程序仍然还是输出到预案日志文件中,因为清空文件只把文件的内容删除了,而 inode 并没改变,后续日志的输出仍然写入该文件中。

如上所述,对于 copytruncate 也就是先复制一份文件,然后清空原有文件。
通常来说,清空操作比较快,但是如果日志文件太大,那么复制就会比较耗时,从而可能导致部分日志丢失。不过这种方式不需要应用程序的支持即可。

4、dateformat 配置示例

4.1、示列1

production.log 转储后的名称是 production.2016-07-10.log

dateext
dateformat %Y-%m-%d.  # 修改了默认日期后缀,注意后面有一个点(.)

/var/test/production.log
{
		#  www-usr 是用户 ,www-grup 是所属组
        create 755 www-usr  www-grup
        extension log   # 后缀为log
}

说明,对于 nginx_access.log ,如果 后缀是 log ,则 文件名是 nginx_access.
新文件是由 文件名 + %Y-%m-%d. 格式的日期 + log 后缀组成的,结果是 nginx_access.2021-01-20.log

4.2、示列2

production.log 转储后的名称是production-2016-07-10.log

dateext
dateformat -%Y-%m-%d

/var/www/redmine/log/production.log
{
	extension .log
}

说明:对于 nginx_access.log ,如果 后缀是 .log ,则 文件名是 nginx_access
新文件是由 文件名 + -%Y-%m-%d 格式的日期 + .log 后缀 组成的,结果是 nginx_access-2021-01-20.log

4.3、nginx 完整示例

[root@root ~]# cat /etc/logrotate.d/nginx 
  /var/log/nginx/*.log {       # 日志文件的路径
        daily                   # 每天进行日志分割
        dateext                 # 日志切割后,文件以当前日志为结尾,例如:access-logs-20181125
        missingok               # 日志不存在分析,分析下一个
        rotate 30               # 日志保留30份 
        compress                # 转存之后压缩.tar.gz
        delaycompress           # 日志压缩会被延后到下次分割时进行
        notifempty              # 空文件不转储
        create 644 nginx nginx  # 新日志文件权限
        sharedscripts           # 整个日志组运行一次脚本
        postrotate
            [ -f /var/run/nginx.pid ] && kill -USR1 `cat /var/run/nginx.pid`  # 重启nginx,重新加载日志文件,防止日志无法写入新文件 
        endscript              # 结束脚本
  }

5、测试和运行 logrotate

具体 logrotate 命令格式如下:

logrotate [OPTION...] <configfile>
-d, --debug :debug 模式,测试配置文件是否有错误。
-f, --force :强制转储文件。
-m, --mail=command :压缩日志后,发送日志到指定邮箱。
-s, --state=statefile :使用指定的状态文件。
-v, --verbose :显示转储过程。

5.1、debug 模式:

并不会真正进行 rotate 或者 compress 操作,但是会打印出整个执行的流程,和调用的脚本等详细信息。

logrotate -d <configfile>

示例:

myTest_rotate 的配置内容:

## 测试专用
/var/tmp/logtest/myTest.log {    
	size 2k
	rotate 10
    notifempty	
	dateext
	dateformat -%Y-%m-%d.
    create 644 root root
	extension log
}

运行:

[root@root local]# logrotate -d  /var/tmp/logtest/myTest_rotate 
reading config file /var/tmp/logtest/myTest_rotate
extension is now log
Allocating hash table for state file, size 15360 B

Handling 1 logs

rotating pattern: /var/tmp/logtest/myTest.log  2048 bytes (10 rotations)
empty log files are not rotated, old logs are removed
considering log /var/tmp/logtest/myTest.log
  log needs rotating
rotating log /var/tmp/logtest/myTest.log, log->rotateCount is 10
Converted ' -%Y-%m-%d.' -> '-%Y-%m-%d.'
dateext suffix '-2022-01-04.'
glob pattern '-[0-9][0-9][0-9][0-9]-[0-9][0-9]-[0-9][0-9].'
glob finding old rotated logs failed
renaming /var/tmp/logtest/myTest.log to /var/tmp/logtest/myTest.-2022-01-04.log
creating new /var/tmp/logtest/myTest.log mode = 0644 uid = 0 gid = 0

5.2、verbose 模式

会真正执行操作,打印出详细信息。

logrotate -v <configfile>

5.3、force 强制执行

如果时间不符合要求,logrotate 也不会真正执行时,如果想要立即执行,查看结果,就使用到了 强制执行模式。

logrotate -f <configfile>

示例:

logrotate -f  /var/tmp/logtest/myTest_rotate 

6、logrotate 默认运行时间

logrotate 是基于cron 运行的,所以这个时间是由 cron 控制的,具体可以查询 cron 的配置文件/etc/crontab

旧版CentOS 的cron 的配置文件是 /etc/crontab ,新版CentOS 改为 /etc/anacrontab

[root@root ~]# cat /etc/anacrontab         #生效时间是在凌晨3点到22点之间,而且随机延迟时间是45分钟
  # /etc/anacrontab: configuration file for anacron

  # See anacron(8) and anacrontab(5) for details.

  SHELL=/bin/sh
  PATH=/sbin:/bin:/usr/sbin:/usr/bin
  MAILTO=root
  # 添加到作业基本延迟的最大随机延迟
  RANDOM_DELAY=45
  
  # the jobs will be started during the following hours only
  START_HOURS_RANGE=3-22

  #period in days   delay in minutes   job-identifier   command
  1    5    cron.daily        nice run-parts /etc/cron.daily
  7    25    cron.weekly        nice run-parts /etc/cron.weekly
  @monthly 45    cron.monthly        nice run-parts /etc/cron.monthly

从上面的内容可以看出:

  • 如果机器 没有关机,默认 logrotate(配置文件里设置的是cron.daily)一般会在每天的3点05分到3点50分之间执行, 真实的延迟时间是 RANDOM_DELAY + delay in minutes。
  • 如果在3-22 这个时间段内服务器处于 关机状态,则 logrotate 会在机器开机5分钟后执行分割日志的操作。

注意:

不建议直接修改此文件,如果想按照 logrotate 默认时间的执行,可通过 crontab 执行自定义的 logrotate 配置文件。

但是,这时就不能将自定义的配置文件放置在 /etc/logrotat.d/ 目录下,应该放置另外的路径,否则就会执行两遍日志分割的操作,执行时间分别是在crontab中定义的时间 和 anacrontab 默认的执行时间,即 3:05-3:50。

7、crontab 定时

logrotate 执行切割的时间有一定的随机性,如果对时间要求特别严格,则推荐使用 crontab 来定时执行 logrotate 文件。

具体实现方法:

1、在 非 /etc/logrotate.d/ 下创建目录,存放 logrotate 配置文件。
例如,在 /etc 目录下创建 logrotate_mytime 目录, 然后 ,将 nginx 的 logrotate 的配置文件 nginx_rotate,放到 /etc/logrotate_mytime 目录下。

2、 添加 crontab 计划任务

在 root 用户下,执行 crontab -e 进入 vim 模式,进行编辑。

[root@root local]# crontab -e

#每天 23点59分进行日志切割
59 23 * * * /usr/sbin/logrotate -f /etc/logrotate_mytime/nginx_rotate

也有简单方式,如下:

sudo echo "59 23 * * * /usr/sbin/logrotate -f /etc/logrotate_mytime/nginx_rotate" > /etc/crontab

如果用非root用户则会报错error: error creating output file /var/lib/logrotate/logrotate.status.tmp: 权限不够

说明:
如果 crontab 中定义的执行时间是0点整,建议在 nginx_rotate 里添加上 dateyesterday 选项,因为,日志内容记录的是昨天的,日志名称却是今天的,容易引起歧起。

如果 crontab 中定义的执行时间是23点59分,则不用添加 dateyesterday 选项,因为名称和内容都是当天的,是一致的。

格式:分     
取值:59 23 *  *  *
含义:每天的2359分执行

格式:分     
取值:0  0  *  *  *
含义:每天的00分执行

按每周几执行:
每周:周日 1 2 3 4 5 6
取值: 0    1   2  3   4   5  6
示例:
     
0  1  *  *  3(每周三执行,此处填3;每周日,则填0;每周六,则填6

3、 重启crontab

# centos6: 
service crond restart

# centos7: 
systemctl restart crond 

7.1、crontab 常用命令

查看所有的定时任务

[root@root local]# crontab -l
.....(省略)
59 23 * * * /usr/sbin/logrotate -f /etc/logrotate_mytime/nginx_rotate
.....(省略)

编辑定时任务

[root@root local]# crontab -e   # 进入vim 模式
.....(省略)
59 23 * * * /usr/sbin/logrotate -f /etc/logrotate_mytime/nginx_rotate
.....(省略)

8、常见应用的 logrotate 配置

1)nginx

配置文件1:

/var/log/nginx/*.log {   # 可以指定多个路径
    daily                      # 日志轮询周期,weekly,monthly,yearly
    rotate 30                  # 保存30天数据,超过的则删除
    size 100M                 # 超过100M时分割,单位K,M,G,优先级高于daily
    
    compress                   # 切割后压缩,也可以为nocompress
    delaycompress              # 切割时对上次的日志文件进行压缩
    
    dateext                    # 日志文件切割时添加日期后缀
    dateformat -%Y-%m-%d
    
    missingok                  # 如果没有日志文件也不报错
    notifempty                 # 日志为空时不进行切换,默认为ifempty
    create 640 nginx nginx     # 使用该模式创建日志文件
    
    sharedscripts              # 所有的文件切割之后只执行一次下面脚本
    postrotate
        if [ -f /run/nginx.pid ]; then
            kill -USR1 `cat /run/nginx.pid`
        fi
    endscript
}

配置文件2:

/var/log/nginx/*.log {
	daily
	rotate 30
	missingok
    notifempty
    
	olddir nginx_archive
	
	dateext
	dateformat -%Y-%m-%d
	dateyesterday
	
    copytruncate		
}

配置文件1与配置文件2的最大区别是日志文件是创建方式,一个是 create,另一个是 copytruncate。

转载:

https://www.cnblogs.com/uglyliu/p/13206868.html
https://www.jianshu.com/p/ec7f1626a3d3
https://blog.csdn.net/liuxiao723846/article/details/100120058

<think>好的,我现在需要回答用户关于Linuxlogrotate配置文件/etc/logrotate.d/的详细说明的问题。首先,我需要回忆logrotate的基本知识,并确认用户的需求。用户已经询问过相关配置,现在需要更详细的解释,特别是/etc/logrotate.d/目录下的配置项。 首先,我应该先整理logrotate的整体结构。根据之前提供的引用内容,logrotate的主配置文件是/etc/logrotate.conf,而/etc/logrotate.d/目录用于存放自定义配置,这些配置会覆盖主文件的默认设置。用户提到的优先级问题在引用4中提到,/etc/logrotate.d中的配置优先级更高,所以需要强调这一点。 接下来,我需要列举常见的配置项,比如rotate、daily/weekly/monthly、compress、delaycompress、missingok、notifempty、create/postrotate/endscript等。每个配置项需要解释其作用、默认值以及示例。例如,引用3提到主配置中的weekly是默认的,但如果/etc/logrotate.d中的文件设置为daily,则以daily为准,这需要特别说明。 然后,用户可能需要了解如何编写自定义配置文件,比如日志文件路径、配置参数和脚本部分。例如,引用1和引用2提到在/etc/logrotate.d下放置自定义文件,覆盖默认值,所以需要说明配置文件的格式和语法。 还需要注意权限和运行机制,比如logrotate由crond服务定时运行,通常放在/etc/cron.daily/里,如引用2所述。用户可能想知道如何测试配置是否正确,可以使用logrotate -d或-f选项进行调试,这部分需要补充进去。 此外,要确保回答结构清晰,分点说明,比如配置目录作用、常见配置项、编写示例、优先级说明、调试方法等。同时,根据用户之前的引用,可能需要引用正确的来源,比如引用4中的优先级问题,引用3中的默认配置。 最后,生成相关问题,帮助用户深入理解,比如如何覆盖默认设置,如何设置压缩,如何处理日志切割后的权限问题等。确保所有数学表达式用$...$格式,如果有的话,但这个问题可能不涉及数学公式,所以可能不需要处理这部分。</think>### Linux logrotate配置文件/etc/logrotate.d/详解 #### 1. 配置目录作用 /etc/logrotate.d/目录用于存储应用程序专用的日志轮转配置,每个文件对应一个服务或应用。此目录下的配置会覆盖主配置文件/etc/logrotate.conf的默认设置[^1][^4]。 #### 2. 常见配置说明 以下为典型配置参数(以Nginx日志配置为例): ```conf /var/log/nginx/*.log { daily rotate 7 missingok compress delaycompress notifempty create 0640 www-data adm sharedscripts postrotate /usr/bin/systemctl reload nginx endscript } ``` | **配置项** | **说明** | |------------------|-------------------------------------------------------------------------| | `daily/weekly/monthly` | 轮转周期(默认以/etc/logrotate.conf中的`weekly`为基准,此处可覆盖)[^3][^4] | | `rotate N` | 保留N个历史日志文件(默认0) | | `compress` | 使用gzip压缩历史日志(默认启用) | | `delaycompress` | 延迟压缩:仅压缩前一个周期的日志 | | `missingok` | 日志文件不存在时不报错 | | `notifempty` | 空日志文件不执行轮转 | | `create MODE OWNER GROUP` | 新日志文件的权限/属主(如`create 0640 www-data adm`) | | `postrotate/endscript` | 轮转后执行的脚本(常用于服务重载) | #### 3. 优先级说明 当出现配置冲突时,遵循以下规则: - `/etc/logrotate.d/`内的配置 > `/etc/logrotate.conf`的默认值 - 同一目录下按文件名顺序加载(字母序) #### 4. 调试与验证方法 ```bash # 手动执行测试(-d: 调试模式) logrotate -d /etc/logrotate.d/nginx # 强制执行轮转(-f: 强制模式) logrotate -vf /etc/logrotate.d/nginx ``` #### 5. 关键注意事项 1. **服务重载**:通过`postrotate`脚本通知应用程序重新打开日志文件(如Nginx需执行`nginx -s reopen`) 2. **定时任务**:实际由`/etc/cron.daily/logrotate`触发,依赖crond服务[^2] 3. **空间监控**:建议结合`size`参数(如`size 100M`)防止日志膨胀 ---
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值