美文网首页
python 输出json类型日志

python 输出json类型日志

作者: tenlee | 来源:发表于2018-04-11 18:25 被阅读782次

    目的

    正常情况下我们的日志文件是这样的

    >> logging.debug("User '{}' (id: {}) changed state to verified."
                .format(user["name"], user["id"]))
    DEBUG:root:User 'arthur' (id: 42) changed state to verified.
    

    如果想要解析这样的日志格式,必须使用grok过滤器将应用程序日志解析为json对象,那么就要编写和维护grok模式并花费cpu运算来执行解析。

    为了能够让logstash或者filebeat更加快速方便的读取分析日志文件,所以当日志在结构化对象中进行预解析时,此功能效果最佳,因此您可以在各个字段中搜索和聚合。

    此处选择使用structlog类库

    代码如下:

    import logging.config
    
    import structlog
    from structlog import configure, processors, stdlib, threadlocal
    
    # logging.config.fileConfig('logconfig.ini')
    
    logging.config.dictConfig({
        'version': 1,
        'disable_existing_loggers': False,
        'formatters': {
            'json': {
                'format': '%(message)s %(lineno)d %(filename)s',
                'class': 'pythonjsonlogger.jsonlogger.JsonFormatter'
            }
        },
        'handlers': {
            'json': {
                'class': 'logging.FileHandler',
                'formatter': 'json',
                'filename': 'axx.log',
                'mode': 'a'
            }
        },
        'loggers': {
            '': {
                'handlers': ['json'],
                'level': logging.INFO
            }
        }
    })
    
    configure(
        #context_class=threadlocal.wrap_dict(dict),
        logger_factory=stdlib.LoggerFactory(),
        #wrapper_class=stdlib.BoundLogger,
        processors=[
            #stdlib.filter_by_level,
            #stdlib.add_logger_name,
            #stdlib.add_log_level,
            #stdlib.PositionalArgumentsFormatter(),
            # processors.TimeStamper(fmt="iso"),
            #processors.StackInfoRenderer(),
            #processors.format_exc_info,
            #processors.UnicodeDecoder(),
            stdlib.render_to_log_kwargs]
    )
    
    default_logger = logging.getLogger("LogDemo")
    default_logger.level = logging.INFO
    default_logger.debug("test debug msg")
    # 测试消息
    default_logger.info("test single msg")
    # 测试打印字典
    default_logger.info({"key1": "val1", "key2": "val2"})
    
    struct_logger = structlog.getLogger("LogDemo")
    # 打印log方式一,参数为key=value形式, 此时第一个参数msg必填
    struct_logger.info("event", key1=1, key2=2)
    # 打印log方式二,参数为dict形式
    struct_logger.info({"key1": "1", "key2": "2"})
    

    输出如下:

    {"asctime": "2018-04-11 18:20:29,352", "message": "event", "lineno": 55, "filename": "log.py", "some_param": 42, "logger": "LogDemo", "level": "info"}
    

    参考文章

    相关文章

      网友评论

          本文标题:python 输出json类型日志

          本文链接:https://www.haomeiwen.com/subject/gjlzhftx.html