我想使用一个外部模块,但是这个模块配置了日志记录器,我不知道如何覆盖它以便记录到文件
#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()
所以我的程序是登录到控制台而不是服务器.log
是否有方法覆盖此行为?
最佳答案
模块不应调用logging.basicConfig
只有主程序
如果需要的话,应该调用basicConfig
一次。Per the docs,basicConfig
会
如果根记录器已经配置了处理程序,则不会执行任何操作。
如果您不能修改sht1x模块,那么作为解决方法,您可以安排
用于在导入sht1x之前调用其main.py
。logging.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()
注意:我修改了我的第一个建议,因此
basicConfig
呼叫main.py
在
logging.basicConfig
套房内这保留了将if __name__== "__main__"
同时用作脚本和模块的能力。