美文网首页
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类型日志

    目的 正常情况下我们的日志文件是这样的 如果想要解析这样的日志格式,必须使用grok过滤器将应用程序日志解析为js...

  • json序列化中文及日期时间

    1. 中文显示Unicode python的json.dumps方法默认会输出unicode类型。 解决方法要输出...

  • Json

    json.loads() :将字符串转换为Python数据类型json.dumps() :将Python数据类型转...

  • TensorBoard可视化填坑

    TensorBoard是一个日志展示系统,首先需要将各种类型数据汇总输出到日志文件中。 然后在python的编译环...

  • json 序列化

    python 的 json 模块有个坑。一般 python 的类型都可以转化为 json 类型: 但是,pytho...

  • Python 文件处理

    一、Python处理json文本格式 读取json数组,并遍历输出

  • Vapor系列教程 - JSON

    Vapor 支持 JSON 类型,可直接使用。 JSON -> String 输出 {"double":3.14,...

  • python json模块与flask jsonify拓展包使用

    1.JSON数据格式 2.python处理JSON JSON数据格式转换成python的简单数据类型 python...

  • shell脚本输出json格式的内容

    对于shell脚本的输出,如果要输出json格式的内容,我们可以借助python -m json.tool命令比如...

  • json、多任务

    json json.loads() : 将json字符串转化为Python数据类型json.dumps() : 将...

网友评论

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

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