logrotate:仅将新的压缩文件移动到 S3
logrotate: move only the new compressed files to S3
我有一个生成输出和错误日志的应用程序。我需要压缩它们并在服务器上保留 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 而不是 sync?
例如:
我在最后一个动作中打印了 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
我找到了解决方案...
我在 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
}
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 您需要将实例配置文件附加到 运行ning EC2 服务器,否则 cron 作业将无法获取访问密钥(即使您分配了密钥)。如果你不是运行ning EC2那么你可以把上面的脚本分开成一个文件。
我有一个生成输出和错误日志的应用程序。我需要压缩它们并在服务器上保留 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 而不是 sync?
例如: 我在最后一个动作中打印了 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
我找到了解决方案...
我在 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
}
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 您需要将实例配置文件附加到 运行ning EC2 服务器,否则 cron 作业将无法获取访问密钥(即使您分配了密钥)。如果你不是运行ning EC2那么你可以把上面的脚本分开成一个文件。