如何使用 Logrotate 在 Linux 中旋转和压缩日志文件

[ad_1]

在 Linux 系统和几乎所有系统中,日志文件在检查和排除错误时至关重要。 它们提供了关于各种系统服务在失败之前可能出现什么问题的重要线索。

安装在 Linux 系统上的任何服务,例如 Apache Web 服务器或 MySQL 数据库服务器生成的日志文件通常存储在 /var/日志 目录。 如果你检查这个目录的内容,你会看到类似于我们下面的内容:

随着时间的推移,随着更多信息的记录,日志文件的大小会增加并占用更多的硬盘空间。 甚至在您意识到之前,日志文件的大小就会膨胀,占用您的大部分硬盘空间,如果您不小心,很容易耗尽磁盘空间。

考虑到这一点,将日志文件保持在可管理的大小并删除占用宝贵磁盘空间的旧日志条目就变得谨慎了。 这就是日志轮换的用武之地。

什么是日志轮换?

日志轮换 是一个创建新日志文件和存档并删除旧日志文件以节省磁盘空间的过程。 该过程重命名当前日志文件。 例如, 申请日志 变成 报告.log.1 和一个新的 申请日志 创建日志文件以记录新的日志条目。 较旧的日志文件通常被压缩并显示为 apport.log.2.gz, apport.log.3.gz, apport.log.4.gz, 等等。

使用名为的实用程序促进日志轮换过程 对数旋转. 这是一个工具,可促进日志文件的轮换以及旧文件的存档和删除以释放磁盘空间。 总之,logrotate 完成了以下工作:

  • 轮换旧日志文件后创建新日志文件。
  • 旧日志文件的存档。
  • 清除已轮换的旧日志文件以节省空间。

当日志文件的大小增长并超过一定限制时,通常会激活日志轮换。

logrotate 实用程序的工作原理

在我们检查 logrotate 实用程序的工作原理之前,请确保您的系统上安装了 logrotate。 为此,请发出以下命令:

对于 Debian / Ubuntu 系统:

$ sudo apt-get install logrotate -y

CentOS / RHEL / Fedora 系统:

$ sudo yum install logrotate -y
or 
$ sudo dnf  install logrotate -y

运行以下命令以检查 logrotate 版本,

[email protected]:~$ logrotate --version
logrotate 3.14.0
    Default mail command:       /usr/bin/mail
    Default compress command:   /bin/gzip
    Default uncompress command: /bin/gunzip
    Default compress extension: .gz
    Default state file path:    /var/lib/logrotate/status
    ACL support:                yes
    SELinux support:            yes
[email protected]:~$

从输出中,我们可以清楚地看到我们有 logrotate 版本 3.14.0。 默认情况下,logrotate 预装在现代 Linux 发行版中,因此无需安装。

Logrotate 配置文件

Logrotate 作为 cron 作业每天运行,遍历各种日志文件,轮换它们,并清除配置文件中定义的旧日志文件。 您需要支付两个主要的配置来源 close 注意:

/etc/logrotate.conf – 这是 logrotate 工具的主要配置文件。 它包含默认设置并促进非系统包日志的日志轮换。 更值得注意的是,它使用了一个 ‘包括‘ 用于拉取位于 ‘ 中的配置的指令/etc/logrotate.d‘ 目录。 我们来看看配置文件。

$ cat /etc/logrotate.conf

根据显示的配置,/etc/logrotate.conf 文件在 每周 依据如上所示 3号线.

  • 7号线 表示 root 用户和 adm 组拥有日志文件。
  • 10号线 表示仅备份 4 周的日志文件,之后将清除或删除较旧的日志文件以创建更多磁盘空间。
  • 13号线 指示在当前日志文件轮换后创建新的日志文件。
  • 包含声明 第 22 行 拉取/etc/logrotate.d 目录中列出的应用程序文件的配置。

/etc/logrotate.d – 这是一个包含日志文件需要日志轮换的已安装包的 logrotate 配置的目录。 通常,您还可能会找到系统工具的配置文件,例如 apt & dpkg(对于 Debian 系统)、rsyslog、ufw 和 cups-daemon。 这是你会发现的:

[email protected]:~$ ls -l /etc/logrotate.d/
total 60
-rw-r--r-- 1 root root 120 Sep  5  2019 alternatives
-rw-r--r-- 1 root root 126 Dec  4 20:25 apport
-rw-r--r-- 1 root root 173 Apr  9 11:21 apt
-rw-r--r-- 1 root root  91 Apr  1 10:49 bootlog
-rw-r--r-- 1 root root 130 Jan 21  2019 btmp
-rw-r--r-- 1 root root 181 Feb 17 08:19 cups-daemon
-rw-r--r-- 1 root root 112 Sep  5  2019 dpkg
-rw-r--r-- 1 root root 329 Feb  4  2019 nginx
-rw-r--r-- 1 root root  94 Feb  8  2019 ppp
-rw-r--r-- 1 root root 501 Mar  7  2019 rsyslog
-rw-r--r-- 1 root root 677 Nov 29 02:08 speech-dispatcher
-rw-r--r-- 1 root root 119 Mar 30 21:49 ubuntu-advantage-tools
-rw-r--r-- 1 root root 178 Jan 21 22:16 ufw
-rw-r--r-- 1 root root 235 Apr 13 23:37 unattended-upgrades
-rw-r--r-- 1 root root 145 Feb 19  2018 wtmp
[email protected]:~$

我们来看看dpkg包管理器工具的配置文件。

$ cat -n /etc/logrotate.d/dpkg
  • 每月:这指示每月轮换一次日志文件
  • 旋转 12: 备份了 12 个旧的日志文件。
  • 压缩:这意味着将使用默认的 gzip 压缩对旋转文件进行压缩,日志文件的文件扩展名为 .gz。
  • 创建644根根:日志轮换完成后立即创建一个新的日志文件,八进制文件权限为 644,用户和组所有权为 root。
  • 错过了:该指令在丢失日志文件的情况下抑制错误消息。
  • 通知空:如果日志文件为空,则忽略文件轮换。

创建示例 logrotate 配置文件

假设我们有一个以 linuxtechi 用户身份运行的应用程序,并且正在生成存储在 /home/linuxtechi/日志 目录。 我们需要将日志文件设置为每周轮换一次。

但首先,我们将在主目录中创建一个 logrotate 配置文件,如下所示:

$ vim /home/linuxtechi/logrotate.conf

接下来,我们将粘贴显示的配置:

/home/linuxtechi/logs/*.log {
    weekly
    missingok
    rotate 14
    compress
    create
}

让我们把它放在上下文中:

日志文件将每周轮换一次,如果任何日志文件丢失,则会抑制任何错误消息。 将在一个月内备份 14 个日志文件,并在当前日志文件轮换后创建一个新日志文件。

现在我们将创建一个包含应用程序日志文件的日志目录,然后创建一个名为 app.log 的日志文件。

[email protected]:~$ mkdir logs && cd logs
[email protected]:~/logs$ touch app.log
[email protected]:~/logs$ ls
app.log
[email protected]:~/logs$

现在,我们将运行 logrotate 命令在主目录中创建一个 logrotate 状态文件,以验证是否已创建日志条目。

$ logrotate /home/linuxtechi/logrotate.conf --state /home/linuxtechi/logrotate-state --verbose

你会得到类似这样的输出:

从输出来看,日志文件没有轮换,原因很简单,每周轮换一次,而且日志文件只有一个小时。

检查 logrotate 文件以验证是否记录了有关日志轮换运行的任何信息。

[email protected]:~$ cat logrotate-state
logrotate state -- version 2
"/home/linuxtechi/logs/app.log" 2020-5-24-17:0:0
[email protected]:~$

从输出中,我们可以看到 logrotate 实用程序在最后一次考虑轮换日志文件时确认,并打印时间戳。

现在我们将强制 logrotate 旋转日志文件——否则它现在不会因为指定的时间间隔尚未超过——使用 -力量 如图所示。

$ logrotate /home/linuxtechi/logrotate.conf --state /home/linuxtechi/logrotate-state --verbose --force

如果您返回到日志目录,您将看到一个附加的日志文件,该文件已被旋转和压缩,如图所示。

[email protected]:~$ cd logs/
[email protected]:~/logs$ ls
app.log  app.log.1.gz
[email protected]:~/logs$

根据大小压缩和轮换日志文件

有时,甚至在指定的轮换时间间隔(无论是每天、每周还是每月)之前,日志文件都会变得更大并占用空间。

解决此问题的一种方法是指定文件的最大大小,超过时将触发日志文件的轮换。 为此,请指定 最大尺寸 logrotate 文件中的选项。

例如,要在文件大小增长超过 40 兆字节时触发轮换,请包括以下选项:

最大大小 40M

假设我们在 /etc/logrotate.d 文件夹下为我们的应用程序创建了一个自定义日志轮换文件,

[email protected]:~$ cd /etc/logrotate.d/
[email protected]:/etc/logrotate.d$ sudo vi custom-app
/home/linuxtechi/logs/app-access.log
{
    daily
    missingok
    size 40M
    rotate 4
    compress
    create
}

Save 并关闭文件,

后缀 表示 兆字节, 为了 千字节 尽管 G 表示大小 千兆字节.

该语句暗示大于 40 兆字节的日志文件将被轮换,而不考虑轮换的时间间隔。 这意味着对于 1 小时后轮换的日志文件,如果超过 40MB 的阈值,它将在指定的时间间隔之前轮换。

让我们将一些数据转储到我们自定义应用程序的日志文件中,然后看看 logrotate 将如何轮换日志文件,

[email protected]:~$ dd if=/dev/zero of=/home/linuxtechi/logs/app-access.log bs=1M count=25
25+0 records in
25+0 records out
26214400 bytes (26 MB, 25 MiB) copied, 0.0422015 s, 621 MB/s
[email protected]:~$ du -sh /home/linuxtechi/logs/app-access.log
25M     /home/linuxtechi/logs/app-access.log
[email protected]:~$

用 ‘-d‘ logrotate 命令中的选项对日志文件执行 logrotate 的试运行,运行以下命令,

$ logrotate -d /etc/logrotate.d/custom-app

正如我们在输出中看到的,logrotate 不会旋转日志文件,因为大小不超过 40MB。

现在让我们使日志文件大小超过 40MB,

[email protected]:~$ cd logs/
[email protected]:~/logs$ dd if=/dev/zero of=app-access.log bs=1M count=45
45+0 records in
45+0 records out
47185920 bytes (47 MB, 45 MiB) copied, 0.136979 s, 344 MB/s
[email protected]:~/logs$ du -sh app-access.log
46M     app-access.log
[email protected]:~/logs$

现在,再次尝试使用“-d”选项运行 logrotate 命令,

以上输出确认 logroate 将旋转日志文件,因为大小超过 40MB。

除了根据大小增强日志文件的轮换之外,谨慎的做法是确保使用 cron 作业定期调用 logrotate 配置文件。 这对于快速膨胀并冒着填满磁盘空间的风险的日志文件尤其重要。

有两种方法可以解决这个问题:

您可以从以下位置复制 logrotate 脚本 /etc/cron.daily 目录到 /etc/cron.hourly 地点。 这会将日志轮换切换为每小时一次,而不是每天一次。

另一种方法是指定一个 定时任务 在 /etc/crontab 文件中,如图

*/10 * * * * /etc/cron.daily/logrotate

这将在每 10 分钟后触发轮换。

除了使用 maxsize 指令指定最大大小外,还使用 ​​crontab 调用 logrotate 脚本,这是一个完美的组合,可确保及时轮换日志文件以避免填满硬盘驱动器。

有关 logrotate 工具的其他选项,请访问手册页,如下所示:

结论

在本指南中,我们阐明了日志文件的重要性、它们在大小增加时可能造成的威胁,以及 ​​logrotate 工具如何帮助管理系统上日志文件的大小。 我们还查看了用于 logrotate 配置的一些可用选项。

[ad_2]

Related Posts