如何在 Ubuntu 16.04 上使用 Logrotate 和 S3cmd 将日志归档至对象存储

介绍

由您的服务器和应用程序生成的日志文件充满了潜在用于调试软件、调查安全事件和生成深入的指标和统计信息的信息。

今天,一个典型的日志策略是通过一个日志汇总服务(如 Elastic stackGraylog)来集中所有这些信息,这对于实时分析和短期到中期历史调查是很好的,但由于存储限制或其他服务器资源问题,通常无法在这些系统中保留长期数据。

对于这些长期存储需求,一个常见的解决方案是使用对象存储服务来存档日志,这些日志可以无限期地用于后续分析,法律保留要求或备份目的。

在本教程中,我们将使用Logrotate在Ubuntu 16.04服务器上将syslog日志发送到对象存储服务中。

前提条件

要完成本教程,您将需要以下内容:

  • 访问
  • 密钥
  • 服务器(或终点)

一旦您完成了前提条件,SSH进入您的服务器开始。

步骤 1 — 安装 S3cmd

我们将使用一个名为 S3cmd的工具将我们的日志发送到任何S3兼容的对象存储服务. 在安装S3cmd之前,我们需要安装一些工具来帮助我们安装Python程序(S3cmd是用Python写的):

1sudo apt-get update
2sudo apt-get install python-setuptools

接下来,转到可以写到的目录,然后下载 S3cmd .tar.gz 文件:

1cd /tmp
2curl -LO https://github.com/s3tools/s3cmd/releases/download/v2.0.1/s3cmd-2.0.1.tar.gz

<$>[注] 注: 您可以通过访问 Github 上的 [他们的 Releases 页面] 来检查 S3cmd 的更新的版本是否可用(https://github.com/s3tools/s3cmd/releases)。

当下载完成后,使用tar实用程序解包和解包文件:

1tar xf s3cmd-*.tar.gz

然后,切换到结果的目录并使用sudo安装软件:

1cd s3cmd-*
2sudo python setup.py install

测试安装,请问s3cmd其版本信息:

1s3cmd --version
1[secondary_label Output]
2s3cmd version 2.0.1

如果您看到类似的输出,则 S3cmd 已成功安装,接下来,我们将配置 S3cmd 以连接到我们的对象存储服务。

步骤 2 — 配置 S3cmd

S3cmd有一个交互式配置流程,可以创建我们需要连接到我们的对象存储服务器的配置文件。 root用户将需要访问这个配置文件,所以我们将使用sudo启动配置流程,并将配置文件放入 root用户的主目录:

1sudo s3cmd --configure --config=/root/logrotate-s3cmd.config

交互式设置将开始。在适当的情况下,您可以通过点击ENTER来接受默认答案(在插槽中)。我们将通过下面的选项,为 DigitalOcean NYC3 区域中的空间提供建议的答案。

  • 访问密钥: your-access-key
  • 秘密密密钥: your-secret-key
  • 默认区域 [US]: ENTER
  • S3 Endpoint [s3.amazonaws.com]: nyc3.digitaloceanspaces.com
  • DNS-style bucket+hostname:port template for accessing a bucket [%(bucket)s.s3.amazonaws.com]: %(bucket)s.nyc3.digitaloceanspaces.com
  • 加密密密码: ENTER或指定密码来加密
  • Path to GPG program [/usr/bin/g

在此时,s3cmd会总结你的答案,然后要求你测试连接,然后按yENTER开始测试:

1[secondary_label Output]
2Test access with supplied credentials? [Y/n] y
3Please wait, attempting to list all buckets...
4Success. Your access key and secret key worked fine :-)

测试结束后,您将被要求保存设置。 再次,键入y然后ENTER,以便这样做。 配置文件将使用--config命令行选项写到我们之前指定的位置。

在下一步,我们将设置Logrotate以使用S3cmd来上传我们的日志。

步骤 3 — 设置 Logrotate 将旋转日志发送到对象存储

Logrotate 是一个强大而灵活的系统,用于管理日志文件的旋转和压缩。Ubuntu 默认使用它来维护在 `/var/log 中发现的所有系统日志。

对于本教程,我们将更新配置,以便每次旋转时将syslog日志发送到对象存储中。

首先,打开rsyslog,即系统日志处理器的Logrotate配置文件:

1sudo nano /etc/logrotate.d/rsyslog

我们对第一个有兴趣,它涉及到 /var/log/syslog:

 1[label /etc/logrotate.d/rsyslog]
 2/var/log/syslog
 3{
 4    rotate 7
 5    daily
 6    missingok
 7    notifempty
 8    delaycompress
 9    compress
10    postrotate
11    	invoke-rc.d rsyslog rotate > /dev/null
12    endscript
13}
14. . .

此配置规定/var/log/syslog将每日旋转(每日),保持7个旧日志(旋转 7)。如果日志文件缺少(missingok)它不会产生错误,如果日志空白(notifempty)它也不会旋转。旋转日志将被压缩(压缩),但不是最新的日志(延迟压缩).最后,postrotate脚本告诉rsyslog在旧日志文件被旋转后,切换到新日志文件。

在我们添加新的配置指南之前,请删除上述延迟压缩行,我们希望我们所有的旧日志在将其发送到对象存储之前立即被压缩。

接下来,将下列行添加到配置块的尽头(在postrotate... endscript 块之外,但在关闭的}轴内):

1[label /etc/logrotate.d/rsyslog]
2. . .
3        dateext
4        dateformat -%Y-%m-%d-%s
5        lastaction
6                HOSTNAME=`hostname`
7                /usr/local/bin/s3cmd sync --config=/root/logrotate-s3cmd.config /var/log/syslog*.gz "s3://your-bucket-name/$HOSTNAME/"
8        endscript
9. . .

请确保替换上面提到的部分的正确桶名称。 这些选项将启用基于日期的文件名扩展(‘dateext’),以便我们可以按时打印我们的日志文件。 然后我们将这些扩展的格式设置为‘dateformat’。 这些文件将最终以诸如‘syslog-2017-11-07-1510091490.gz’这样的文件名称结束:年份,月期,日期,然后时间打印。 时间打印确保我们可以在同一天发送两个日志文件,而不会出现文件名冲突。 这是必要的,如果我们需要出于某种原因强迫日志旋转(进一步了解下一步)。

在所有日志文件被压缩后,Lastaction脚本运行。它设置了与服务器的主机名称的变量,然后使用s3cmd sync将所有 syslog 文件同步到您的对象存储桶中,将其放置到一个名为主机名称的文件夹中。 请注意,在s3://your-bucket-name/$HOSTNAME/中最后的切割是显著的。 没有它,s3cmd/$HOSTNAME视为一个单一的文件,而不是一个完整的日志文件目录。

保存和关闭配置文件 下次Logrotate执行其每日运行, /var/log/syslog将移动到基于日期的文件名,压缩和上传。

我们可以迫使此事立即发生,以测试它是否正常工作:

1sudo logrotate /etc/logrotate.conf --verbose --force
 1[secondary_label Output]
 2rotating pattern: /var/log/syslog
 3. . .
 4considering log /var/log/syslog
 5  log needs rotating
 6. . .
 7running last action script
 8switching euid to 0 and egid to 0
 9upload: '/var/log/syslog-2017-11-08-1510175806.gz' -> 's3://example-bucket/example-hostname/syslog-2017-11-08-1510175806.gz'  [1 of 1]
10 36236 of 36236 100% in 0s 361.16 kB/s done
11Done. Uploaded 36236 bytes in 1.0 seconds, 35.39 kB/s.

这将为许多日志文件输出大量信息. 与syslog日志相关的部分和我们的上传是上面提到的。 您的输出应该看起来类似,有一些成功上传的证据。

接下来,我们将选择设置一个服务,以帮助我们在系统关闭之前上传日志。

步骤 4 – 在关闭时发送日志

此步骤是可选的,并且只有在配置经常被关闭和破坏的短期服务器时才有必要。

要修复这一点,我们需要强迫Logrotate在系统关闭前进行最后一次运行,我们将通过创建一个系统d服务来执行logrotate命令,当它停止时。

首先,在文本编辑器中打开新服务文件:

1sudo nano /etc/systemd/system/logrotate-shutdown.service

用下列服务定义:

 1[label /etc/systemd/system/logrotate-shutdown.service]
 2[Unit]
 3Description=Archive logs before shutdown
 4After=network.target
 5
 6[Service]
 7RemainAfterExit=yes
 8ExecStop=/usr/sbin/logrotate /etc/logrotate.conf --force
 9
10[Install]
11WantedBy=multi-user.target

该文件定义了一个在启动时不做任何事情的服务(缺少ExecStart声明),并且在停止时运行logrotate(使用--force选项)。

保存文件并离开文本编辑器,然后启动启用使用systemctl服务:

1sudo systemctl start logrotate-shutdown.service
2sudo systemctl enable logrotate-shutdown.service

查看新服务的状态:

1sudo systemctl status logrotate-shutdown.service
1[secondary_label Output]
2 logrotate-shutdown.service - Archive logs before shutdown
3   Loaded: loaded (/etc/systemd/system/logrotate-shutdown.service; enabled; vendor preset: enabled)
4   Active: active (exited) since Wed 2017-11-08 20:00:05 UTC; 8s ago
5
6Nov 08 20:00:05 example-host systemd[1]: Started Archive logs before shutdown.

我们想看到它是活跃的。事实上它已经退出是好的,这是因为没有ExecStart命令。

您可以通过手动停止它来测试新服务是否正在运作:

1sudo systemctl stop logrotate-shutdown.service

或重新启动您的系统:

1sudo reboot

任何一种方法都会触发 Logrotate 命令并上传一个新的日志文件. 现在,除非出现恶意关闭,您在破坏服务器时不会丢失任何日志。

<$>[注] **注:许多云平台在被摧毁或终止服务器时不会进行优雅的关闭,您将需要通过您的特定设置测试此功能,并将其配置为优雅的关闭或找到另一种解决方案来触发最终的日志旋转。

结论

在本教程中,我们安装了 S3cmd,将其配置为连接到我们的对象存储服务,并配置了 Logrotate 以在旋转 `/var/log/syslog 时上传日志文件。

要了解有关 Logrotate 可用的配置的更多信息,请参阅其手册页面,在命令行中输入man logrotate

Published At
Categories with 技术
comments powered by Disqus