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) -- https://mail.python.org/mailman/listinfo/python-list