Groups | Search | Server Info | Keyboard shortcuts | Login | Register [http] [https] [nntp] [nntps]


Groups > comp.lang.python > #57734

Re: Logging to file and not to console

From Peter Otten <__peter__@web.de>
Subject Re: Logging to file and not to console
Date 2013-10-27 11:09 +0100
Organization None
References <20131027020458.2a314eb9@hanez.org>
Newsgroups comp.lang.python
Message-ID <mailman.1644.1382868539.18130.python-list@python.org> (permalink)

Show all headers | View raw


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)

Back to comp.lang.python | Previous | Next | Find similar | Unroll thread


Thread

Re: Logging to file and not to console Peter Otten <__peter__@web.de> - 2013-10-27 11:09 +0100

csiph-web