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

时间:2017-09-27 17:18:00

标签: python logging flask tornado

我正在使用Flask Web框架构建一个带有Web界面的python应用程序。 它在调试/开发模式下在Flask内部服务器上运行,在生产模式下,它在龙卷风上作为wsgi容器运行。 这就是我设置记录器的方式:

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 个答案:

答案 0 :(得分:1)

AFAIK,您无法更改Flask中的默认记录器。但是,您可以将处理程序添加到默认记录器:

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

关于我上面的评论 - “你为什么要在龙卷风中运行Flask ......”,忽略它。如果您没有看到任何性能损失,那么显然无需更改您的设置。

但是,如果以后您希望迁移到多线程容器,则可以查看uwsgigunicorn

答案 1 :(得分:0)

我设法做到了,有多个处理程序,每个处理程序都在做自己的事情,因此ERROR日志也不会显示在INFO日志上,并最终导致重复的信息grrr:

app.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)

...

whatever_file_where_you_want_to_log.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())