【问题标题】:How to enable logrotation for traefik?如何为 traefik 启用 logrotation?
【发布时间】:2018-03-23 13:08:25
【问题描述】:

如何为日志文件启用日志轮换,例如访问日志。

这是内置的吗?

文档只说“这允许日志由外部程序旋转和处理,例如 logrotate”

【问题讨论】:

    标签: traefik


    【解决方案1】:

    如果您在 Docker 容器中运行 Traefik,那么您可以执行以下操作:

    检查是否安装了 logrotate

    logrotate --version
    

    在 /etc/logrotate.d/ 中创建文件

    vi /etc/logrotate.d/traefik
    

    放下面的脚本,别忘了填写容器名。

    /var/log/traefik/*.log {
      size 10M
      rotate 5
      missingok
      notifempty
      postrotate
        docker kill --signal="USR1" <container-name>
      endscript
    }
    

    快跑!

    logrotate /etc/logrotate.conf --debug 
    logrotate /etc/logrotate.conf
    

    【讨论】:

    • 这也适用于 Traefik 在 Docker 外部运行的情况,在这种情况下应该调整以 docker 开头的行。我将 Traefik 配置为 Systemd 服务,并将命令设置为 systemctl kill --signal="USR1" traefik
    • 对我来说,它不适用于信号名称周围的引号,我不得不删除它们:systemctl kill --signal=USR1 traefik。我不知道为什么,但是在 docker 参考中it is used in this way
    【解决方案2】:

    日志轮换

    Traefik 将在收到USR1 信号时关闭并重新打开其日志文件(假设它们已配置)。这允许日志由外部程序轮换和处理,例如logrotate

    https://docs.traefik.io/v1.6/configuration/logs/#log-rotation

    【讨论】:

    • 嗨,我在单个 docker 主机上使用了这种方法,在 logrotate 的 postrotate 中使用了“docker-compose restart”。但是在 swarm 模式下,重启服务的方法是使用“docker service update --force traefik”。在这种情况下,服务会在参与 swarm 的每个主机中重新启动,但不会在每个主机上轮换日志。我错过了什么吗?
    • “假设它们已配置,收到 USR1 信号”我无法弄清楚这意味着什么。因此,每次 logrotation 旋转时,都会出现一个新的空“access.log”文件,并且日志记录不再可见。我做错了什么?
    • @RobertLachner 我也经历过。在我的 docker-compose.yml 文件中,我将日志文件单独导出到主机系统。当我停止这样做并改为导出目录时(告诉 traefik 将日志文件放在这里),问题就消失了。也许这会对你有所帮助。
    • 它现在适用于我之前提到的配置。只需将此配置添加到“/etc/logrotate.d/traefik”即可使用以下命令进行测试:logrotate /etc/logrotate.d/traefik --debug
    【解决方案3】:

    似乎没有内置 logrotation,所以我在安装了traefik_access.log 的主机上启用了 logrotation。

    为了让 traefik 在 docker 容器中运行时能够正常工作,您必须卷挂载包含日志文件 (/opt/traefik/logs) 的目录,而不是日志文件本身 (/traefik_access.log)。

    volumes:
      - /opt/traefik/logs:/logs
    

    我的 traefik 1.7.4 的 logrotate-config 在容器中运行,卷挂载到“/opt/traefik/logs”:

    /opt/traefik/logs/*.log {
      daily
      rotate 30
      missingok
      notifempty
      compress
      dateext
      dateformat .%Y-%m-%d
      create 0644 root root
      postrotate
      docker kill --signal="USR1" $(docker ps | grep traefik | awk '{print $1}')
      endscript
    }
    

    【讨论】:

    • 只是提到要注意其他容器的名称中也可能包含“traefik”组件 - 例如错误页面等,并且 sub 可能会返回一些意想不到的结果
    • 如果你想使用准确的名称,你可以使用docker kill --signal="USR1" $(docker ps | grep '\btraefik\b' | awk '{print $1}') - 注意容器名称前后的\b
    猜你喜欢
    • 1970-01-01
    • 2018-06-30
    • 2020-11-11
    • 1970-01-01
    • 1970-01-01
    • 2020-09-18
    • 1970-01-01
    • 2019-02-22
    • 2019-02-06
    相关资源
    最近更新 更多