重新定义根日志记录器
在我现在的项目中,有成千上万行代码,看起来像这样:
logging.info("bla-bla-bla")
我不想去改动所有这些行,但我想改变日志记录的行为。我的想法是把根日志记录器换成另一个叫做Experimental
的日志记录器,这个日志记录器是通过一个ini文件来配置的:
[loggers]
keys = Experimental
[formatter_detailed]
format = %(asctime)s:%(name)s:%(levelname)s %(module)s:%(lineno)d: %(message)s
[handler_logfile]
class = FileHandler
args = ('experimental.log', 'a')
formatter = detailed
[logger_Experimental]
level = DEBUG
qualname = Experimental
handlers = logfile
propagate = 0
现在,设置新的根日志记录器是通过这段代码来完成的:
logging.config.fileConfig(path_to_logger_config)
logging.root = logging.getLogger('Experimental')
重新定义根日志记录器安全吗?有没有更方便的方法呢?
我试着用谷歌搜索过,也看了很多StackOverflow上的问题,但没有找到答案。
2 个回答
5
logger = logging.getLogger()
如果你把名字留空,这样就会得到一个根日志记录器。
logger = logging.getLogger('name')
这样你就会得到一个新的日志记录器。
26
建议你不要像你描述的那样重新定义根日志记录器。一般来说,根日志记录器只适合在小脚本中直接使用;对于较大的应用程序,最佳做法是使用
logger = logging.getLogger(__name__)
在你使用日志记录的每个模块中,然后调用logger.info()等方法。
如果你只是想把日志记录到一个文件里,为什么不直接给根日志记录器添加一个文件处理器呢?你可以通过例如
if __name__ == '__main__':
logging.basicConfig(filename='experimental.log', filemode='w')
main() # or whatever your main entry point is called
或者通过配置文件来实现。
更新:当我说“建议你”时,我是指在这里的这个回答中给你的建议 ;-) 虽然在你的情况下可能不会遇到任何问题,但覆盖一个没有设计成可以被覆盖的模块属性并不是好做法。例如,根日志记录器是一个不同类的实例(这个类不是公共API的一部分),而且在日志记录机制中还有其他地方引用它,这些引用仍然指向旧的值。这些情况都可能导致难以调试的问题。由于日志记录包提供了多种方式来实现你想要的功能(看起来是将日志记录到文件而不是控制台),所以你应该使用这些已经提供的机制。