【问题标题】:Run function after logging using the logging module in python使用 python 中的 logging 模块记录后运行函数
【发布时间】:2017-11-12 04:30:59
【问题描述】:

我想将变量增加 1 或运行一个函数,每次记录到 log - 在我的情况下为 lognum 时都会执行此操作。

lognum = 1
logger = logging.getLogger('module')
logger.setLevel(logging.DEBUG)
handler = logging.FileHandler(filename='log', encoding='utf-8', mode='w')
handler.setFormatter(logging.Formatter(f'----CHUNK {lognum}----\nLEVEL: %(levelname)s\nNAME:%(name)s\nMESSAGE:%(message)s\n----CHUNK {lognum}----\n'))
logger.addHandler(handler)

我无法在 setFormatter 之后添加代码——它只是设置了格式化程序。我已经阅读了 docs 的日志记录,找不到任何东西。

【问题讨论】:

    标签: python logging


    【解决方案1】:

    您可以使用 filters 或 py3 setLogRecordFactory 和 getLogRecordFactory 将上下文信息添加到您的日志中。

    这是一个快速而肮脏的例子:

    import sys
    import logging
    
    logger = logging.getLogger(__name__)
    COUNT = 1
    FMT = """----CHUNK %(lognum)s----
    LEVEL: %(levelname)s
    NAME:%(name)s
    MESSAGE:%(message)s
    ----CHUNK %(lognum)s----"""
    
    def main():
        logger.info('hello, world')
        logger.warning('this is a warning log')
        logger.error('this is bad!')
    
    def init_logger():
        log = logging.getLogger(__name__)
        log.setLevel(logging.INFO)
        handler = logging.StreamHandler(stream=sys.stdout)
        formatter = logging.Formatter(fmt=FMT)
        handler.setFormatter(formatter)
        log.addHandler(handler)
    
        old_factory = logging.getLogRecordFactory()
    
        def record_factory(*args, **kwargs):
            global COUNT
            record = old_factory(*args, **kwargs)
            record.lognum = COUNT
            COUNT += 1
            return record
    
        logging.setLogRecordFactory(record_factory)
    
    
    if __name__ == '__main__':
        init_logger()
        main()
    

    和输出:

    ----CHUNK 1----
    LEVEL: INFO
    NAME:__main__
    MESSAGE:hello, world
    ----CHUNK 1----
    ----CHUNK 2----
    LEVEL: WARNING
    NAME:__main__
    MESSAGE:this is a warning log
    ----CHUNK 2----
    ----CHUNK 3----
    LEVEL: ERROR
    NAME:__main__
    MESSAGE:this is bad!
    ----CHUNK 3----
    

    和here you can find 使用filters 的类似示例。

    【讨论】:

      【解决方案2】:

      仅在调试和记录期间运行某些功能的有效且快速的解决方案是使用记录器的getEffectiveLevel() 方法,

      logging.basicConfig(stream=sys.stderr, level=logging.DEBUG) # turn on the logger
      logr = logging.getLogger() # get the logger object
      
      if logr.getEffectiveLevel() == 10: # if debugging is ON
          replace_it_with_your_function() 
      

      其中数字 10 是 getEffectiveLevel() 函数返回的数值。下面给出其他有效等级的数值,

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2016-05-21
        • 2011-12-24
        • 2016-03-15
        • 2014-01-09
        • 1970-01-01
        • 2015-11-22
        • 1970-01-01
        相关资源
        最近更新 更多