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