logrotate:仅将新的压缩文件移动到S3

时间:2019-01-31 09:29:27

标签: linux shell amazon-s3 aws-cli logrotate

我有一个生成输出和错误日志的应用程序。我需要压缩它们并在服务器上保留5条日志。 此外,压缩后的日志应立即复制到S3存储桶中。

在我看来,lastaction是我应该编写脚本的正确位置,因为我希望压缩文件。

我的配置文件如下:

/var/log/nodejs/*out.log /var/log/nodejs/*err.log {
  size 10M
  missingok
  notifempty
  rotate 5 
  sharedscripts
  compress
  copytruncate
  dateext
  dateformat -%Y%m%d-%s
  olddir /var/log/nodejs/rotated
  lastaction
    echo $@
    INSTANCE_ID="`wget -q -O - http://instance-data/latest/meta-data/instance-id`"
    HOSTNAME=`hostname`
    BUCKET="my-logs"
    REGION="us-west-2"
    read DAY MONTH YEAR <<< `date "+%d %m %Y"`  
    aws s3 sync /var/log/nodejs/rotated/ "s3://$BUCKET/${INSTANCE_ID}_${HOSTNAME}/$YEAR/$MONTH/$DAY/" --region $REGION
  endscript
}

aws s3 sync 的问题在于,如果昨天有旧日志(在旋转文件夹中保留的5个日志中),它将再次将它们上传到新文件夹中今天。

是否有一种方法可以仅获取现在旋转的文件(但位于其新位置)来进行lastaction(或logroate提供的其他脚本),所以我可以使用 aws s3 copy 代替< em> sync ?

例如: 我在lastaction上打印了args,并得到了:

/var/log/nodejs/app-out.log /var/log/nodejs/app-err.log

我想获取新位置:

/var/log/nodejs/rotated/app-out.log-20190131-1548925261.gz /var/log/nodejs/rotated/app-err.log-20190131-1548925261.gz

1 个答案:

答案 0 :(得分:0)

我找到了解决方法...

我在 aws s3 sync 命令中添加了-exclude --include 。 现在我的脚本看起来像:

/var/log/nodejs/*out.log /var/log/nodejs/*err.log {
  size 10M
  missingok
  notifempty
  rotate 5 
  sharedscripts
  compress
  copytruncate
  dateext
  dateformat -%Y%m%d-%s
  olddir /var/log/nodejs/rotated
  lastaction
    echo $@
    INSTANCE_ID="`wget -q -O - http://instance-data/latest/meta-data/instance-id`"
    HOSTNAME=`hostname`
    BUCKET="my-logs"
    REGION="us-west-2"
    read DAY MONTH YEAR <<< `date "+%d %m %Y"` 
    FORMAT=`date "+%Y%m%d"` 
    aws s3 sync /var/log/nodejs/rotated/ "s3://$BUCKET/${INSTANCE_ID}_${HOSTNAME}/$YEAR/$MONTH/$DAY/" --region $REGION --exclude "*" --include "*.log-$FORMAT*"
  endscript
}