介绍
由您的服务器和应用程序生成的日志文件充满了调试软件,调查安全事件以及生成有见识的指标和统计信息时可能有用的信息。
目前一种典型的日志记录策略是通过日志聚合服务(例如Elastic或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空间和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
网址并将其替换为上面的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
- 默认区域[US]:
ENTER
- S3端点[s3.amazonaws.com]:
nyc3.digitaloceanspaces.com
- DNS风格的桶+主机名:用于访问存储桶的端口模板[%(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
找到的所有系统/var/log
。
对于本教程,我们将更新配置,以便将syslog
日志日志发送到对象存储。
首先,打开系统日志处理器rsyslog的Logrotate配置文件:
sudo nano /etc/logrotate.d/rsyslog
将有两个配置块。 我们对第一个感兴趣,它处理/var/log/syslog
:
/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
在旧的日志文件被转rsyslog
切换到新的日志文件。
在添加新的配置指令之前,请删除上面突出显示的delaycompress
行。 我们希望所有的旧日志在发送到对象存储之前立即被压缩。
接下来,将下列行添加到配置块的末尾(在endscript
块之外,但在关闭的括号内):
. . .
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文件s3cmd sync
到对象存储桶,并将它们放在一个以主机名命名的文件夹中。 请注意, "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
粘贴到以下服务定义中:
[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,将其配置为连接到我们的对象存储服务,并且在它旋转/var/log/syslog
时配置Logrotate以上载日志文件。 然后,我们建立一个systemd服务,在关机时运行logrotate --force
,以确保在销毁临时服务器时不会丢失任何日志。
要了解有关Logrotate可用配置的更多信息,请通过在命令行中输入man logrotate
来参考其手册页。 有关S3cmd的更多信息可以在他们的网站上找到 。