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

介绍

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

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

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

准备

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

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

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

确认您的Logrotate版本

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

$   logrotate --version
logrotate 3.8.7

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

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

$   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

$   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.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/,先在那里打开一个新文件:

$   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默认配置的设置。

创建独立的Logrotate配置

在这个例子中,我们有一个应用程序作为我们的用户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》

原创声明,本文系作者授权云+社区发表,未经许可,不得转载。

如有侵权,请联系 yunjia_community@tencent.com 删除。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏pangguoming

yum离线安装rpm包

#yum install --downloadonly --downloaddir=/home/samba  samba

3033
来自专栏xingoo, 一个梦想做发明家的程序员

Elasticsearch 安装与启动

平台支撑 ES支持在不同的平台上运行,下面这幅图中,对号标记的是经过测试的平台,其他的也可以运行,但是可能会出现BUG。 ? 下载与安装 在官网下载地址就可以进...

2456
来自专栏性能与架构

JS模块加载框架 SeaJS

SeaJS是一个遵循CMD规范的JavaScript模块加载框架,可以实现JavaScript的模块化开发及加载机制,兼容所有主流浏览器 SeaJS的主要目的...

3405
来自专栏深度学习之tensorflow实战篇

linux调用sh文件的基本操作

最近做了一点和Linux有关的工作,刚刚学习,做一点和shell脚本有关的笔记。 1、创建test.sh文件 touch test.sh 2、编辑sh文件 vi...

3525
来自专栏无题

消息队列两种模式:点对点与发布订阅

Java消息服务(JavaMessage Service,JMS)应用程序接口是一个Java平台中关于面向消息中间件(MOM)的API,用于在两个应用程序之间,...

9974
来自专栏编程坑太多

『中级篇』docker之CI/CD持续集成-gitlab安装(70)

PS:gitlab安装基本就是这样也不是很复杂,主要是必须更改源,国内的墙太高太宽了。

1224
来自专栏我的博客

Vagrant搭建Linux环境

1、下载软件 https://www.virtualbox.org/wiki/Downloads https://www.vagrantup.com/dow...

2054
来自专栏思考的代码世界

解决安装Samba时浏览器打开不成功

2470
来自专栏Janti

Linux Ubuntu jdk(环境变量)配置

一、下载JDK - jdk版本建议是gz形式的,rpm是RedHat里面的命令,所以下载rpm格式的时候回遇到问题 二、 打开虚拟机,创建目录 1 创建目录 ...

4288
来自专栏FreeBuf

DomLink:一款自动化的域发现工具

DomLink是一个自动化的域发现工具。用户只需向其提供一个域名,它就会帮助我们查找与之相关联的组织和电子邮件记录,并使用这些信息执行反向的WHOIS,然后你将...

1042

扫码关注云+社区

领取腾讯云代金券