覆盖Python日志配置

3

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

#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文件中,有没有一种方法可以覆盖这种行为?

1
模块不应该调用 logging.basicConfig。只有主程序应该在必要时调用 basicConfig 一次。(如果根记录器已经配置了处理程序,则 basicConfig 不会执行任何操作。)你能改变这个模块吗? - unutbu
那正是我也在阅读的内容:库不应配置日志记录,所以作为最后的手段,我考虑更改该库。 - AdrianS
1个回答

6

模块不应该调用 logging.basicConfig。只有主程序应该在必要时调用一次 basicConfig。根据文档,如果根记录器已经配置了句柄,则 basicConfig 不会做任何事情。

如果您无法修改 SHT1x 模块,则可以使用以下解决方法:安排 main.py 在导入 SHT1x 之前调用其 logging.basicConfig。第一个执行的 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.pyif __name__ == "__main__"中调用logging.basicConfig。这样可以保留您将main.py用作脚本和模块的能力。

我认为我首先尝试从主要配置记录器,但这并没有起作用,因为我没有改变导入(不知道你可以像那样导入)。 - AdrianS

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接