將日誌文件從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)。
這當然不是最好的解決方案,但卻容易實現。希望對你有幫助。



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