How to use Python's RotatingFileHandler

前端 未结 4 1568
一个人的身影
一个人的身影 2020-12-08 06:51

I\'m trying to do a test run of the logging module\'s RotatingFileHandler as follows:

import logging
from logging.handlers import R         


        
相关标签:
4条回答
  • 2020-12-08 07:15

    Python provides 5 logging levels out of the box (in increasing order of severity): DEBUG, INFO, WARNING, ERROR and CRITICAL. The default one is WARNING. The docs says, that

    Logging messages which are less severe than lvl will be ignored.

    So if you use .debug with the default settings, you won't see anything in your logs.

    The easiest fix would be to use logger.warning function rather that logger.debug:

    import logging
    from logging.handlers import RotatingFileHandler
    
    logger = logging.getLogger('my_logger')
    handler = RotatingFileHandler('my_log.log', maxBytes=2000, backupCount=10)
    logger.addHandler(handler)
    
    for _ in range(10000):
        logger.warning('Hello, world!')
    

    And if you want to change logger level you can use .setLevel method:

    import logging
    from logging.handlers import RotatingFileHandler
    
    logger = logging.getLogger('my_logger')
    logger.setLevel(logging.DEBUG)
    handler = RotatingFileHandler('my_log.log', maxBytes=2000, backupCount=10)
    logger.addHandler(handler)
    
    for _ in range(10000):
        logger.debug('Hello, world!')
    
    0 讨论(0)
  • 2020-12-08 07:16

    Going off of Kurt Peek's answer you can also put the rotating file handler in the logging.basicConfig directly

    import logging
    from logging.handlers import RotatingFileHandler
    logging.basicConfig(
            handlers=[RotatingFileHandler('./my_log.log', maxBytes=100000, backupCount=10)],
            level=logging.DEBUG,
            format="[%(asctime)s] %(levelname)s [%(name)s.%(funcName)s:%(lineno)d] %(message)s",
            datefmt='%Y-%m-%dT%H:%M:%S')
    
    0 讨论(0)
  • 2020-12-08 07:16

    I found that to obtain the desired behavior one has to use the same name in the basicConfig and RotatingFileHandler initializations:

    import logging
    from logging.handlers import RotatingFileHandler
    
    logging.basicConfig(filename="my_log.log", level=logging.DEBUG)
    
    logger = logging.getLogger('my_logger')
    handler = RotatingFileHandler("my_log.log", maxBytes=2000, backupCount=10)
    logger.addHandler(handler)
    
    for _ in range(10000):
        logger.debug("Hello, world!")
    

    Here, I have chose the same name my_log.log. This results in only the 'size-limited' logs being created:

    0 讨论(0)
  • 2020-12-08 07:35

    All previous answers are correct, here another way of doing the same thing except we use logging config file instead.

    logging_config.ini

    Here is the config file :

    [loggers]
    keys=root
    
    [handlers]
    keys=logfile
    
    [formatters]
    keys=logfileformatter
    
    [logger_root]
    level=DEBUG
    handlers=logfile
    
    [formatter_logfileformatter]
    format=%(asctime)s %(name)-12s: %(levelname)s %(message)s
    
    [handler_logfile]
    class=handlers.RotatingFileHandler
    level=DEBUG
    args=('testing.log','a',10,100)
    formatter=logfileformatter
    

    myScrypt.py

    here is simple logging script that uses the above config file

    import logging
    from logging.config import fileConfig
    
    fileConfig('logging_config.ini')
    logger = logging.getLogger()
    logger.debug('the best scripting language is python in the world')
    

    RESULT

    here is the result, notice maxBytes is set to 10 but in real life, that's clearly too small. (args=('testing.log','a',10,100)

    0 讨论(0)
提交回复
热议问题