[英]Redefining logging root logger
在我目前的项目中,有数千个代码行,如下所示:
logging.info("bla-bla-bla")
我不想改变所有这些行,但我会改变日志行为。 我的想法是将根记录器更改为其他Experimental
记录器,它由ini-file配置:
[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问题,但我没有找到答案。
建议您不要以您描述的方式重新定义根记录器。 通常,您只应将根记录器直接用于小脚本 - 对于较大的应用程序,最佳做法是使用
logger = logging.getLogger(__name__)
在每个使用日志记录的模块中,然后调用logger.info()等。
如果您只想记录到文件,为什么不直接向根记录器添加文件处理程序? 你可以用eg
if __name__ == '__main__':
logging.basicConfig(filename='experimental.log', filemode='w')
main() # or whatever your main entry point is called
或通过配置文件。
更新:当我说“你被告知”时,我的意思是我,在这个答案中;-)虽然你可能没有在你的场景中遇到任何问题,但是覆盖一个尚未出现的模块属性并不是一个好习惯。旨在被覆盖。 例如,根记录器是不同类的实例(不是公共API的一部分),并且在日志记录机器中还有其他对它的引用,它仍将指向旧值。 这些事实中的任何一个都可能导致难以调试的问题。 由于日志包允许多种方式来实现您想要的内容(貌似,记录到文件而不是控制台),因此您应该使用已提供的那些机制。
logger = logging.getLogger()
保留名称为空将返回根记录器。
logger = logging.getLogger('name')
给你另一个记录器。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.