flask的日志记录需要用到python标准库logging的支持。
示例
# -*- coding: utf-8 -*-
from flask import Flask
import logging
app = Flask(__name__)
@app.route('/')
def root():
app.logger.info('info log')
app.logger.warning('warning log')
return 'hello'
if __name__ == '__main__':
app.debug = True
handler = logging.FileHandler('flask.log', encoding='UTF-8')
handler.setLevel(logging.DEBUG) # 设置日志记录最低级别为DEBUG,低于DEBUG级别的日志记录会被忽略,不设置setLevel()则默认为NOTSET级别。
logging_format = logging.Formatter(
'%(asctime)s - %(levelname)s - %(filename)s - %(funcName)s - %(lineno)s - %(message)s')
handler.setFormatter(logging_format)
app.logger.addHandler(handler)
app.run()
控制日志记录格式,效果如上述记录内容;在Python参考文档中有更详细的说明,这里简单介绍一下:
%(asctime)s 即日志记录时间,精确到毫秒
%(levelname)s 即此条日志级别
%(filename)s 即触发日志记录的python文件名
%(funcName)s 即触发日志记录的函数名
%(lineno)s 即触发日志记录代码的行号
%(message)s 这项即调用如app.logger.info(‘info log’)中的参数,即message
日志文件:flask.log
2019-11-08 23:18:51,769 - INFO - manager.py - root - 10 - info log
2019-11-08 23:18:51,770 - WARNING - manager.py - root - 11 - warning log
将日志输出到多个文件
示例如下,产生log1.log和log2.log两个日志文件。
同理,可以灵活地将不同模块中的日志加以区分,输出到不同文件中。例如,views.py
from __future__ import absolute_import
import logging
def setup_logger(logger_name, log_file, level=logging.INFO):
l = logging.getLogger(logger_name)
formatter = logging.Formatter('%(asctime)s : %(message)s')
fileHandler = logging.FileHandler(log_file, mode='w')
fileHandler.setFormatter(formatter)
streamHandler = logging.StreamHandler()
streamHandler.setFormatter(formatter)
l.setLevel(level)
l.addHandler(fileHandler)
l.addHandler(streamHandler)
def main():
setup_logger('log1', r'log1.log')
setup_logger('log2', r'log2.log')
log1 = logging.getLogger('log1')
log2 = logging.getLogger('log2')
log1.info('Info for log 1!')
log2.info('Info for log 2!')
log1.error('Oh, no! Something went wrong!')
if '__main__' == __name__:
main()