我正在寻找有关如何完成多模块和多处理程序日志记录的具体建议。我在这里添加了我的简化代码,但我不想让答案产生偏见 - 告诉我最佳实践是什么。
我想将所有内容记录到文件中,并警告及以上到控制台。
这是我level0.py
希望它记录到指定文件的内容:
import logging
from flask import Flask
from level1 import function1
app = Flask(__name__)
logger = logging.getLogger('logger0')
logger.setLevel(logging.DEBUG)
file_handler = logging.FileHandler('../logs/logger0','w','utf-8')
file_handler.setLevel(logging.DEBUG)
file_format = logging.Formatter('%(asctime)s %(levelname)s: %(message)s [in %(pathname)s:%(lineno)d in %(funcName)s]')
file_handler.setFormatter(file_format)
logger.addHandler(file_handler)
console_handler = logging.StreamHandler()
console_handler.setLevel(logging.INFO)
console_format = logging.Formatter('%(message)s')
console_handler.setFormatter(console_format)
logger.addHandler(console_handler)
@app.route('/', methods=['GET', 'POST'])
def function0(foo):
bar = function1(foo)
logger.debug('function0')
...
此外,level1
当作为脚本调用时,它可以是一个独立的模块。在这种情况下,我希望它记录到另一个文件中。下面是level1.py
(有重复的日志记录行):
import logging
logger = logging.getLogger('level0.level1')
from level2 import function2
def function1(foo):
bar = function2(foo)
logger.debug('function1')
...
if __name__ == "__main__":
logger = logging.getLogger('logger0')
logger.setLevel(logging.DEBUG)
file_handler = logging.FileHandler('../logs/logger1','w','utf-8')
file_handler.setLevel(logging.DEBUG)
file_format = logging.Formatter('%(asctime)s %(levelname)s: %(message)s [in %(pathname)s:%(lineno)d in %(funcName)s]')
file_handler.setFormatter(file_format)
logger.addHandler(file_handler)
console_handler = logging.StreamHandler()
console_handler.setLevel(logging.INFO)
console_format = logging.Formatter('%(message)s')
console_handler.setFormatter(console_format)
logger.addHandler(console_handler)
bar = function1('foo')
logger.info('level1 main')
...
我从 复制了这个日志记录块level0
,因为我想要相同的日志记录,而且将它放在 main.js 中似乎很直观。level2
不是独立的,所以它只有:
import logging
logger = logging.getLogger('level0.level1.level2')
def function2(foo):
logger.info('function2')
....
我从 开始logging.basicSetup
,但无法为文件设置编码,并且UnicodeEncodeError
在尝试记录非 ascii 字符串时不断获取:
logger.warn(u'foo bar {}'.format(NON_ASCII_STR))
(当记录器将消息传递给其父母时,我仍然收到错误消息)
那么,对于这种情况或更普遍的情况,最好的日志设计是什么 - 多个模块(带有编码选择 - 我想要 utf-8)