Restart logging to a new file (Python)

18,321

Solution 1

You can manually re-assign the handler if you want using the removeHandler and addHandler OR, you can access logger.handlers[index_of_handler_here].stream and replace the stream manually, but I'd recommend the former over the latter.

logger.handlers[0].stream.close()
logger.removeHandler(logger.handlers[0])

file_handler = logging.FileHandler(filename)
file_handler.setLevel(logging.DEBUG)
formatter = logging.Formatter("%(asctime)s %(filename)s, %(lineno)d, %(funcName)s: %(message)s")
file_handler.setFormatter(formatter)
logger.addHandler(file_handler)

Solution 2

Here is what I do:

def initLogging(filename):
    global logger
    if logger == None:
        logger = logging.getLogger()
    else:  # wish there was a logger.close()
        for handler in logger.handlers[:]:  # make a copy of the list
            logger.removeHandler(handler)

    logger.setLevel(logging.DEBUG)
    formatter = logging.Formatter(fmt='%(asctime)s: %(message)s', datefmt='%I:%M:%S')

    fh = logging.FileHandler(filename)
    fh.setFormatter(formatter)
    logger.addHandler(fh)

    sh = logging.StreamHandler(sys.stdout)
    sh.setFormatter(formatter)
    logger.addHandler(sh)
Share:
18,321

Related videos on Youtube

compie
Author by

compie

Updated on November 03, 2020

Comments

  • compie
    compie over 3 years

    I'm using the following code to initialize logging in my application:

    logger = logging.getLogger()
    logger.setLevel(logging.DEBUG)
    
    # log to a file
    directory = '/reserved/DYPE/logfiles'
    now = datetime.now().strftime("%Y%m%d_%H%M%S")
    filename = os.path.join(directory, 'dype_%s.log' % now)
    file_handler = logging.FileHandler(filename)
    file_handler.setLevel(logging.DEBUG)
    formatter = logging.Formatter("%(asctime)s %(filename)s, %(lineno)d, %(funcName)s: %(message)s")
    file_handler.setFormatter(formatter)
    logger.addHandler(file_handler)
    
    # log to the console
    console_handler = logging.StreamHandler()
    level = logging.INFO
    console_handler.setLevel(level)
    logger.addHandler(console_handler)
    
    logging.debug('logging initialized')
    

    How can I close the current logging file and restart logging to a new file?

    Note: I don't want to use RotatingFileHandler, because I want full control over all the filenames.

  • MD004
    MD004 almost 7 years
    Is the if statement and global variable necessary? logging.getLogger() will always return the same instance (effectively getting the global variable's value for you)

Related