Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Duplicate log entries and locked log files in Spyder IDE

What I want: My python script runs, output logging messages to both the console and to a file.

Once the python script finishes running, I want to be able to delete/edit the logging file. I am using Spyder IDE on Windows7.

Example code:

import logging

logging.basicConfig(level=logging.INFO)
logger = logging.getLogger(__name__)
logger.setLevel(logging.INFO)

hdlr = logging.FileHandler("/Users/mds/Dropbox/_python/logger-debug.txt")
logger.addHandler(hdlr) 

logger.error("Am I duplicating error entries?")

hdlr.close()

Problems I'm having:

  1. After the script finishes running, there is still a lock on the file enter image description here

  2. Each time I run the script the log file grows many duplicate entries.

first time I run the script:

console:

runfile('C:/Users/mds/Dropbox/_python/logger-debugger.py', wdir='C:/Users/mds/Dropbox/_python')
ERROR:__main__:Am I duplicating error entries?

logger-debug.txt:

Am I duplicating error entries?

Second time I run the script: console:

runfile('C:/Users/mds/Dropbox/_python/logger-debugger.py', wdir='C:/Users/mds/Dropbox/_python')
ERROR:__main__:Am I duplicating error entries?

logger-debug.txt

Am I duplicating error entries?
Am I duplicating error entries?
Am I duplicating error entries?

third time I run the script:

console:

runfile('C:/Users/mds/Dropbox/_python/logger-debugger.py', wdir='C:/Users/mds/Dropbox/_python')
ERROR:__main__:Am I duplicating error entries?

logger-debug.txt

Am I duplicating error entries?
Am I duplicating error entries?
Am I duplicating error entries?
Am I duplicating error entries?
Am I duplicating error entries?
Am I duplicating error entries?
like image 733
user3556757 Avatar asked Jan 01 '16 09:01

user3556757


2 Answers

apparently merely closing the handler is not enough. It also needs to be removed from the logger instance.

So now the final correct example is:

import logging

logging.basicConfig(level=logging.INFO)
logger = logging.getLogger(__name__)
logger.setLevel(logging.INFO)

"""remember to close this handler at finish!!!"""
hdlr = logging.FileHandler("/Users/mds/Dropbox/_python/logger-debug.txt")
logger.addHandler(hdlr) 


logger.error("Am I duplicating error entries?")

hdlr.close()
logger.removeHandler(hdlr)

Notice the logger.removeHandler(hdlr) in the new version.

So this cured the problem of locked files. It also cured the problem of multiple runs of the script writing the same log messages several times. Now it's apparent that was happening because there were multiple filehandlers still linked to that logger instance (main), so many handlers simultaneously wrote the same error message. This means I do not have to use overwrite filemode, I can use append filemode too.

I saw an old Stack Overflow message that had this bit of code for deleting all handlers.

handlers = logger.handlers[:]
for handler in handlers:
    handler.close()
    logger.removeHandler(handler)
like image 82
user3556757 Avatar answered Sep 24 '22 17:09

user3556757


Spyder IDE uses persistent instances of Python that you may run scripts in and interact with. Each time you run the script, the same instance is used - No objects are cleared.

The log duplication is caused because you're effectively adding multiple handlers to the same logger.

The lock will be present until you close and remove all handlers, or you kill the Python instance/"tab".

like image 25
Alastair McCormack Avatar answered Sep 22 '22 17:09

Alastair McCormack