插件窝 干货文章 如何滚动docker中的nginx日志文件

如何滚动docker中的nginx日志文件

Nginx Docker logrotate 日志 723    来源:    2025-04-21

滚动 Docker 中 Nginx 日志文件的方法

在 Docker 容器中滚动 Nginx 日志有多种方法,以下是几种常用方案:

方法一:使用 logrotate 工具

  1. 创建 logrotate 配置文件 (/etc/logrotate.d/nginx):

    /var/log/nginx/*.log {
       daily
       missingok
       rotate 14
       compress
       delaycompress
       notifempty
       create 0640 www-data adm
       sharedscripts
       postrotate
           [ -f /var/run/nginx.pid ] && kill -USR1 `cat /var/run/nginx.pid`
       endscript
    }
    
  2. 在 Dockerfile 中安装 logrotate:

    RUN apt-get update && apt-get install -y logrotate
    COPY nginx-logrotate /etc/logrotate.d/nginx
    
  3. 确保日志目录存在并正确挂载

方法二:使用 Docker 日志驱动

  1. 配置 Docker 使用 json-file 日志驱动并设置大小限制:

    docker run --log-driver=json-file --log-opt max-size=10m --log-opt max-file=3 nginx
    
  2. 或者在 docker-compose.yml 中配置:

    services:
     nginx:
       image: nginx
       logging:
         driver: "json-file"
         options:
           max-size: "10m"
           max-file: "3"
    

方法三:手动发送信号给 Nginx

  1. 进入容器执行:

    docker exec -it nginx_container bash -c 'kill -USR1 $(cat /var/run/nginx.pid)'
    
  2. 或者直接发送信号:

    docker kill -s USR1 nginx_container
    

方法四:使用外部挂载和 cron 任务

  1. 挂载日志目录:

    docker run -v /host/logs:/var/log/nginx nginx
    
  2. 在宿主机上设置 cron 任务:

    0 0 * * * /usr/bin/docker exec nginx_container bash -c 'mv /var/log/nginx/access.log /var/log/nginx/access-$(date +\%Y\%m\%d).log && kill -USR1 $(cat /var/run/nginx.pid)'
    

最佳实践建议

  1. 对于生产环境,推荐使用方法一(logrotate)或方法二(Docker日志驱动)
  2. 确保日志目录已正确挂载到宿主机,避免容器重启后日志丢失
  3. 考虑日志大小和保留周期,根据实际需求调整配置
  4. 对于 Kubernetes 环境,可以使用 sidecar 容器来处理日志滚动

您需要哪种更详细的实现方案?或者您有特定的环境要求需要考虑吗?