`
qindongliang1922
  • 浏览: 1454883 次
  • 性别: Icon_minigender_1
  • 来自: 北京
博客专栏
7265517b-f87e-3137-b62c-5c6e30e26109
证道Lucene4
浏览量:100407
097be4a0-491e-39c0-89ff-3456fadf8262
证道Hadoop
浏览量:101380
41c37529-f6d8-32e4-8563-3b42b2712a50
证道shell编程
浏览量:44671
43832365-bc15-3f5d-b3cd-c9161722a70c
ELK修真
浏览量:49628
社区版块
存档分类
最新评论
阅读更多


这两天在优化公司一个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









0
0
分享到:
评论
相关资源推荐
  • python日志输出--logging输出 1. logging介绍         Pythonlogging模块提供了通用的日志系统,可以方便第三方模块或者是应用使用。这个模块提供不同的日志级别,并可以采用不同的方式记录日志,比如文件,HTTP GET/POST,SMTP,Socket等,甚至可以自己实现具体的日志记录方式。         logging模块与log4j的机制是一样的,只是具体的实现细节不同。模块提供lo
  • python日志输出----logging浅析与使用.pdf python日志输出----logging浅析与使用.pdf
  • 《flask日志logging二》在flask中使用日志输出 flask中app.logger是标准logging Logger。        实例:        app.logger.info('!!!!!!!!!!!!!!!!!!!!!!!!')     app.logger.debug('@@@@@@@@@@@@@@')     app.logger.warning('############ (%d apples)', 42) app....
  • pythonlogging日志模块的使用 基本用法下面的代码展示了logging最基本的用法。# coding=utf-8 import logging import sys # 获取logger实例,如果参数为空则返回root logger logger = logging.getLogger("AppName") # 指定logger输出格式 formatter = logging.Formatter('%(asctime)s ...
  • python logging模块代码示例:实现日志输出到控制台, 并且写入日志文件中 import logging class Logger(object): def __init__(self, log_file_name, log_level, logger_name): #创建一个logger self.__logger = logging.getLogger(logger_name) #指定日志的最低输出级别,...
  • 浅析python日志重复输出问题 问题起源: 这里为了便于理解,简单的展示了一个输出到屏幕的日志函数 问题解析 解决办法 1.改名换姓 2.及时清理(logger.handlers.clear) 这种写法下的可以使用removeHandler方法(logger.handlers.clear也可以使用在这种写法的函数内) 3.用前判断 总结 问题起源: ​ 在学习了python的函数式编程后...
  • Python3 中记录日志并输出到 log 文件中的方法(防止输出中文乱码) # -*- coding: utf-8 -*- import logging.handlers LOG_FILE = r'tst.log' handler = logging.handlers.RotatingFileHandler(LOG_FILE, maxBytes=1024 * 1024, backupCount=5, encoding='utf-8') # 实例化handler
  • python logging输入文件中文字符乱码 Python版本3.6 解决方法很简单,在定义Filehandler时指定encoding就好了 import logging file_hanlder = logging.FileHandler(filename='example.log', encoding='utf-8') 因为看pythonlogging.FileHandler()类的代码如下,就知道Filehanlder也支...
  • pyhton中的logging 输入到日志以及输出到文件 import logginglogger = logging.getLogger(__name__) logger.setLevel(logging.INFO)#创建一个handler,用于写入文件 logfile = './log.txt' fh = logging.FileHandler(logfile,mode='a') fh.setLevel(logging.DEBUG)#再次创建一个han
  • python-logging模块的简单使用:如何同时输出到控制台和本地日志文件 本文简单记录logging模块使用方法。参考博客 提供两种记录日志的方式: 使用logging提供的模块级别的函数 使用logging模块的四大组件 一、简单使用——函数 下面是常用函数 logging.debug() logging.info() logging.warning() logging.error() logging.critical() #输出函数,级别从低到高逐...
  • Python logging 模块和使用经验
  • 14.8Python程序调试与测试(8):使用JSON文件进行日志配置 @概述 在Python代码中硬编码logging的配置是很不灵活,也不便于管理的; logging配置的最好的方法是使用一个配置文件来管理; Python 2.7及以后可以从字典中加载logging配置,也就意味着可以通过读取JSON文件来加载日志的配置; @配置文件范本 下面是一个JSON文件存储日志配置的范本,我们可以以此为蓝本,来修改不同logger对象的日志格式、文件存储位...
  • Django 日志模块 logging 的配置 本文将通过一个实际的例子来说明如何配置 logging 模块。更多信息可以参考 Django 的官网文档。
  • Python之配置日志的几种方式(logging模块) 作为开发者,我们可以通过以下3种方式来配置logging: 1)使用Python代码显式的创建loggers, handlers和formatters并分别调用它们的配置函数; 2)创建一个日志配置文件,然后使用fileConfig()函数来读取该文件的内容; 3)创建一个包含配置信息的dict,然后把它传递个dictConfig()函数; 需要说明的是,logging.basicConfi...
  • Python中,如何让多个py文件的logging输出到同一个日志log文件 Python中,如何让多个py文件的logging输出到同一个日志log文件转载:https://www.crifan.com/python_output_multiple_script_logging_into_single_log_file/【问题】有一个比较长的python脚本文件,其中关于log日志输出,用的是logging,对应初始化代码为:?1234567891011121314log...
  • Python日志输出为文件格式——使用logging模块 logging 模块可以将 python 打印的日志进行文件的输出,具体配置如下: import logging logging.basicConfig(level=logging.INFO, format='%(asctime)s %(filename)s[line:%(lineno)d] %(levelname)s %(message)s', ...
  • python2.7使用logging模块记日志,中文记入后乱码解决办法 python 2.7中使用了logging模块记录日志,发现记录中文的中文是乱码,或者报错。经过网上查找后,解决了。 解决办法就是注意以下三点:  1、Python代码文件开头要加上 :    # -*- coding: utf-8 -*- 2、加上代码,注意一定要是  utf-8       import logging       import sys       reload(sys
  • python logging模块 init格式配置传递参数 Python项目中,logging模块的配置使用了 ini 这种配置,也叫做 fileconfig 配置,然后不想把存放 log 文件的目录 硬编码。抽象出来就是怎么给 init 格式配置文件传递参数。 利用 fileConfig 中的 defaults 参数可以实现 文档地址py文件import logging import logging.config logconf = os.path.joi
  • python logging模块如何把不同内容定向到不同的输出 之前用logging模块的时候只是上网随便搜了个贴子,看了看大致方法就直接用了。现在遇到一个问题,就是之前在为logger对象添加handler的时候,在配置文件中使用的是StreamHandler,并且指定输出到stdout(默认是stderr),而由于在程序中只是使用了到了一个logger和一个handler,因此所有日志等级(INFO,DEBUG,ERROR等等)都被重定向到了一个地方,那就
  • python logging模块打印log到指定文件 可能我们经常会使用print来输出信息到窗口,但当我们有很多个py文件需要运行,项目比 较庞大的到时候,print简直就是太low了点了。那么我们可以使用强大的logging模块,把 输出到指定的本地pc某个路径的文件中。 一、logging的框架1、 Loggers: 可供程序直接调用的接口,app通过调用提供的api来记录日志2、 Handlers: 决定将日志记录分配至正确的目的地3、 Fi...
Global site tag (gtag.js) - Google Analytics