代码之家  ›  专栏  ›  技术社区  ›  SergiX44

如何在python flask tornado应用程序中管理多个记录器

  •  2
  • SergiX44  · 技术社区  · 7 年前

    它在Flask内部服务器上以调试/开发模式运行,在生产模式下作为wsgi容器在tornado上运行。 以下是我设置记录器的方式:

    log_formatter = logging.Formatter('%(asctime)s [%(levelname)s] %(message)s')
    
    file_handler = logging.handlers.RotatingFileHandler(LOG_FILE, maxBytes=5 * 1024 * 1024, backupCount=10)
    file_handler.setFormatter(log_formatter)
    
    console_handler = logging.StreamHandler(sys.stdout)
    console_handler.setFormatter(log_formatter)
    
    log = logging.getLogger('myAppLogger')
    log.addHandler(file_handler)
    log.addHandler(console_handler)
    

    为了将我的记录器添加到Flask应用程序,我尝试了以下方法:

    app = Flask('system.web.server')
    app.logger_name = 'myAppLogger'
    

    但是日志仍然会转到Flask默认的日志处理程序,此外,我还没有找到如何为Tornado web服务器自定义日志处理程序。 非常感谢您的帮助, 提前感谢

    2 回复  |  直到 7 年前
        1
  •  2
  •   xyres    7 年前

    好了,你不能更改Flask中的默认记录器。但是,您可以将处理程序添加到默认记录器:

    app = Flask('system.web.server')
    app.logger.addHandler(file_handler)
    app.logger.addHandler(console_handler)
    

    关于我的上述评论- “你为什么要在龙卷风中运行烧瓶…” ,忽略这一点。如果您没有看到任何性能下降,那么显然没有必要更改您的设置。

    uwsgi gunicorn .

        2
  •  0
  •   NaturalBornCamper    4 年前

    我设法做到了这一点,多个处理程序,每个处理程序都在做自己的事情,因此错误日志也不会显示在信息日志上,并以重复的信息grrr结束:

    应用程序。py公司

    import logging
    from logging.handlers import RotatingFileHandler
    
    app = Flask(__name__)
    
    # Set format that both loggers will use:
    formatter = logging.Formatter("[%(asctime)s] {%(pathname)s:%(lineno)d} %(levelname)s - %(message)s")
    
    # Set logger A for known errors
    log_handler = RotatingFileHandler('errors.log', maxBytes=10000, backupCount=1)
    log_handler.setFormatter(formatter)
    log_handler.setLevel(logging.INFO)
    a = logging.getLogger('errors')
    a.addHandler(log_handler)
    
    # Set logger B for bad exceptions
    exceptions_handler = RotatingFileHandler('exceptions.log', maxBytes=10000, backupCount=1)
    exceptions_handler.setFormatter(formatter)
    exceptions_handler.setLevel(logging.ERROR)
    b = logging.getLogger('exceptions')
    b.addHandler(exceptions_handler)
    
    ...
    

    无论你想把什么文件记录在哪里。py公司

    import logging
    import traceback
    
    # Will output known error messages to 'errors.log'
    logging.getLogger('errors').error("Cannot connect to database, timeout")
    
    # Will output the full stack trace to 'exceptions.log', when trouble hits the fan
    logging.getLogger('exceptions').error(traceback.format_exc())