覆盖python日志配置

Bli*_*1eg 3 python logging module

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

#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()
Run Code Online (Sandbox Code Playgroud)

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

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

def main():
    #....

if __name__ == '__main__':
    main()
Run Code Online (Sandbox Code Playgroud)

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

unu*_*tbu 5

模块不应调用logging.basicConfig. basicConfig如果有的话,只有主程序应该调用一次。根据 docsbasicConfig如果根记录器已经配置了处理程序,则不执行任何操作。

如果您不能修改 SHT1x 模块,那么作为一种解决方法,您可以安排导入 SHT1x之前main.py调用它。首先执行的调用将是唯一影响日志记录的 调用。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()
Run Code Online (Sandbox Code Playgroud)

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