介绍
您的服务器和应用程序生成的日志文件充满了在调试软件、调查安全事件以及生成有洞察力的指标和统计数据时可能有用的信息。
现在一个典型的日志记录策略是通过一个日志聚合服务来集中所有这些信息,例如弹性堆栈或Graylog。 这对于实时分析和中短期历史调查非常有用,但由于存储限制或其他服务器资源问题,通常无法在这些系统中保留长期数据。
这些长期存储需求的常见解决方案是使用对象存储服务归档日志。 日志可以无限期地保持可用,以供以后分析、法律保留要求或用于备份目的。
在本教程中,我们将在 Ubuntu 16.04 服务器上使用 Logrotate 将 syslog
日志发送到对象存储服务。 这种技术可以应用于由 Logrotate 处理的任何日志。
先决条件
要完成本教程,您将需要以下内容:
- 一个 Ubuntu 16.04 服务器,具有非 root 启用 sudo 的用户,如 使用 Ubuntu 16.04 的初始服务器设置中所述。 本教程中的配置应该更广泛地适用于许多不同的 Linux 发行版,但可能需要一些调整。
- 您应该熟悉 Logrotate 以及如何在 Ubuntu 16.04 上设置默认配置。 请阅读 如何在 Ubuntu 16.04 上使用 Logrotate 管理日志文件以获取更多信息。
- 您需要了解有关对象存储服务的以下详细信息: 访问密钥 密钥服务器(或“端点”) URL 存储桶名称 如果您使用的是 DigitalOcean Spaces,您可以阅读如何创建 DigitalOcean Space 和 API 密钥来创建新存储桶并检索上述信息。
完成先决条件后,开始 SSH 进入您的服务器。
第 1 步 — 安装 S3cmd
我们将使用一个名为 S3cmd 的工具将我们的日志发送到任何与 S3 兼容的对象存储服务。 在安装 S3cmd 之前,我们需要安装一些工具来帮助我们安装 Python 程序(S3cmd 是用 Python 编写的):
sudo apt-get update sudo apt-get install python-setuptools
接下来,切换到您可以写入的目录,然后下载 S3cmd .tar.gz
文件:
cd /tmp curl -LO https://github.com/s3tools/s3cmd/releases/download/v2.0.1/s3cmd-2.0.1.tar.gz
注意:你可以通过访问他们在Github上的发布页面来查看是否有更新版本的S3cmd可用。 如果找到新版本,请复制 .tar.gz
URL 并将其替换为上面的 curl
命令。
下载完成后,使用 tar
实用程序解压缩并解压文件:
tar xf s3cmd-*.tar.gz
然后,切换到生成的目录并使用 sudo
安装软件:
cd s3cmd-* sudo python setup.py install
通过询问 s3cmd
的版本信息来测试安装:
s3cmd --version
Outputs3cmd version 2.0.1
如果您看到类似的输出,则 S3cmd 已成功安装。 接下来,我们将配置 S3cmd 以连接到我们的对象存储服务。
第 2 步 — 配置 S3cmd
S3cmd 有一个交互式配置过程,可以创建我们需要连接到我们的对象存储服务器的配置文件。 root 用户需要访问此配置文件,因此我们将使用 sudo
开始配置过程,并将配置文件放在 root 用户的主目录中:
sudo s3cmd --configure --config=/root/logrotate-s3cmd.config
交互式设置将开始。 在适当的时候,您可以通过按 ENTER
接受默认答案(在括号中)。 我们将介绍以下选项,并为 DigitalOcean 的 NYC3 区域中的空间提供建议的答案。 根据需要为其他 DigitalOcean 数据中心或其他对象存储提供商替换 S3 端点和存储桶模板:
- 访问密钥:
your-access-key
- 密钥:
your-secret-key
- 默认区域 [美国]:
ENTER
- S3 端点 [s3.amazonaws.com]:
nyc3.digitaloceanspaces.com
- DNS风格bucket+hostname:访问bucket的端口模板[%(bucket)s.s3.amazonaws.com]:
%(bucket)s.nyc3.digitaloceanspaces.com
- 加密密码:
ENTER
,或指定密码进行加密 - GPG 程序路径 [/usr/bin/gpg]:
ENTER
- 使用HTTPS协议[是]:
ENTER
- HTTP代理服务器名称:
ENTER
,或者填写你的代理信息
此时,s3cmd
会总结你的反应,然后要求你测试连接。 按 y
然后按 ENTER
开始测试:
OutputTest access with supplied credentials? [Y/n] y Please wait, attempting to list all buckets... Success. Your access key and secret key worked fine :-)
测试结束后,系统会提示您保存设置。 再次键入 y
然后 ENTER
这样做。 配置文件将被写入我们之前使用 --config
命令行选项指定的位置。
在下一步中,我们将设置 Logrotate 以使用 S3cmd 上传我们的日志。
第 3 步 - 设置 Logrotate 以将旋转的日志发送到对象存储
Logrotate 是一个强大而灵活的系统来管理日志文件的轮换和压缩。 Ubuntu 默认使用它来维护在 /var/log
中找到的所有系统日志。
对于本教程,我们将更新配置,以便在旋转时将 syslog
日志发送到对象存储。
首先,打开系统日志处理器rsyslog
的Logrotate配置文件:
sudo nano /etc/logrotate.d/rsyslog
将有两个配置块。 我们对第一个感兴趣,它处理 /var/log/syslog
:
/etc/logrotate.d/rsyslog
/var/log/syslog { rotate 7 daily missingok notifempty delaycompress compress postrotate invoke-rc.d rsyslog rotate > /dev/null endscript } . . .
此配置指定 /var/log/syslog
将每天轮换 (daily
),并保留七个旧日志 (rotate 7
)。 如果日志文件丢失(missingok
),它不会产生错误,如果它是空的(notifempty
),它不会轮换日志。 旋转的日志将被压缩 (compress
),但不会压缩最新的日志 (delaycompress
)。 最后,postrotate
脚本告诉 rsyslog
在旧的日志文件被轮换后切换到新的日志文件。
在我们添加新的配置指令之前,删除上面突出显示的 delaycompress
行。 我们希望在将所有旧日志发送到对象存储之前立即对其进行压缩。
接下来,将以下行添加到配置块的末尾(在 postrotate
之外)。 . . endscript
块,但在结束 }
括号内):
/etc/logrotate.d/rsyslog
. . . dateext dateformat -%Y-%m-%d-%s lastaction HOSTNAME=`hostname` /usr/local/bin/s3cmd sync --config=/root/logrotate-s3cmd.config /var/log/syslog*.gz "s3://your-bucket-name/$HOSTNAME/" endscript . . .
请务必将正确的存储桶名称替换为上面突出显示的部分。 这些选项将打开基于日期的文件扩展名 (dateext
),因此我们可以为日志文件添加时间戳。 然后我们用 dateformat
设置这些扩展的格式。 这些文件将以 syslog-2017-11-07-1510091490.gz
之类的文件名结束:年、月、日,然后是时间戳。 时间戳确保我们可以在同一天发送两个日志文件,而文件名不会冲突。 如果我们出于某种原因需要强制进行日志轮换,这是必要的(下一步将详细介绍)。
lastaction
脚本在所有日志文件被压缩后运行。 它使用服务器的主机名设置一个变量,然后使用 s3cmd sync
将所有 syslog 文件同步到您的对象存储桶,将它们放在以主机名命名的文件夹中。 请注意,"s3://your-bucket-name/$HOSTNAME/"
中的最后一个斜线很重要。 没有它,s3cmd
会将 /$HOSTNAME
视为单个文件,而不是一个充满日志文件的目录。
保存并关闭配置文件。 下次 Logrotate 进行日常运行时,/var/log/syslog
将被移动到基于日期的文件名,压缩并上传。
我们可以强制它立即发生以测试它是否正常工作:
sudo logrotate /etc/logrotate.conf --verbose --force
Outputrotating pattern: /var/log/syslog . . . considering log /var/log/syslog log needs rotating . . . running last action script switching euid to 0 and egid to 0 upload: '/var/log/syslog-2017-11-08-1510175806.gz' -> 's3://example-bucket/example-hostname/syslog-2017-11-08-1510175806.gz' [1 of 1] 36236 of 36236 100% in 0s 361.16 kB/s done Done. Uploaded 36236 bytes in 1.0 seconds, 35.39 kB/s.
这将为许多日志文件输出大量信息。 与 syslog
日志和我们的上传相关的部分摘录在上面。 您的输出应该看起来相似,并带有一些成功上传的证据。 如果服务器不是全新的,您可能会上传更多文件。
接下来,我们将选择性地设置一个服务来帮助我们在系统关闭之前上传日志。
第 4 步 — 在关机时发送日志
此步骤是可选的,并且仅在您配置经常被关闭和销毁的临时服务器时才需要。 如果是这种情况,每次销毁服务器时,您最多可能会丢失一天的日志。
为了解决这个问题,我们需要在系统关闭之前强制 Logrotate 运行最后一次。 我们将通过创建一个 systemd 服务来做到这一点,该服务在停止时运行 logrotate
命令。
首先,在文本编辑器中打开一个新的服务文件:
sudo nano /etc/systemd/system/logrotate-shutdown.service
粘贴以下服务定义:
/etc/systemd/system/logrotate-shutdown.service
[Unit] Description=Archive logs before shutdown After=network.target [Service] RemainAfterExit=yes ExecStop=/usr/sbin/logrotate /etc/logrotate.conf --force [Install] WantedBy=multi-user.target
该文件定义了一个在启动时什么都不做的服务(它缺少 ExecStart
语句),并在停止时运行 logrotate
(带有 --force
选项)。 它将在由于 After=network.target
线而关闭网络连接之前运行。
保存文件并退出文本编辑器,然后使用 systemctl
start
和 enable
服务:
sudo systemctl start logrotate-shutdown.service sudo systemctl enable logrotate-shutdown.service
检查新服务的状态:
sudo systemctl status logrotate-shutdown.service
Output● logrotate-shutdown.service - Archive logs before shutdown Loaded: loaded (/etc/systemd/system/logrotate-shutdown.service; enabled; vendor preset: enabled) Active: active (exited) since Wed 2017-11-08 20:00:05 UTC; 8s ago Nov 08 20:00:05 example-host systemd[1]: Started Archive logs before shutdown.
我们希望看到它是 active
。 它具有 exited
的事实很好,这是由于没有 ExecStart
命令。
您可以通过手动停止它来测试新服务是否正常运行:
sudo systemctl stop logrotate-shutdown.service
或通过重新启动系统:
sudo reboot
任何一种方法都会触发 Logrotate 命令并上传新的日志文件。 现在,除非意外关闭,否则您在销毁服务器时不会丢失任何日志。
注意:许多云平台在服务器被销毁或终止时不会执行正常关机。 您将需要使用您的特定设置测试此功能,并将其配置为正常关闭或找到另一个解决方案来触发最终日志轮换。
结论
在本教程中,我们安装了 S3cmd,将其配置为连接到我们的对象存储服务,并将 Logrotate 配置为在旋转 /var/log/syslog
时上传日志文件。 然后,我们设置了一个 systemd 服务以在关机时运行 logrotate --force
,以确保在销毁临时服务器时不会丢失任何日志。
要了解有关 Logrotate 可用配置的更多信息,请通过在命令行中输入 man logrotate
来参阅其手册页。 有关 S3cmd 的更多信息可以在 他们的网站 上找到。