Ubuntu22.04系统日志太大,logrotate无法自动删除/分片

本文探讨了在Ubuntu22.04系统中,syslog日志文件过大时如何通过logrotate、cron和rsyslog的协同工作来自动分片和删除日志,以及如何配置它们以实现有效管理。
摘要由CSDN通过智能技术生成

Ubuntu22.04系统日志太大,无法自动删除/分片

这篇文章解决的问题:

  • syslog文件太大,没有被自动删除或分片,其他以此为例
  • logrotate没有自动触发
  • 有关logrotate的一些坑
  • logrotate、cron、rsyslog三者之间的协作关系

一、前提

在解决问题之前先来了解几个相关概念(可以跳过):

rsyslog

rsyslog 是一款用于系统日志处理的开源工具,具有模块化架构、强大的过滤和远程日志记录功能,支持 TCP 和 UDP,提供高性能的日志处理和灵活的输出插件。简单来说就是对系统运行过程中产生的日志文件进行分类、整理、传输等操作,生成一系列可读性较好的日志文件,默认放在/var/log中。深入了解可以看一下这篇文章:rsyslog日志服务详解

cron

cron 是一个定时任务调度工具,允许用户在预定的时间间隔内自动执行命令或脚本,通过 crontab 文件管理任务列表,能够按照规定的时间或频率来执行定时任务。深入了解可以看一下这篇文章:Linux Cron 定时任务 - 知乎 (zhihu.com)

logrotate

logrotate 是一个用于管理日志文件的工具,包括但不限于对系统生成的日志文件进行分片,定期轮转等,防止日志文件等占用过多存储空间。深入了解可以看一下这篇文章:linux logrotate 配置说明_logrotate配置文件详解

三者之间的关系

如下图所示:

image-20240127224241187

有了他们三者之间的概念之后接下来咱们步入正题。

二、解决办法

1. 配置logrotate

logrotate的配置分为两级:全局–>局部,全局配置也就是默认配置,如果不在局部配置中覆盖那么就会执行全局配置。查看默认配置文件cat /etc/logrotate.conf

# see "man logrotate" for details

# global options do not affect preceding include directives

# rotate log files weekly
weekly

# use the adm group by default, since this is the owning group
# of /var/log/syslog.
su root adm

# 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

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

# system-specific logs may also be configured here.

以下是上述每个配置指令含义的描述(以#开头的行表示注释):

weekly:表示日志轮换的频率。或者,您可以指定另一个时间间隔(hourly、daily、monthly或yearly)。由于该logrotate实用程序通常每天运行一次,因此如果旋转频率比daily所需的更短,您可能需要更改此配置。

su root adm:日志轮换是使用 root 用户和 admin 组执行的。通过使用此指令,您可以确保轮换的日志文件由特定用户和组拥有,这对于访问控制和权限管理非常有用。当日志文件需要由具有适当权限的特定用户或组访问或管理时,这一点尤其重要。

rotate 4:日志文件在删除旧文件之前会轮换四次。如果 rotate设置为零,则旧版本将立即删除并且不会轮换。如果设置为-1,则较旧的日志根本不会被删除,除非受 影响maxage。

create:轮换后立即创建一个与刚刚轮换的同名的新日志文件。

dateext:如果启用此选项,将通过在文件名中附加日期来重命名已轮换的日志文件,以便根据轮换日期更好地组织和区分日志文件(特别是当轮换频率为 或daily更高时)。旋转文件的默认方案是logname.1、logname.2等,但启用此选项会将其更改为logname.YYYYMMDD. dateformat您可以通过和指令更改日期格式 dateyesterday。

compress:此规则确定是否应压缩旧日志文件(默认使用 gzip)。日志压缩默认处于关闭状态,但您可以启用它以节省磁盘空间。

include:该指令用于包含其他配置文件或片段。它允许您通过将 Logrotate 配置拆分为多个文件来模块化和组织它。此时,该/etc/logrotate.d目录下的文件就已经包含在配置中了。

如前所述,该/etc/logrotate.conf文件充当 Logrotate 的全局配置文件,为整个系统的日志轮转提供默认设置和选项。它为日志轮换奠定了基础,但可以通过/etc/logrotate.d/ 目录中的配置文件进行扩展或覆盖,这些配置文件通常为特定应用程序日志配置轮换策略。

局部配置文件在/etc/lorotate.d/文件夹下面,如下所示:

image-20240128112901024

以rsyslog为例,其内容为:

/var/log/syslog
/var/log/mail.info
/var/log/mail.warn
/var/log/mail.err
/var/log/mail.log
/var/log/daemon.log
/var/log/kern.log
/var/log/auth.log
/var/log/user.log
/var/log/lpr.log
/var/log/cron.log
/var/log/debug
/var/log/messages
{
	rotate 4
	weekly
	missingok
	notifempty
	compress
	delaycompress
	sharedscripts
	postrotate
		/usr/lib/rsyslog/rsyslog-rotate
	endscript
}

上面的配置指定了位于目录/var/log/中的多个日志文件的轮换规则。除了我们在上一节中检查的指令之外,它还包括以下指令:

missingok:如果缺少任何指定的日志文件,则继续日志轮换而不报告任何错误。

notifempty:确保日志文件为空时不会轮换。如果日志文件为空,则不会触发轮换。

delaycompress:将轮换日志文件的压缩延迟到下一个轮换周期。这允许在压缩之前分析先前的日志文件。

sharedscript sprerotate:确保或指令中指定的命令或脚本 postrotate仅执行一次,无论轮换的日志文件数量如何。默认情况下,logrotate为每个正在轮换的日志文件单独执行命令/脚本。

postrotate endscript: 包含日志轮换后要执行的命令或脚本。在这种情况下,/usr/lib/rsyslog/rsyslog-rotate脚本在成功轮换后执行。它将SIGHUP信号发送到 Rsyslog 服务,以便它可以关闭并重新打开日志文件进行写入。

总体而言,此配置可确保指定的日志文件每周轮换、压缩并限制为最大4轮换日志文件数。它还包括用于处理丢失或空日志文件的附加指令,并执行特定于 Rsyslog 的后轮换脚本。

其他需要注意的有用指令包括:

size:指定日志文件在启动轮换之前可以达到的最大大小(以字节、千字节、兆字节或千兆字节为单位)。如果在size指令之后指定了hourly等周期指令 ,这会导致默认计划被忽略周期。

minsize:日志文件按照指定的时间表轮换,但不会在达到指定的大小之前轮换。因此,当minsize使用 时,会同时考虑文件大小和时间戳来确定是否应轮换文件。

maxsize:指定一旦日志文件超过规定的文件大小,即使尚未达到时间间隔,也会轮换日志文件。

Logrotate 提供了两个指令来指定如何处理日志轮换:createcopytruncate。前者是默认值,其工作原理是将日志文件重命名为*.log.1,然后创建新 *.log文件以继续记录日志。

copytruncate模式下,*.log文件被复制到新的*.log.1 文件,然后清空(截断)原始文件,允许应用程序继续写入它,就像它是一个新文件一样。如果您的应用程序或进程无法通过在轮换后自动切换到新日志文件来优雅地处理日志文件轮换,则此模式非常有用。

其他详细的配置可以查看这篇博客:A Complete Guide to Managing Log Files with Logrotate

2. logrotate配置测试

使用sudo logrotate -vf /etc/logrotate.d/rsyslog命令执行默认的配置文件,可能会报下面的错误:

...
empty log files are not rotated, old logs are removed
considering log /var/log/syslog
error: skipping "/var/log/syslog" because parent directory has insecure permissions (It's world writable or writable by group which is not "root") Set "su" directive in config file to tell logrotate which user/group should be used for rotation.
...

修改默认配置文件为:

/var/log/syslog
{
	size 2k    # 我们暂时设置为2k来测试能否自动触发
    su root adm
    rotate 2
    missingok
    notifempty
    delaycompress
    compress
    copytruncate
    sharedscripts
    postrotate
    	/usr/lib/rsyslog/rsyslog-rotate
	endscript
}
	
/var/log/mail.info
/var/log/mail.warn
/var/log/mail.err
/var/log/mail.log
/var/log/daemon.log
/var/log/kern.log
/var/log/auth.log
/var/log/user.log
/var/log/lpr.log
/var/log/cron.log
/var/log/debug
/var/log/messages
{
	rotate 4
	maxsize 20000k 
	weekly
	su root adm
	missingok
	notifempty
	compress
	delaycompress
	sharedscripts
	postrotate
		/usr/lib/rsyslog/rsyslog-rotate
	endscript
}

这里我们将检测方式设置为根据文件大小进行分片,如果想要按照周期比如hourly等,也可以在这里修改。建议自动触发测试通过之后再修改。

使用命令sudo logrotate -vf /etc/logrotate.d/rsyslog对刚配置好的文件进行测试,结果如下:

reading config file /etc/logrotate.d/rsyslog
Reading state from file: /var/lib/logrotate/status

...

considering log /var/log/syslog
  Now: 2024-01-28 15:46
  Last rotated at 2024-01-28 15:43
  log needs rotating
rotating log /var/log/syslog, log->rotateCount is 2
dateext suffix '-20240128'
glob pattern '-[0-9][0-9][0-9][0-9][0-9][0-9][0-9][0-9]'
compressing log with: /bin/gzip
switching uid to 0 and gid to 4 permanently (pid 7498)
renaming /var/log/syslog.2.gz to /var/log/syslog.3.gz (rotatecount 2, logstart 1, i 2), 
old log /var/log/syslog.2.gz does not exist
renaming /var/log/syslog.1.gz to /var/log/syslog.2.gz (rotatecount 2, logstart 1, i 1), 
renaming /var/log/syslog.0.gz to /var/log/syslog.1.gz (rotatecount 2, logstart 1, i 0), 
old log /var/log/syslog.0.gz does not exist
log /var/log/syslog.3.gz doesn't exist -- won't try to dispose of it
copying /var/log/syslog to /var/log/syslog.1
truncating /var/log/syslog
running postrotate script
switching euid from 0 to 0 and egid from 4 to 0 (pid 7499)
switching euid from 0 to 0 and egid from 4 to 0 (pid 7497)

...

switching euid from 0 to 0 and egid from 4 to 0 (pid 7502)
switching euid from 0 to 0 and egid from 4 to 0 (pid 7497)

测试结果没有错误,说明配置正确。我们再看一看日志的变化:

分片前:

...
drwx------   2 speech-dispatcher root            4.0K  5月 23  2023 speech-dispatcher/
-rw-r-----   1 syslog            adm             1.1M  1月 28 15:43 syslog
-rw-r--r--   1 root              root               0  8月  8 06:53 ubuntu-advantage.log
...

分片后:

...
drwx------   2 speech-dispatcher root            4.0K  5月 23  2023 speech-dispatcher/
-rw-r-----   1 syslog            adm              281  1月 28 15:44 syslog
-rw-r-----   1 syslog            adm             1.1M  1月 28 15:43 syslog.1
-rw-r--r--   1 root              root               0  8月  8 06:53 ubuntu-advantage.log
...

可以发现成功分出了syslog.1文件。多执行几次之后可以发现syslog.*文件最多有4个,与我们配置文件中设置的是一样的,到这里logrotate部分就配置好了。

3. cron配置

我们先查看crontab中的内容cat /etc/crontab:

17 *	* * *	root    cd / && run-parts --report /etc/cron.hourly
25 6	* * *	root	test -x /usr/sbin/anacron || ( cd / && run-parts --report /etc/cron.daily )
47 6	* * 7	root	test -x /usr/sbin/anacron || ( cd / && run-parts --report /etc/cron.weekly )
52 6	1 * *	root	test -x /usr/sbin/anacron || ( cd / && run-parts --report /etc/cron.monthly )

cron服务启动之后会每分钟查询一次/etc/crontab文件和/etc/crontab.d/目录下的所有文件,按照其中的规则去执行相应的命令,如果用户使用cron -e命令创建了新的规则,cron也会去运行用户定义的触发任务。

3.1 按大小分片

如果我们在logrotate的配置中使用了如size 2k这样的规则,那么周期规则如daily等就会被覆盖,因此我们需要自己写一个触发任务,如下所示:

sudo crontab -e  # 我们将触发任务写到root用户的crontab

添加一条触发任务:

*/1 * * * * /usr/sbin/logrotate /etc/logrotate.conf  # 这里我们暂时设置为1分钟,

设置完毕,现在就可以用ll -h /var/log查看日志的变化情况了,看到分片成功那么再去修改合适的size以及触发时间。

3.2 按周期分片

如果在logrotate配置文件中用的是maxsize/minsize 搭配hourly/daily等,不需要再额外设置触发任务。

  • 31
    点赞
  • 23
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值