使用Docker中的nginx和Redis将日志挂载到主机上进行日志轮转

AWS Workspace提供了一种虚拟桌面环境,
Amazon Linux2是其中的操作系统版本,
nginx 1.16.1是使用的Web服务器软件版本,
Redis 5.0.7是使用的数据库软件版本,
blacklabelops/logrotate是用于日志轮转的工具。

mkdir -p log/nginx
mkdir -p log/redis
chmod 777 log/redis

docker run -d \
  --name nginx \
  -p 81:80 \
  -v $(pwd)/log/nginx:/var/log/nginx \
  nginx:1.16.1

docker run -d \
  --name redis \
  -p 6379:6379 \
  -v $(pwd)/log/redis:/var/log/redis \
  redis:5.0.7 bash -c "mkdir -p /var/log/redis && touch /var/log/redis/redis.log && redis-server --logfile /var/log/redis/redis.log"

docker run -d \
  --name logrotate \
  -v $(pwd)/log/nginx:/var/log/nginx \
  -v $(pwd)/log/redis:/var/log/redis \
  -e "LOGS_DIRECTORIES=/var/log/nginx/*.log /var/log/redis/*.log" \
  -e "LOGROTATE_COMPRESSION=compress" \
  -e "LOGROTATE_INTERVAL=hourly" \
  -e "LOGROTATE_CRONSCHEDULE=*/1 * * * * *" \
  -e "LOGROTATE_SIZE=10K" \
  -e "LOGROTATE_COPIES=3" \
  -e "LOGROTATE_DATEFORMAT=%Y%m%d%H%M%S" \
  blacklabelops/logrotate

检查日志轮换功能
nginx重复访问浏览器
Redis重复执行docker restart redis

ls log/nginx

access.log
access.log20191212171100
access.log20191212170255.gz
error.log
error.log20191212171056
error.log20191212170254.gz

ls log/redis

redis.log
redis.log20191212171228
redis.log20191212170728.gz

在logrotate的Docker容器内创建的文件。

我正在使用copytruncate。它不是通过重命名文件来处理,而是通过复制文件并清空原文件的”内容”来实现的。由于复制和删除过程中存在一些时间差,如果频繁进行写入操作,有可能会导致数据丢失的风险。

# deactivate mail
nomail

# move the log files to another directory?

/var/log/nginx/access.log {
 su root root
 rotate 3
 missingok
 compress
 delaycompress
 copytruncate
 hourly
 size 10K
 dateext
 dateformat %Y%m%d%H%M%S
}
/var/log/nginx/error.log {
 su root root
 rotate 3
 missingok
 compress
 delaycompress
 copytruncate
 hourly
 size 10K
 dateext
 dateformat %Y%m%d%H%M%S
}
/var/log/redis/redis.log {
 su root root
 rotate 3
 missingok
 compress
 delaycompress
 copytruncate
 hourly
 size 10K
 dateext
 dateformat %Y%m%d%H%M%S
}
bannerAds