前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >如何在Ubuntu 16.04上使用Logrotate管理日志文件

如何在Ubuntu 16.04上使用Logrotate管理日志文件

原创
作者头像
穿鞋跑得快
发布2018-08-01 11:15:39
2K0
发布2018-08-01 11:15:39
举报
文章被收录于专栏:云计算教程系列

介绍

Logrotate是一个系统实用程序,用于管理日志文件的自动轮换和压缩。如果未对日志文件进行轮换,压缩和定期修剪,则最终可能会占用系统上的所有可用磁盘空间。

Logrotate默认安装在Ubuntu 16.04上,设置为处理所有已安装软件包的日志轮换需求,包括rsyslog默认系统日志处理器。

在本文中,我们将探索默认的Logrotate配置,然后为虚构的自定义应用程序配置日志轮换。

准备

本教程需要您有一个Ubuntu 16.04服务器,具有可以使用sudo命令的非root用户

Logrotate也可用于许多其他Linux发行版,但默认配置可能完全不同。只要您的Logrotate版本与Ubuntu 16.04类似,本教程的其他部分仍将适用。按照步骤1确定Logrotate版本。

以启用sudo的用户身份登录服务器。

确认您的Logrotate版本

如果您使用的是非Ubuntu服务器,请首先通过询问其版本信息来确保安装Logrotate:

代码语言:txt
复制
$   logrotate --version
代码语言:txt
复制
logrotate 3.8.7

如果未安装Logrotate,则会出现错误。请使用Linux发行版的软件包管理器安装软件。

如果安装了Logrotate但版本号明显不同,则可能会遇到本教程中讨论的某些配置问题。通过阅读其man页面,请参阅特定版本的Logrotate的文档:

代码语言:txt
复制
$   man logrotate

接下来我们将看看Logrotate在Ubuntu上的默认配置结构。

探索Logrotate配置

Logrotate的配置信息一般可以在Ubuntu的两个地方找到:

  • /etc/logrotate.conf:此文件包含一些默认设置,并为不属于任何系统软件包的几个日志设置轮换。它还使用include语句从/etc/logrotate.d目录中的任何文件中提取配置。
  • /etc/logrotate.d/:这是您安装的需要日志轮换帮助的任何软件包将放置其Logrotate配置的位置。在一个标准的安装下,你应该已经在这里所拥有的文件进行系统的基本工具,如aptdpkgrsyslog等等。

默认情况下,logrotate.conf将配置每周日志轮换(weekly),其中包含root用户和syslog组(su root syslog)所拥有的日志文件,其中保留了四个日志文件(rotate 4),并且在轮换当前文件后创建了新的空日志文件(create) 。

我们来看看包中的Logrotate配置文件/etc/logrotate.d

代码语言:txt
复制
$   cat /etc/logrotate.d/apt
代码语言:txt
复制
/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.loghistory.log。他们都有相同的选择。未在这些配置块中设置的任何选项将继承默认值或设置的值/etc/logrotate.conf。为apt日志设置的选项是:

  • rotate 12:保留十二个旧日志文件。
  • monthly:每月轮换一次。
  • compress:压缩轮换的文件。默认使用gzip,导致文件以.gz。结尾。可以使用该compresscmd选项更改压缩命令。
  • missingok:如果缺少日志文件,请不要写入错误消息。
  • notifempty:如果日志文件为空,请不要轮换日志文件。

还有更多可用的配置选项。您可以通过在命令行上键入man logrotate 以查看Logrotate的手册页来阅读所有这些内容。

接下来,我们将设置一个配置文件来处理虚构服务的日志。

设置示例配置

要管理预打包和预配置系统服务之外的应用程序的日志文件,我们有两个选择:

  1. 创建一个新的Logrotate配置文件并将其放入/etc/logrotate.d/。这将作为root用户以及所有其他标准Logrotate作业每天运行。
  2. 创建一个新的配置文件,并在Ubuntu的默认Logrotate设置之外运行它。如果您需要以非root用户身份运行Logrotate ,或者如果您希望每天更频繁地轮换日志(这样hourly配置/etc/logrotate.d/是无效的,因为系统的Logrotate设置每天只运行一次),这才是真正必要的。

让我们通过一些示例设置来介绍这两个选项。

添加配置到 /etc/logrotate.d/

我们要配置日志轮换为把一个虚构的Web服务器access.logerror.log/var/log/example-app/。它作为www-data用户和组运行。

要添加一些配置到/etc/logrotate.d/,先在那里打开一个新文件:

代码语言:txt
复制
$   sudo nano /etc/logrotate.d/example-app

这是一个可以处理这些日志的示例配置文件:

/etc/logrotate.d/example-app

代码语言:txt
复制
/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来测试它:

代码语言:txt
复制
$   sudo logrotate /etc/logrotate.conf --debug

此调用将logrotate其指向标准配置文件,并打开调试模式。

将打印出有关Logrotate正在处理哪些日志文件以及它们将对它们执行的操作的信息。如果一切顺利,你就完成了。标准Logrotate作业将每天运行一次并包含新配置。

接下来,我们将尝试完全不使用Ubuntu默认配置的设置。

创建独立的Logrotate配置

在这个例子中,我们有一个应用程序作为我们的用户sammy在运行,生成存储在其中的日志/home/sammy/logs/中。我们希望每小时轮换这些日志,因此我们需要在/etc/logrotate.d Ubuntu提供的结构之外进行设置。

首先,我们将在主目录中创建配置文件。在文本编辑器中打开它:

代码语言:txt
复制
$   nano /home/sammy/logrotate.conf

然后粘贴以下配置:

/home/sammy/logrotate.conf

代码语言:txt
复制
/home/sammy/logs/*.log {
    hourly
    missingok
    rotate 24
    compress
    create
}

保存并关闭文件。我们在之前的步骤中已经看到了所有这些选项,但让我们总结一下:此配置将每小时轮换文件,压缩并保留二十四个旧日志并创建一个新的日志文件来替换轮换的日志文件。

您需要自定义配置以适合您的应用程序,但这是一个良好的开端。

为了测试它的工作原理,让我们创建一个日志文件:

代码语言:txt
复制
$ cd ~
$ mkdir logs
$ touch logs/access.log

现在我们在正确的位置有一个空白的日志文件,让我们运行logrotate命令。

因为日志是由sammy拥有的,所以我们不需要使用sudo命令。我们确实需要指定一个状态文件。此文件记录logrotate上次运行时所看到和执行的操作,以便它知道下次运行时要执行的操作。在使用Ubuntu Logrotate设置时可以为我们处理(可以在以下处找到/var/lib/logrotate/status),但我们现在需要手动完成。

我们将Logrotate的状态文件放在我的主目录中,用于此示例。我可以去任何方便的地方:

代码语言:txt
复制
logrotate /home/sammy/logrotate.conf --state /home/sammy/logrotate-state --verbose
代码语言:txt
复制
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记录了一些有关运行的信息:

代码语言:txt
复制
$  cat /home/sammy/logrotate-state
代码语言:txt
复制
logrotate state -- version 2
"/home/sammy/logs/access.log" 2017-11-7-19:0:0

Logrotate注意到它看到的日志以及它最后一次考虑它们的轮换时间。如果我们在一小时后运行相同的命令,日志将按预期轮换。

如果要强制Logrotate轮换日志文件,否则不要使用该--force标志:

代码语言:txt
复制
$ logrotate /home/sammy/logrotate.conf --state /home/sammy/logrotate-state --verbose --force

这在测试postrotate和其他脚本时很有用。

最后,我们需要设置一个cron作业来每小时运行一次Logrotate。打开用户的crontab:

代码语言:txt
复制
$  crontab -e

这将打开一个文本文件。文件中可能已经有一些注释解释了预期的基本语法。将光标向下移动到文件末尾的新空行并添加以下内容:

代码语言:txt
复制
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 删除。

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 介绍
  • 准备
  • 确认您的Logrotate版本
  • 探索Logrotate配置
  • 设置示例配置
    • 添加配置到 /etc/logrotate.d/
      • 创建独立的Logrotate配置
      • 结论
      领券
      问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档