将日志文件从EC2实例自动备份到S3

原文链接:Automatic backup of log files to S3 from EC2 instances


近期我打算启动新的EC2实例来部署服务的新版本,并终止运行着旧版本服务的实例。我认为这种方法可行,因为我想无论如何都会有取代实例的时候。然而,这种方法存在一个弊端,即丢失服务的日志文件(我也许会用于排除故障与分析)。

我决定将这些日志文件备份到S3。然而,我不知道该如何做。因为我正在使用logrotate,来轮转这些文件。问题是,使用默认选项运行时,日志文件名是静态的,但内容会随着每次轮转而改变。开始我考虑dateext指令,以获取当前的日期添加到文件名,但最后我认为向logrotate添加rotate-hook会更容易。

创建logrotate hook非常简单。只需将postrotate/endscript指令添加到想要运行的脚本或命令即可。您还需要添加sharedscripts,以确保脚本每次只执行一次。

我的服务的logrotate文件(/etc/logrotate.d/my_service)如下所示:

/var/log/my_service/*.log {
  daily
  missingok
  copytruncate
  rotate 10
  compress
  delaycompress
  notifempty
  sharedscripts
  postrotate
    /bin/bash /etc/my_service/upload_log_to_s3.sh log.1
  endscript
}

但是,当前还未轮转到的日志文件该怎么办?如果实例将终止,那么最新的日志文件将不被上传。

解决方法是对系统使用shutdown-hook。在Ubuntu中使用upstart可以很容易地添加shutdown-hook。

upstart配置文件(/etc/init/shutdown-hook.conf)如下所示:

description "run at shutdown"

start on starting rc
task
exec /bin/bash /etc/my_service/upload_log_to_s3.sh log

最后我只需脚本来上传日志文件到S3:

#!/bin/bash

log_file_ext=$1

gzip -c /var/log/my_service/*.$log_file_ext > /tmp/log.gz

aws s3 cp /tmp/log.gz s3://my_service_bucket/logs/`date +%Y-%m-%dT%H:%M:%SZ`.log.gz

上传脚本将gzip日志文件(当使用delaycompress时需要),将日志文件重命名为当前时间戳以及使用aws-cli上传文件。该参数设置日志文件的扩展名,需要既能上传当前的日志(.log)也能上传之前的日志(.log.1)。
这当然不是最好的解决方案,但却容易实现。希望对你有帮助。



發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章