【问题标题】:Overwriting python log config覆盖python日志配置
【发布时间】:2014-09-28 16:21:15
【问题描述】:

我想使用一个外部模块,但是这个模块配置了记录器,我不知道如何覆盖它以便记录到文件

#my main.py
server = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
logging.basicConfig(filename='/home/pi/thermostat/server.log',level=logging.DEBUG)
logging.basicConfig(format='%(asctime)s %(message)s')
logger = logging.getLogger(__name__)    

termo = SHT1x(dataPin, clkPin, SHT1x.GPIO_BOARD) #this one configures the log also

def main():
    logger.info("SERVER START")
    return

if __name__ == "__main__":
    main()

我正在使用的模块正在做:

#SHT1x module
logging.basicConfig(level=logging.INFO)
logger = logging.getLogger(____name____)

def main():
    #....

if __name__ == '__main__':
    main()

所以我的程序正在记录到控制台而不是 server.log 有没有办法覆盖这种行为?

【问题讨论】:

  • 模块不应调用logging.basicConfig。如果有的话,只有主程序应该调用一次basicConfig。 (如果根记录器已经配置了处理程序,basicConfig 什么也不做。你能改变模块吗?
  • 这也是我正在阅读的内容:库不应该配置日志记录,所以是的,我想作为最后的手段来更改库。

标签: python logging module


【解决方案1】:

模块不应调用logging.basicConfig。只有主程序 如果有的话,应该调用一次basicConfigPer the docs, basicConfig 确实 如果根记录器已经配置了处理程序,则什么都没有。

如果您无法修改 SHT1x 模块,作为一种解决方法,您可以安排 为main.py 调用它的logging.basicConfig 之前 导入SHT1x。这 basicConfig 首先执行的调用将是唯一影响日志记录的调用。

def main():
    import SHT1x
    logger.info("SERVER START")
    server = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
    termo = SHT1x.somefunction(dataPin, clkPin, SHT1x.GPIO_BOARD) #this one configures the log also


if __name__ == "__main__":
    import logging
    logging.basicConfig(filename='/home/pi/thermostat/server.log',
                        level=logging.DEBUG,
                        format='%(asctime)s %(message)s')
    logger = logging.getLogger(__name__)    
    
    main()

注意:我修改了我的第一个建议,所以 main.py 调用 logging.basicConfigif __name__== "__main__" 套房内。这保留了您将main.py 用作脚本和模块的能力。

【讨论】:

  • 我想我先尝试从 main 配置记录器,但这没有用,因为我也没有更改导入(不知道你可以这样导入)
猜你喜欢
  • 2018-09-17
  • 1970-01-01
  • 2012-01-12
  • 2019-09-30
  • 1970-01-01
  • 2022-01-27
  • 1970-01-01
  • 2017-12-25
  • 1970-01-01
相关资源
最近更新 更多