目的
正常情况下我们的日志文件是这样的
>> 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"}
参考文章
网友评论