这两天在优化公司一个python的项目,顺便研究了一下如何将python日志转成json格式,原来在Java的项目中搞过类似的事情,知道日志转成json之后有很多便利的之处,最常见的就是可以直接对接各种日志分析系统,如开源的ELK,将数据导入之后就能快速的进行查询和分析,方便做各种统计,监控或报警等。
python里面的logging组件,其实已经是组件化了,有Logger组件,Handler组件,Fomatter组件,如下图所示:
logger=>handler=>formatter分别是一对多的关系,日志的格式其实是由formatter决定的,所以想要扩展成你想要的各种格式,就重写定制formatter组件就可以了,它实际上和Java里面Log4j的LayOut组件类似。
核心代码如下:
```python
REMOVE_ATTR = ["filename", "module", "exc_text", "stack_info", "created", "msecs", "relativeCreated", "exc_info", "msg"]
class JSONFormatter(logging.Formatter):
host_name, host_ip = HostIp.get_host_ip()
def format(self, record):
extra = self.build_record(record)
self.set_format_time(extra) # set time
self.set_host_ip(extra) # set host name and host ip
extra['message'] = record.msg # set message
if record.exc_info:
extra['exc_info'] = self.formatException(record.exc_info)
if self._fmt == 'pretty':
return json.dumps(extra, indent=1, ensure_ascii=False)
else:
return json.dumps(extra, ensure_ascii=False)
@classmethod
def build_record(cls, record):
return {
attr_name: record.__dict__[attr_name]
for attr_name in record.__dict__
if attr_name not in REMOVE_ATTR
}
@classmethod
def set_format_time(cls, extra):
now = datetime.datetime.utcnow()
format_time = now.strftime("%Y-%m-%dT%H:%M:%S" + ".%03d" % (now.microsecond / 1000) + "Z")
extra['@timestamp'] = format_time
return format_time
@classmethod
def set_host_ip(cls, extra):
extra['host_name'] = JSONFormatter.host_name
extra['host_ip'] = JSONFormatter.host_ip
```
使用的时候,可以通过简单配置即可:
```
[loggers]
keys=root
[handlers]
keys=console,file
[formatters]
keys=json,json_pretty
[logger_root]
level=DEBUG
;handlers=console,file,rotate
handlers=console,file
[handler_console]
class=StreamHandler
level=INFO
formatter=json_pretty
args=(sys.stderr,)
[handler_file]
class=FileHandler
level=INFO
formatter=json
args=('log/base_conf.log','a','utf-8')
[handler_rotate]
class=handlers.TimedRotatingFileHandler
level=INFO
formatter=json
args=('log/rotate.log', 'D',1,0,'utf-8')
[formatter_json]
class=format.json_formatter.JSONFormatter
[formatter_json_pretty]
format=pretty
class=format.json_formatter.JSONFormatter
```
如下的一段异常代码:
```
fileConfig('log_conf.ini')
log = logging.getLogger(__name__)
try:
a = 1 / 0
except Exception:
log.exception(" occurred exception ")
```
输出结果如下:
```
{
"name": "__main__",
"args": [],
"levelname": "ERROR",
"levelno": 40,
"pathname": "C:/texx.py",
"lineno": 17,
"funcName": "base_configuration",
"thread": 10608,
"threadName": "MainThread",
"processName": "MainProcess",
"process": 11916,
"@timestamp": "2019-01-10T12:50:20.392Z",
"host_name": "your-PC",
"host_ip": "192.168.10.11",
"message": " occurred exception ",
"exc_info": "Traceback (most recent call last):\n File \"C:/txxx.py\", line 14, in base_configuration\n a = 1 / 0\nZeroDivisionError: division by zero"
}
```
可以看到内容非常详细,并且组件还支持自定义字段的加入,在收集到日志系统上,可以非常的方便检索统计。
详细的解释和代码,可以fork我的github连接:
https://github.com/qindongliang/python_log_json
分享到:
相关推荐
用python写程序的,作为一个完整的项目而言,必须要有日志模块,而python的logging模块为我们提供了这么一种很好的机制,很方便的解决了这个问题。
logging模块是Python内置的标准模块,主要用于输出运行日志,可以设置输出日志的等级、日志保存路径、日志文件回滚等;相比print,具备如下优点: 可以通过设置不同的日志等级,在release版本中只输出重要信息,而...
实现了简单版本的logging.config,支持一般的通过config文件进行配置。感觉还有更好的方法,是直接利用logging.config.fileConfig(log_config_file)方式读进来之后,通过修改handler方式来进行修改。 复制代码 代码...
一个完美控制日志输出的工具类
python-logging-json-formatter 一个日志格式器,将额外的数据作为JSON附加,例如用于loggly用法使用dictConfig import logging.configlogging.config.dictConfig({ 'version': 1, 'formatters': { 'append_json': {...
更主要是 讨论在多进程环境下如何使用logging 来输出日志, 如何安全地切分日志文件。 1. logging日志模块介绍 python的logging模块提供了灵活的标准模块,使得任何Python程序都可以使用这个第三方模块来实现日志...
主要为大家详细介绍了python logging模块书写日志的方法,并对日志进行分割,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
利用以上python代码配置日志输出时,如果该脚本是主脚本(即import别人,不被别人import,在执行逻辑的最顶端),path表示的日志配置文件只能与该脚本在同一目录下或者在其子文件夹里。 import sys sys.path.append...
许多应用程序中都会有日志模块,用于记录系统在运行过程中的一些关键信息,以便于对系统的运行...这篇文章给大家主要介绍了在Python中logging日志模块在多进程环境下的使用,需要的朋友可以参考借鉴,下面来一起看看吧。
今天小编就为大家分享一篇解决Python logging模块无法正常输出日志的问题,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
本文实例讲述了Python使用logging结合decorator模式实现优化日志输出的方法。分享给大家供大家参考,具体如下: python内置的loging模块非常简便易用, 很适合程序运行日志的输出。 而结合python的装饰器模式,则可...
0.30 python之logging日志输出原理.mp4
logging模块是Python的一个标准库模块,开发过程中,可以通过该模块,灵活的完成日志的记录。 logging模块提供了两种记录日志的方式: 1)使用logging提供的模块级别的函数(logging.basicConfig,logging.debug,...
logconfig.json { "version":1, "disable_existing_loggers":false, "formatters":{ "simple":{ "format":"[%(asctime)s - %(levelname)s - line(%(lineno)d) - %(filename)s]: %(message)s", "datefmt":"%Y-...
python的logging模块是python使用过程中打印日志的利器,下面这篇文章主要给大家介绍了关于python logging重复记录日志问题的解决方法,文中通过示例代码介绍的非常详细,需要的朋友可以参考下
0.31 python之logging日志类的封装.mp4
本文实例讲述了Python同时向控制台和文件输出日志logging的方法。分享给大家供大家参考。具体如下: python提供了非常方便的日志模块,可实现同时向控制台和文件输出日志的功能。 #-*- coding:utf-8 -*- import ...
python使用logging日志
综合以上的要求,我需要用到logging中得FileHandler(由于日志量会很大,这里需要用到RotatingFileHandler,日志达到设定大小后自动写到另外的文件中),Streamhandler(往控制台输出日志),SMTPHanler(用于致命...
最近有一个需求:将日志以json格式输出, 并且有些字段是logging模块没有的.看了很多源码和资料, 终于搞定, 抽取精华分享出来, 一起成长. import json import logging class JsonFilter(logging.Filter): ip = 'IP' ...