前些天发现了一个巨牛的人工智能学习网站,通俗易懂,风趣幽默,忍不住分享一下给大家。点击跳转到网站。
简介
Logrotate 是一个系统实用工具,用于管理日志文件的自动轮转和压缩。如果日志文件不进行轮转、压缩和定期修剪,它们最终可能会占用系统上的所有可用磁盘空间。
Logrotate 默认安装在 Ubuntu 16.04 上,并设置为处理所有已安装软件包的日志轮转需求,包括 rsyslog
,默认的系统日志处理器。
在本文中,我们将探讨默认的 Logrotate 配置,然后为一个虚构的自定义应用程序配置日志轮转。
先决条件
本教程假设您有一个 Ubuntu 16.04 服务器,具有非根 sudo 启用用户,如《使用 Ubuntu 16.04 进行初始服务器设置》中所述。
Logrotate 也可用于许多其他 Linux 发行版,但默认配置可能会有很大不同。只要您的 Logrotate 版本类似于 Ubuntu 16.04 的版本,本教程的其他部分仍然适用。请按照第 1 步来确定您的 Logrotate 版本。
登录到服务器上作为您的 sudo 启用用户以开始。
确认您的 Logrotate 版本
如果您使用的是非 Ubuntu 服务器,请首先确保 Logrotate 已安装,方法是请求其版本信息:
logrotate --version
logrotate 3.8.7
如果 Logrotate 未安装,您将收到错误消息。请使用您的 Linux 发行版的软件包管理器安装该软件。
如果 Logrotate 已安装但版本号明显不同,您可能会在本教程中遇到一些配置问题。请参考您的特定版本的 Logrotate 文档,方法是阅读其 man
页面:
man logrotate
接下来,我们将查看 Ubuntu 上 Logrotate 的默认配置结构。
探索 Logrotate 配置
在 Ubuntu 上,Logrotate 的配置信息通常可以在两个地方找到:
/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
)。
让我们来看看 /etc/logrotate.d
中一个软件包的 Logrotate 配置文件。查看 apt
软件包工具的文件:
cat /etc/logrotate.d/apt
/var/log/apt/term.log {rotate 12monthlycompressmissingoknotifempty
}/var/log/apt/history.log {rotate 12monthlycompressmissingoknotifempty
}
该文件包含 /var/log/apt/
目录中两个不同日志文件 term.log
和 history.log
的配置块:它们都具有相同的选项。在这些配置块中未设置的选项将继承默认值或在 /etc/logrotate.conf
中设置的值。apt
日志设置的选项包括:
rotate 12
:保留十二个旧日志文件。monthly
:每月进行一次轮转。compress
:压缩轮转后的文件。默认情况下使用gzip
进行压缩,结果是文件以.gz
结尾。压缩命令可以使用compresscmd
选项进行更改。missingok
:如果日志文件丢失,则不生成错误消息。notifempty
:如果日志文件为空,则不进行轮转。
还有许多其他配置选项可用。您可以通过在命令行上键入 man logrotate
来阅读所有这些选项,以打开 Logrotate 的手册页面。
接下来,我们将设置一个配置文件来处理一个虚构服务的日志。
设置示例配置
要管理预打包和预配置的系统服务之外的应用程序的日志文件,我们有两个选项:
- 创建一个新的 Logrotate 配置文件,并将其放置在
/etc/logrotate.d/
中。这将作为 root 用户每天运行,以及所有其他标准的 Logrotate 作业。 - 创建一个新的配置文件,并在 Ubuntu 默认的 Logrotate 设置之外运行它。只有在需要以非 root 用户身份运行 Logrotate,或者如果您需要比每天更频繁地轮转日志(在
/etc/logrotate.d/
中的hourly
配置将无效,因为系统的 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
以下是一个可以处理这些日志的示例配置文件:
/var/log/example-app/*.log {dailymissingokrotate 14compressnotifemptycreate 0640 www-data www-datasharedscriptspostrotatesystemctl reload example-appendscript
}
此文件中的一些新配置指令包括:
create 0640 www-data www-data
:这将在轮转后创建一个具有指定权限(0640
)、所有者(www-data
)和组(也是www-data
)的新空日志文件。sharedscripts
:此标志意味着每个运行的脚本只运行一次,而不是对每个轮转的文件运行一次。由于此配置将匹配example-app
目录中的两个日志文件,如果没有此选项,postrotate
中指定的脚本将运行两次。postrotate
到endscript
:此块包含日志文件轮转后要运行的脚本。在这种情况下,我们正在重新加载我们的示例应用程序。这有时是必要的,以便您的应用程序切换到新创建的日志文件。
请注意,postrotate
在日志被压缩之前运行。压缩可能需要很长时间,您的软件应立即切换到新的日志文件。对于需要在日志被压缩后运行的任务,请改用lastaction
块。
在自定义配置以满足您的需求 并将其保存在 /etc/logrotate.d
中后,您可以通过执行干运行来测试它:
sudo logrotate /etc/logrotate.conf --debug
这将调用 logrotate
,指向标准配置文件,并打开调试模式。
将打印有关 Logrotate 处理的日志文件以及它们将要执行的操作的信息。如果一切正常,您就完成了。标准的 Logrotate 作业将每天运行一次,并包括您的新配置。
接下来,我们将尝试一个不使用 Ubuntu 默认配置的设置。
创建独立的 Logrotate 配置
在这个示例中,我们有一个作为我们的用户 sammy 运行的应用程序,生成的日志存储在 /home/sammy/logs/
中。我们希望每小时轮转这些日志,因此我们需要在 Ubuntu 提供的 /etc/logrotate.d
结构之外设置这个。
首先,我们将在我们的主目录中创建一个配置文件。在文本编辑器中打开它:
nano /home/sammy/logrotate.conf
然后粘贴以下配置:
/home/sammy/logs/*.log {hourlymissingokrotate 24compresscreate
}
保存并关闭文件。我们在之前的步骤中已经看到了所有这些选项,但让我们总结一下:此配置将每小时轮转文件,压缩并保留二十四个旧日志,并创建一个新的日志文件以替换轮转后的文件。
您需要根据您的应用程序自定义配置,但这是一个很好的开始。
为了测试它是否有效,让我们创建一个日志文件:
cd ~
mkdir logs
touch logs/access.log
现在我们在正确的位置有一个空白日志文件,让我们运行 logrotate
命令。
因为日志文件是由 sammy 拥有的,我们不需要使用 sudo
。但是我们确实需要指定一个 状态 文件。这个文件记录了上次运行 logrotate
时 logrotate
看到和执行的内容,以便它知道下次运行时该做什么。当使用 Ubuntu Logrotate 设置时,这是由系统自动处理的(可以在 /var/lib/logrotate/status
中找到),但现在我们需要手动处理。
我们将让 Logrotate 将状态文件放在我们的主目录中。我可以放在任何方便访问的地方:
logrotate /home/sammy/logrotate.conf --state /home/sammy/logrotate-state --verbose
读取配置文件 /home/sammy/logrotate.conf处理 1 个日志轮转模式:/home/sammy/logs/*.log 每小时(24 次轮转)
空日志文件被轮转,旧日志被删除
考虑日志 /home/sammy/logs/access.log日志不需要轮转
--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
这将打开一个文本文件。文件中可能已经有一些注释,解释了预期的基本语法。将光标移动到文件末尾的新空行,并添加以下内容:
[secondary_label crontab]
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
(如果您使用 --force
标志,则为 .2.gz
)。
结论
在本教程中,我们验证了我们的 Logrotate 版本,探索了默认的 Ubuntu Logrotate 配置,并设置了两种不同类型的自定义配置。要了解更多关于 Logrotate 的命令行和配置选项,您可以在终端中运行 man logrotate
来阅读其手册页面。