Logging to file and not to console

Peter Otten __peter__ at web.de
Sun Oct 27 06:09:08 EDT 2013


Johannes Findeisen wrote:

> Hi all,
> 
> I am going crazy with logging. I have an application which sets up
> logging after parsing the args in the main() funktion. It needs to be
> setup after parsing the args because I can set the loglevel via
> commandline flags.
> 
> I have tried many variants on how to do that but every time with an
> weird result.
> 
> What I want is logging in from all libs and really understand that doing
> this should be enough there:
> 
> from logging import getLogger
> logger = getLogger(__name__)
> 
> But, I need to setup the logger in the main() function to log only to a
> file and not to console because my application has an own shell
> interface which should not be spammed with log messages - never a
> message should show up there.
> 
> I think it should be only some few lines of code but I can't figure
> that out. The logger should be configured to have a max file size and
> rotate logfiles.
> 
> Can someone help me with this?

import logging
import logging.handlers

logger = logging.getLogger(__name__)

def levelnames():
    try:
        names = logging._nameToLevel
    except AttributeError:
        names = (name for name in logging._levelNames if isinstance(name, 
str))

def main():
    import argparse
    parser = argparse.ArgumentParser()
    parser.add_argument("--logging-file", default="tmp.log")
    parser.add_argument("--logging-level", choices=levelnames(), 
default="INFO")
    args = parser.parse_args()

    root = logging.getLogger()

    formatter = logging.Formatter(logging.BASIC_FORMAT)
    handler = logging.handlers.RotatingFileHandler(args.logging_file, 
maxBytes=100, backupCount=3)
    handler.setFormatter(formatter)

    root.addHandler(handler)
    root.setLevel(args.logging_level)

    logger.info("your info")
    logger.warn("your warning")
    logger.critical("your critical message")

if __name__ == "__main__":
    main()

Does this do what you want?
(maxBytes is probably a bit low)





More information about the Python-list mailing list