blitzqwe
blitzqwe

Reputation: 2040

Overwriting python log config

I want to use an external module but this module configures the logger and I don't know how to overwrite it in order to log to file

#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()

And the module i am using is doing:

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

def main():
    #....

if __name__ == '__main__':
    main()

So my program is logging to console not to server.log Is there a way to overwrite this behavior?

Upvotes: 4

Views: 3890

Answers (1)

unutbu
unutbu

Reputation: 879351

Modules should not be calling logging.basicConfig. Only the main program should call basicConfig once, if at all. Per the docs, basicConfig does nothing if the root logger already has handlers configured.

If you can not modify the SHT1x module, then as a workaround, you could arrange for main.py to call its logging.basicConfig before importing SHT1x. The basicConfig call that executes first will be the only one that affects logging.

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()

Note: I've modified my first suggestion so main.py calls logging.basicConfig inside the if __name__== "__main__" suite. This preserves your ability to use main.py as both a script and a module.

Upvotes: 7

Related Questions