【问题标题】:Logging with multiple parameters in python在 python 中使用多个参数进行日志记录
【发布时间】:2019-02-08 13:00:15
【问题描述】:

在 python 日志模块中,日志使用以下格式:

formatter = logging.Formatter('%(asctime)s - %(name)s - %(levelname)s - %(message)s')

**simple_example.py**
# 'application' code
logger.debug('debug message')
logger.info('info message')
logger.warning('warn message')

输出如下:

输出:

2005-03-19 15:10:26,618 - simple_example - DEBUG - debug message
2005-03-19 15:10:26,620 - simple_example - INFO - info message
2005-03-19 15:10:26,695 - simple_example - WARNING - warn message

我只是想知道是否有任何方法可以添加多条消息,而不是在最后,而是在两者之间,例如

 My custom message 1  - simple_example - DEBUG - my custom message 2

有什么办法可以像这样格式化:

formatter = logging.Formatter('%(message1)s - %(name)s - %(levelname)s - %(message2)s')

任何帮助将不胜感激

【问题讨论】:

    标签: python logging formatting


    【解决方案1】:

    您可以编写自己的 Formatter 类并将您的额外消息作为 kwargs 传递:

    import logging
    
    class MyFormatter(logging.Formatter):
        def format(self, record):
            record.message2 = record.args.get("message2")
            return super().format(record)
    
    logger = logging.getLogger('test')
    ch = logging.StreamHandler()
    formatter = MyFormatter('%(asctime)s - %(message2)s - %(name)s - %(levelname)s - %(message)s')
    ch.setFormatter(formatter)
    ch.setLevel(logging.ERROR)
    logger.addHandler(ch)
    
    logger.error("debug message", {"message2": "Blub"})
    

    输出:

    2019-02-08 14:33:50,487 - Blub - 测试 - 错误 - 调试消息


    编辑:我不知道,为什么这对于 INFO 级别的开箱即用不起作用,但您可以执行以下操作:

    import logging
    
    class MyFormatter(logging.Formatter):
        def format(self, record):
            record.message2 = record.args.get("message2")
            return super().format(record)
    
    logger = logging.getLogger('test')
    ch = logging.StreamHandler()
    ch.setFormatter(MyFormatter('%(asctime)s - %(message2)s - %(name)s - %(levelname)s - %(message)s'))
    logging.basicConfig( level=logging.INFO, handlers=[ch] )
    
    logger.info("debug message", {"message2": "Blub"})
    

    输出:

    2019-02-11 12:53:17,014 - Blub - 测试 - INFO - 调试消息


    编辑 2: 要使此功能在不提供带有 message2 的 dict 的情况下工作,您可以按如下方式更改代码:

    import logging
    
    class MyFormatter(logging.Formatter):
        def format(self, record):
            record.message2 = ""
            if(record.args):
                record.message2 = record.args.get("message2", "Fallback Value")
            return super().format(record)
    
    logger = logging.getLogger('test')
    ch = logging.StreamHandler()
    ch.setFormatter(MyFormatter('%(asctime)s - %(message2)s - %(name)s - %(levelname)s - %(message)s'))
    logging.basicConfig( level=logging.INFO, handlers=[ch] )
    
    logger.info("debug message", {"message2": "Blub"})
    logger.info("This is my sample log")
    logger.info("This is my sample log", {"hello": "World"})
    

    输出:

    2019-02-11 13:20:53,419 - Blub - test - INFO - debug message
    2019-02-11 13:20:53,419 -  - test - INFO - This is my sample log
    2019-02-11 13:20:53,419 - Fallback Value - test - INFO - This is my sample log
    

    【讨论】:

    • 感谢发布示例,只是想知道为什么它不能与 setLevel as INFO 一起使用,即 ch.setLevel(logging.INFO) & logger.info("Message")
    • 再次感谢,我要做的最后一件事是,如果我这样编辑,那么我的默认日志消息不起作用,即 logger.info("This is my sample log") 给出me AttributeError : 'tuple' 对象没有属性 'get'
    【解决方案2】:

    你可以创建你的记录器类并用这个来装饰你的方法:

    @staticmethod
    def combine(func):
        def wrapped(self, *args, **kwargs):
            for i,v in enumerate(args):
                if v:
                    func(self,f"\n {chr(i+65)} : {v}",**kwargs)
     
        return wrapped
    

    示例:

    import logging
    
    
    class my_log():
        def __init__(self, name, debug=True):
            self.logger = logging.getLogger(name)
            self.logger.setLevel(logging.DEBUG)
            formatter = logging.Formatter("%(asctime)s;%(levelname)s;%(message)s",
                                          "%Y-%m-%d %H:%M:%S")
            path = 'log.txt'
            try:
                fh = logging.FileHandler(path, 'a')
            except FileNotFoundError:
                fh = logging.FileHandler(path, 'w')
            fh.setFormatter(formatter)
            fh.setLevel(logging.DEBUG)
            self.logger.addHandler(fh)
            if debug:
                # create console handler and set level to debug
                ch = logging.StreamHandler()
                ch.setLevel(logging.DEBUG)
                # add formatter to ch
                ch.setFormatter(formatter)
                # add ch to logger
                self.logger.addHandler(ch)
                self.logger.removeHandler(fh)
    
        @staticmethod
        def combine(func):
            def wrapped(self, *args, **kwargs):
                for i, v in enumerate(args):
                    if v:
                        func(self, f"\n {chr(i+65)} : {v}", **kwargs)
    
            return wrapped
    
        def get_logger(self) -> logging.Logger:
            return self.logger
    
        @combine
        def debug(self, string: str):
            self.logger.debug(string)
    
    
    l = my_log("test")
    l.debug(1, 2, 3, 4)
    
    

    输出:

    2022-01-24 21:23:59;DEBUG;
     A : 1
    2022-01-24 21:23:59;DEBUG;
     B : 2
    2022-01-24 21:23:59;DEBUG;
     C : 3
    2022-01-24 21:23:59;DEBUG;
     D : 4
    

    【讨论】:

      【解决方案3】:

      您好,您可以直接在Formatter 中使用您的自定义消息,并使用%(message)s 放置您的日志消息

      见下例

      formatter = logging.Formatter('My custome message 1 - %(name)s - %(levelname)s - %(message)s my custom message 2')
      

      【讨论】:

      • 自定义消息的含义意味着它每次都会包含不同的值,因此这不是一个正确的答案
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2021-02-27
      • 2014-11-06
      • 1970-01-01
      • 2016-08-12
      • 1970-01-01
      • 2014-01-09
      • 1970-01-01
      相关资源
      最近更新 更多