Python 跨模块日志记录

6 投票
1 回答
2310 浏览
提问于 2025-04-17 01:20

我在网上查了很多资料,也看了默认的文档,但我还是搞不明白为什么这段代码没有输出三行日志:

# main.py
import logging
import apple
import banana

log = logging.getLogger('main')
log.setLevel(logging.DEBUG)

ch = logging.StreamHandler()
ch.setLevel(logging.DEBUG)

formatter = logging.Formatter('%(asctime)s - %(name)s - %(levelname)s - %(message)s')
ch.setFormatter(formatter)

log.addHandler(ch)

log.info("I'm in main!")
    # apple.py
    import logging
    
    log = logging.getLogger('main.apple')
    log.info("I'm here in apple!")
    
      # banana.py
      import logging
      
      log = logging.getLogger('main.banana')
      log.info("I'm here in banana!")
      
        # output
        2011-09-03 16:40:54,062 - main - INFO - I'm in main!
        

        但是在日志文档中的例子却运行得很好。

        有没有什么想法?

        1 个回答

        9

        这个处理器(StreamHandler)是在导入模块之后才设置的。所以在导入的模块里,日志记录的命令不会有任何输出。有些处理器会把信息写入文件,有些则通过网络传输,还有一些会在控制台上显示。如果在导入的模块里使用的日志记录语句没有添加处理器到记录器上,它们根本不知道该怎么做。

        如果模块里的日志记录语句是在一个类或函数里面,就像你提到的例子那样,那么当调用这个类或函数的时候,就能看到输出,因为到那时,处理器已经被添加到记录器上了。

        撰写回答