我正在使用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服务器自定义日志处理程序。 任何帮助深表感谢, 提前谢谢
答案 0 :(得分:1)
AFAIK,您无法更改Flask中的默认记录器。但是,您可以将处理程序添加到默认记录器:
app = Flask('system.web.server')
app.logger.addHandler(file_handler)
app.logger.addHandler(console_handler)
关于我上面的评论 - “你为什么要在龙卷风中运行Flask ......”,忽略它。如果您没有看到任何性能损失,那么显然无需更改您的设置。
但是,如果以后您希望迁移到多线程容器,则可以查看uwsgi
或gunicorn
。
答案 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())