对于由许多部分组成的模块,我使用文档中推荐的方法,每个模块只有一行
logger =logging.getLogger(__name__)。正如您所指出的,该模块不应该知道或关心其消息的去向或位置,它只是将其传递给应该由主程序设置的记录器。
为了减少依赖于主程序的剪切粘贴,请确保您的模块具有合理的层次结构,并且仅在某个地方设置了日志记录功能,然后您可以通过任何希望的主程序调用该函数。
例如,制作一个logsetup.py:
import loggingdef configure_log(level=None,name=None): logger = logging.getLogger(name) logger.setLevel(level) file_handler = logging.FileHandler('../logs/%s' % name,'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)要使您的各个模块具有充当主模块的模式,请定义一个单独的函数,例如
main。
在level0.py和/或level1.py中:
def main(): # do whatever
在最顶层的程序中,调用该函数:
import loggingfrom logsetup import configure_logconfigure_log(logging.DEBUG,'level0') # or 'level1'from level0 import main # or level1if __name__ == "__main__" main()
您仍然应该在
__name__ == "__main__"那里找到该子句,某些模块( cough multiprocessing cough
)的行为取决于该子句是否存在而有所不同。



