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

问题描述 投票:0回答:2

我有一个生成输出和错误日志的应用程序。我需要压缩它们并在服务器上保留 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 同步的问题是,如果有昨天的旧日志(在旋转文件夹中保留的 5 个日志中),它会将它们再次上传到今天的新文件夹。

有没有办法只进入lastaction(或logroate提供的其他脚本)现在旋转的文件,但在新位置,所以我可以使用aws s3 copy而不是sync

例如: 我在最后一个操作中打印参数,并得到:

/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
linux shell amazon-s3 aws-cli logrotate
2个回答
1
投票

我找到了解决方案...

我将 --exclude --include 添加到 aws s3sync 命令。 现在我的脚本看起来像:

/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
}

0
投票

logrotate 不运行 bash,所以这是我的脚本

/home/ubuntu/logs/*log {
    copytruncate
    daily
    dateext
    rotate 30
    compress
    missingok
    su root root
    lastaction
            HOSTNAME=$(hostname -f)
            DD=$(date +%d)
            MM=$(date +%m)
            YYYY=$(date +%Y)
            BUCKET="s3://s3-logs-archive/$YYYY/$MM/$DD/$HOSTNAME/"
            FILE="/home/ubuntu/logs/batch.log-$YYYY$MM$DD"
            /usr/local/bin/aws s3 cp "$FILE" "$BUCKET"
    endscript
}

重要

为了运行 aws s3 cp,您需要将实例配置文件附加到正在运行的 EC2 服务器,否则 cron 作业将无法获取访问密钥(即使您分配了该密钥)。如果您没有运行 EC2,那么您可以将上述脚本分离到一个文件中。

© www.soinside.com 2019 - 2024. All rights reserved.