【问题标题】:How to redirect python flask werkzeug logs to a log file when using TimedRotatingHandler?使用 TimedRotatingHandler 时如何将 python flask werkzeug 日志重定向到日志文件?
【发布时间】:2015-06-25 11:05:42
【问题描述】:

我为 Flask 服务器创建了 TimedRotatingHandler。但是 werkzeug 生成的所有日志仍然会扔到控制台上。

如何将这些日志重定向到具有日志轮换功能的日志文件(test.log)。

代码sn-p:

log = logging.getLogger(__name__)
log.setLevel(logging.DEBUG)
# add a file handler
fh = logging.handlers.TimedRotatingFileHandler("test.log",when='M',interval=1,backupCount=0)
fh.setLevel(logging.DEBUG)
# create a formatter and set the formatter for the handler.
frmt = logging.Formatter('%(asctime)s - %(levelname)s - %(message)s')
fh.setFormatter(frmt)
# add the Handler to the logger
log.addHandler(fh)
app.run(host='0.0.0.0', debug=True)

控制台上仍然抛出以下日志。

* Running on http://0.0.0.0:5000/ (Press CTRL+C to quit)
* Restarting with stat
192.168.1.6 - - [25/Jun/2015 07:11:13] "GET / HTTP/1.1" 200 -
192.168.1.6 - - [25/Jun/2015 07:11:13] "GET /static/js/jquery-1.11.2/jquery-1.11.2.min.js HTTP/1.1" 304 -
192.168.1.6 - - [25/Jun/2015 07:11:13] "GET /static/js/main/main.js HTTP/1.1" 304 -
192.168.1.6 - - [25/Jun/2015 07:11:13] "GET /favicon.ico HTTP/1.1" 404 -

将日志文件处理程序添加到 werkzeug 记录器也无法解决问题

logging.getLogger('werkzeug').addHandler(fh);

【问题讨论】:

    标签: python logging


    【解决方案1】:

    要更改 werkzeung 日志记录,您需要覆盖 logging.root.handler,例如:

    import logging
    from logging.handlers import RotatingFileHandler
    
    handler = RotatingFileHandler('log.log', maxBytes=10000, backupCount=1)
    handler.setLevel(logging.ERROR)
    
    logging.root.handlers = [handler]
    

    详情请参阅here

    【讨论】:

    • 真的不明白为什么这被低估了。 :|
    【解决方案2】:

    看起来 werkzeug 将消息发送到根记录器而不是命名记录器。

    如果您尝试这样做,它应该会开始记录到您的文件 logging.getLogger().addHandler(fh)

    如果您希望它停止记录到控制台,那么您必须从根记录器中删除流处理程序。您可以使用

    查看根记录器的处理程序

    >>> print logging.getLogger().handlers [<logging.StreamHandler object at 0x.....>, logging.handlers.TimedRotatingFileHandler object at 0x.....>]

    【讨论】:

      【解决方案3】:

      为了将烧瓶服务器/应用程序日志定向到文件处理程序并将 werkzeug 定向到同一文件处理程序,您可能需要执行以下操作。

      handler = RotatingFileHandler('test.log', maxBytes=1000000, backupCount=5)
      handler.setLevel(logging.DEBUG)
      app.logger.addHandler(handler)
      log = logging.getLogger('werkzeug')
      log.setLevel(logging.DEBUG)
      log.addHandler(handler)
      app.run(host='0.0.0.0', debug=True)
      

      【讨论】:

      • 这个对我有用。对 werkzeug 使用相同的处理程序确实允许将内部日志(使用客户端 IP)重定向到日志。
      【解决方案4】:

      addHandler 不能解决这个问题。一个记录器可以有多个处理程序。

      from logging.config import dictConfig
      
      dictConfig({
          'version': 1,
          'handlers': {
              'file.handler': {
                  'class': 'logging.handlers.RotatingFileHandler',
                  'filename': 'test.log',
                  'maxBytes': 4194304,  # 4 MB
                  'backupCount': 10,
                  'level': 'DEBUG',
              },
          },
          'loggers': {
              'werkzeug': {
                  'level': 'DEBUG',
                  'handlers': ['file.handler'],
              },
          },
      })
      

      顺便说一句,这根本不是问题。在开发环境中,登录控制台很方便。在生产模式下,应用程序不会在控制台中运行。

      【讨论】:

      • 这是唯一可以在没有访问 Flask.app 且在开始之前工作的解决方案。添加格式化程序需要几周时间。
      【解决方案5】:

      我找到了主要问题,就是应该把app.run(debug=True)去掉,换成app.run(),因为flask werkzeug用同样的方法在网页上显示美化的错误。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2016-10-07
        • 2017-03-26
        • 1970-01-01
        • 2017-01-03
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多