【发布时间】:2013-02-21 15:03:18
【问题描述】:
我正在寻找有关如何完成多模块和多处理程序日志记录的具体建议。我在这里添加了我的简化代码,但我不想让答案产生偏见 - 告诉我最佳做法是什么。
我想将所有内容记录到一个文件中,然后向控制台发出警告。
这是我的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 中似乎很直观。 level2 不是独立的,所以它只有:
import logging
logger = logging.getLogger('level0.level1.level2')
def function2(foo):
logger.info('function2')
....
我从 logging.basicSetup 开始,但无法为文件设置编码并在尝试记录非 ascii 字符串时不断收到 UnicodeEncodeError:
logger.warn(u'foo bar {}'.format(NON_ASCII_STR))
(当记录器将消息传递给其父级时,我仍然收到错误消息)
那么,对于这种情况或更一般而言,最好的日志设计是什么 - 多个模块(带有编码选择 - 我想要 utf-8)
【问题讨论】:
标签: python logging character-encoding module