Logrotate是一个系统实用程序,用于管理日志文件的自动轮换和压缩。如果未对日志文件进行轮换,压缩和定期修剪,则最终可能会占用系统上的所有可用磁盘空间。
Logrotate默认安装在Ubuntu 16.04上,设置为处理所有已安装软件包的日志轮换需求,包括rsyslog
默认系统日志处理器。
在本文中,我们将探索默认的Logrotate配置,然后为虚构的自定义应用程序配置日志轮换。
本教程需要您有一个Ubuntu 16.04服务器,具有可以使用sudo命令的非root用户
Logrotate也可用于许多其他Linux发行版,但默认配置可能完全不同。只要您的Logrotate版本与Ubuntu 16.04类似,本教程的其他部分仍将适用。按照步骤1确定Logrotate版本。
以启用sudo
的用户身份登录服务器。
如果您使用的是非Ubuntu服务器,请首先通过询问其版本信息来确保安装Logrotate:
$ logrotate --version
logrotate 3.8.7
如果未安装Logrotate,则会出现错误。请使用Linux发行版的软件包管理器安装软件。
如果安装了Logrotate但版本号明显不同,则可能会遇到本教程中讨论的某些配置问题。通过阅读其man
页面,请参阅特定版本的Logrotate的文档:
$ man logrotate
接下来我们将看看Logrotate在Ubuntu上的默认配置结构。
Logrotate的配置信息一般可以在Ubuntu的两个地方找到:
/etc/logrotate.conf
:此文件包含一些默认设置,并为不属于任何系统软件包的几个日志设置轮换。它还使用include语句从/etc/logrotate.d目录中的任何文件中提取配置。/etc/logrotate.d/
:这是您安装的需要日志轮换帮助的任何软件包将放置其Logrotate配置的位置。在一个标准的安装下,你应该已经在这里所拥有的文件进行系统的基本工具,如apt
,dpkg
,rsyslog
等等。默认情况下,logrotate.conf
将配置每周日志轮换(weekly
),其中包含root用户和syslog组(su root syslog
)所拥有的日志文件,其中保留了四个日志文件(rotate 4
),并且在轮换当前文件后创建了新的空日志文件(create
) 。
我们来看看包中的Logrotate配置文件/etc/logrotate.d
:
$ cat /etc/logrotate.d/apt
/var/log/apt/term.log {
rotate 12
monthly
compress
missingok
notifempty
}
/var/log/apt/history.log {
rotate 12
monthly
compress
missingok
notifempty
}
此文件包含/var/log/apt/
目录中两个不同日志文件的配置块:term.log
和history.log
。他们都有相同的选择。未在这些配置块中设置的任何选项将继承默认值或设置的值/etc/logrotate.conf
。为apt日志设置的选项是:
rotate 12
:保留十二个旧日志文件。monthly
:每月轮换一次。compress
:压缩轮换的文件。默认使用gzip
,导致文件以.gz
。结尾。可以使用该compresscmd
选项更改压缩命令。missingok
:如果缺少日志文件,请不要写入错误消息。notifempty
:如果日志文件为空,请不要轮换日志文件。还有更多可用的配置选项。您可以通过在命令行上键入man logrotate
以查看Logrotate的手册页来阅读所有这些内容。
接下来,我们将设置一个配置文件来处理虚构服务的日志。
要管理预打包和预配置系统服务之外的应用程序的日志文件,我们有两个选择:
/etc/logrotate.d/
。这将作为root用户以及所有其他标准Logrotate
作业每天运行。hourly
配置/etc/logrotate.d/
是无效的,因为系统的Logrotate设置每天只运行一次),这才是真正必要的。让我们通过一些示例设置来介绍这两个选项。
/etc/logrotate.d/
我们要配置日志轮换为把一个虚构的Web服务器access.log
和error.log
到/var/log/example-app/
。它作为www-data
用户和组运行。
要添加一些配置到/etc/logrotate.d/
,先在那里打开一个新文件:
$ sudo nano /etc/logrotate.d/example-app
这是一个可以处理这些日志的示例配置文件:
/etc/logrotate.d/example-app
/var/log/example-app/*.log {
daily
missingok
rotate 14
compress
notifempty
create 0640 www-data www-data
sharedscripts
postrotate
systemctl reload example-app
endscript
}
此文件中的一些新配置指令是:
create 0640 www-data www-data
:这将在轮换后创建一个新的空日志文件,具有指定的permissions(0640
),owner(www-data
)和group(also www-data
)。sharedscripts
:此标志表示添加到配置的任何脚本每次运行仅运行一次,而不是每个轮换的文件。由于此配置将匹配example-app
目录中的两个日志文件,因此指定的脚本postrotate
将在没有此选项的情况下运行两次。postrotate
to endscript
:此块包含在日志文件轮换后运行的脚本。在这种情况下,我们正在重新加载我们的示例应用程序 有时需要将应用程序切换到新创建的日志文件。请注意,postrotate
压缩日志之前的运行。压缩可能需要很长时间,您的软件应立即切换到新的日志文件。对于需要在压缩日志后运行的任务,请改用lastaction
块。在自定义配置以满足您的需求并将其保存后/etc/logrotate.d
,您可以通过运行dry来测试它:
$ sudo logrotate /etc/logrotate.conf --debug
此调用将logrotate
其指向标准配置文件,并打开调试模式。
将打印出有关Logrotate正在处理哪些日志文件以及它们将对它们执行的操作的信息。如果一切顺利,你就完成了。标准Logrotate作业将每天运行一次并包含新配置。
接下来,我们将尝试完全不使用Ubuntu默认配置的设置。
在这个例子中,我们有一个应用程序作为我们的用户sammy在运行,生成存储在其中的日志/home/sammy/logs/
中。我们希望每小时轮换这些日志,因此我们需要在/etc/logrotate.d
Ubuntu提供的结构之外进行设置。
首先,我们将在主目录中创建配置文件。在文本编辑器中打开它:
$ nano /home/sammy/logrotate.conf
然后粘贴以下配置:
/home/sammy/logrotate.conf
/home/sammy/logs/*.log {
hourly
missingok
rotate 24
compress
create
}
保存并关闭文件。我们在之前的步骤中已经看到了所有这些选项,但让我们总结一下:此配置将每小时轮换文件,压缩并保留二十四个旧日志并创建一个新的日志文件来替换轮换的日志文件。
您需要自定义配置以适合您的应用程序,但这是一个良好的开端。
为了测试它的工作原理,让我们创建一个日志文件:
$ cd ~
$ mkdir logs
$ touch logs/access.log
现在我们在正确的位置有一个空白的日志文件,让我们运行logrotate命令。
因为日志是由sammy拥有的,所以我们不需要使用sudo命令。我们确实需要指定一个状态文件。此文件记录logrotate上次运行时所看到和执行的操作,以便它知道下次运行时要执行的操作。在使用Ubuntu Logrotate设置时可以为我们处理(可以在以下处找到/var/lib/logrotate/status
),但我们现在需要手动完成。
我们将Logrotate的状态文件放在我的主目录中,用于此示例。我可以去任何方便的地方:
logrotate /home/sammy/logrotate.conf --state /home/sammy/logrotate-state --verbose
reading config file /home/sammy/logrotate.conf
Handling 1 logs
rotating pattern: /home/sammy/logs/*.log hourly (24 rotations)
empty log files are rotated, old logs are removed
considering log /home/sammy/logs/access.log
log does not need rotating
--verbose将打印出有关Logrotate正在做什么的详细信息。在这种情况下,看起来它没有轮换任何东西。这是Logrotate第一次看到这个日志文件,所以据他所知,该文件是零小时,不应该轮换。
如果我们查看状态文件,我们会看到Logrotate记录了一些有关运行的信息:
$ cat /home/sammy/logrotate-state
logrotate state -- version 2
"/home/sammy/logs/access.log" 2017-11-7-19:0:0
Logrotate注意到它看到的日志以及它最后一次考虑它们的轮换时间。如果我们在一小时后运行相同的命令,日志将按预期轮换。
如果要强制Logrotate轮换日志文件,否则不要使用该--force标志:
$ logrotate /home/sammy/logrotate.conf --state /home/sammy/logrotate-state --verbose --force
这在测试postrotate和其他脚本时很有用。
最后,我们需要设置一个cron作业来每小时运行一次Logrotate。打开用户的crontab:
$ crontab -e
这将打开一个文本文件。文件中可能已经有一些注释解释了预期的基本语法。将光标向下移动到文件末尾的新空行并添加以下内容:
14 * * * * /usr/sbin/logrotate /home/sammy/logrotate.conf --state /home/sammy/logrotate-state
此任务将在每天每小时的第14分钟运行。它基本上运行logrotate我们之前运行的相同命令,尽管我们扩展logrotate到了/usr/sbin/logrotate
安全的完整路径。在编写cron作业时尽可能清晰点是一种好习惯。
保存文件并退出。这将安装crontab,我们的任务将按指定的时间表运行。
如果我们在大约一小时内重新访问我们的日志目录,我们应该找到轮换和压缩的日志文件access.log.1.gz
(或者.2.gz
,如果您使用的是--force
标志运行Logrotate )。
在本教程中,我们验证了Logrotate版本,探索了默认的Ubuntu Logrotate配置,并设置了两种不同类型的自定义配置。要了解有关Logrotate可用的命令行和配置选项的更多信息,可以通过在终端中运行man logrotate
来阅读其说明。欢迎访问腾讯云社区查看更多关于如何使用Logrotate管理日志文件和使用logrotate进行日志分割及滚动处理等等Logrotate使用教程。
参考文献:《How To Manage Logfiles with Logrotate on Ubuntu 16.04》
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。