代码之家  ›  专栏  ›  技术社区  ›  HIT_girl

覆盖python lambdas默认日志记录格式

  •  0
  • HIT_girl  · 技术社区  · 4 年前

    我试图覆盖python lambda中的默认日志格式。关注此 blog post 简而言之,在我的lambda函数中这样做似乎很简单:

    LOGGER = logging.getLogger()
    HANDLER = LOGGER.handlers[0]
    HANDLER.setFormatter(logging.Formatter(“[%(asctime)s] %(levelname)s:%(name)s:%(message)s”, “%Y-%m-%d %H:%M:%S”))
    

    但当执行它时,我 LOGGER.handlers 其中没有处理程序。因此覆盖失败。 我尝试添加一个新 StreamHandler 使用自己的格式化程序:

    LOGGER = Logger.factory(name)
    sh = logging.StreamHandler()
    sh.setFormatter(JSONFormatter())
    LOGGER.add_handler(sh)
    

    这是可行的,但我尝试记录的每一行都有两条相同的日志行。一个来自我的习俗 流处理程序 以及一个默认的lambda格式行。 所以看起来最后我有两个处理者。

    我的问题是,我应该在哪里覆盖日志处理程序的格式——lambda什么时候添加自己的处理程序?

    0 回复  |  直到 4 年前
        1
  •  0
  •   Uriya Harpeness    4 年前

    我会在运行开始时更改默认的python格式化程序。

    import logging
    logging.Formatter.format = my_format_function
    

    我使用了相同的方法来覆盖 makeRecord 函数以包含更多元数据。

    import logging
    
    def myMakeRecord(self, name, level, fn, lno, msg, args, exc_info, func=None, extra=None, another=None):
        """
        The normal python handler does not provide all the fields, so this enriches the message and formats it for logz.io.
        """
        if extra is None:
            extra = {}
    
        extra.update({'message': msg,
                      'logger': name,
                      'line_number': lno,
                      'path_name': fn})
    
        if func is not None:
            extra.update({'func_name': func})
    
        msg = json.dumps(extra)
        extra = None
    
        return original_makeRecord(self, name, level, fn, lno, msg, args, exc_info, func=func, extra=extra)
    
    logging.Logger.makeRecord = myMakeRecord