我想从主模块和所有子模块登录到单个日志文件。
从主文件(我在其中定义记录器)发送的日志消息按预期工作。但是缺少从调用发送到导入函数的函数。
如果我使用下面的示例1中的logging.basicConfig,它将正常工作。但是允许更多自定义设置的第二个示例不起作用。
有什么想法吗?
# in the submodule I have this code import logging logger = logging.getLogger(__name__)
示例1-工作
在这里,我创建了两个处理程序,并将它们传递给basicConfig:
basicConfig
# definition of root looger in main module formatter = logging.Formatter(fmt="%(asctime)s %(name)s.%(levelname)s: %(message)s", datefmt="%Y.%m.%d %H:%M:%S") handler = logging.FileHandler('logger.log') handler.setFormatter(formatter) handler.setLevel(logging.DEBUG) handler2 = logging.StreamHandler(stream=None) handler2.setFormatter(formatter) handler2.setLevel(logging.DEBUG) logging.basicConfig(handlers=[handler, handler2], level=logging.DEBUG) logger = logging.getLogger(__name__)
示例2-无法正常工作
在这里,我创建两个处理程序,addHandler()并将它们添加到根记录器:
addHandler()
# definition of root looger in main module logger = logging.getLogger(__name__) logger.setLevel(logging.DEBUG) handler = logging.FileHandler('logger.log') handler.setFormatter(formatter) handler.setLevel(logging.DEBUG) #handler.setLevel(logging.ERROR) logger.addHandler(handler) handler = logging.StreamHandler(stream=None) handler.setFormatter(formatter) handler.setLevel(logging.DEBUG) logger.addHandler(handler)
您需要在软件的主模块中配置(唯一的)根记录器。这是通过调用
logger = logging.getLogger() #without arguments
代替
logger = logging.getLogger(__name__)
(有关记录的Python文档)
第二个示例使用您的脚本名称创建一个单独的子记录器。
如果在子模块中未定义任何处理程序,则将日志消息向下传递到根记录程序以进行处理。