介绍
由您的服务器和应用程序生成的日志文件充满了潜在用于调试软件、调查安全事件和生成深入的指标和统计信息的信息。
今天,一个典型的日志策略是通过一个日志汇总服务(如 Elastic stack或 Graylog)来集中所有这些信息,这对于实时分析和短期到中期历史调查是很好的,但由于存储限制或其他服务器资源问题,通常无法在这些系统中保留长期数据。
对于这些长期存储需求,一个常见的解决方案是使用对象存储服务来存档日志,这些日志可以无限期地用于后续分析,法律保留要求或备份目的。
在本教程中,我们将使用Logrotate在Ubuntu 16.04服务器上将syslog
日志发送到对象存储服务中。
前提条件
要完成本教程,您将需要以下内容:
- 一个 Ubuntu 16.04 服务器,具有非 root sudo-enabled 用户,如在 Initial Server Setup with Ubuntu 16.04]中所描述。本教程中的配置应该在许多不同的 Linux 发行版上更广泛地工作,但可能需要一些调整。
- 您应该熟悉 Logrotate 以及如何在 Ubuntu 16.04 上设置默认配置,请阅读 如何在 Ubuntu 16.04 上管理 Logrotate 上的日志文件以获得更多信息。
- 您需要了解有关您的对象存储服务的下列细节:
- 访问
- 密钥
- 服务器(或
终点
)
一旦您完成了前提条件,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
会总结你的答案,然后要求你测试连接,然后按y
按ENTER
开始测试:
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
。