Loading [MathJax]/jax/output/CommonHTML/config.js
前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >专栏 >如何扩展python的logging组件支持json日志输出

如何扩展python的logging组件支持json日志输出

作者头像
我是攻城师
发布于 2019-03-06 07:13:30
发布于 2019-03-06 07:13:30
3.1K00
代码可运行
举报
文章被收录于专栏:我是攻城师我是攻城师
运行总次数:0
代码可运行

这两天在优化公司一个python的项目,顺便研究了一下如何将python日志转成json格式,原来在Java的项目中搞过类似的事情,知道日志转成json之后有很多便利的之处,最常见的就是可以直接对接各种日志分析系统,如开源的ELK,将数据导入之后就能快速的进行查询和分析,方便做各种统计,监控或报警等。

python里面的logging组件,其实已经是组件化了,有Logger组件,Handler组件,Fomatter组件,如下图所示:

logger=>handler=>formatter分别是一对多的关系,日志的格式其实是由formatter决定的,所以想要扩展成你想要的各种格式,就重写定制formatter组件就可以了,它实际上和Java里面Log4j的LayOut组件类似。

核心代码如下:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
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

使用的时候,可以通过简单配置即可:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
[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

如下的一段异常代码:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
fileConfig('log_conf.ini')
    log = logging.getLogger(__name__)
    try:
        a = 1 / 0
    except Exception:
        log.exception(" occurred exception ")

输出结果如下:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
{
 "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

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2019-01-10,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 我是攻城师 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
Openstack之log详解
openstack中的日志由oslo_log统一实现,延续了openstack一贯的封装大法,以十分友好的方式将接口提供给各个组件使用。
tunsuy
2022/10/27
4960
Python Logging库HTTP
Python的logging库是标准库中用来实现日志的库,功能强大,而且使用起来也算是方便。该库提供了很多个不同的Handler,用来对日志进行不同的处理。例如FileHandler用来将日志记录到文件,RotateFileHandler用来将日志记录到文件而且支持日志文件滚动备份,还有本文中所说的HttpHandler,可以将日志通过HTTP请求发送到服务器上。
py3study
2020/01/03
6830
Python日志输出——logging模块
http://blog.csdn.net/chosen0ne/article/details/7319306
bear_fish
2018/09/20
1.2K0
Python自建logging模块
每一个logger对象,都有一个日志级别,它只会输出高于它level的日志。如果一个logger的level是INFO,那么调用logger.debug()是无法输出日志的,而logger.warning()能够输出。 一般来说,以上的6个日志级别完全满足我们日常使用了。
小破孩的梦想空间
2020/04/23
3530
轻松搞定Python日志记录:logging模块详解与实战
在开发和维护软件时,日志记录是一个非常重要的环节。它可以帮助开发者调试代码、监控应用运行状态、记录系统行为等。Python的logging模块提供了一个灵活且强大的日志记录功能,能够满足各种日志记录需求。本文将详细介绍logging模块的使用,包括基本概念、配置方法、日志级别、日志处理器和格式化器的使用,以及实际应用案例。
sergiojune
2024/08/02
8320
轻松搞定Python日志记录:logging模块详解与实战
Python常用库 - logging日志库
logging 使用非常简单,使用 basicConfig() 方法就能满足基本的使用需要;如果方法没有传入参数,会根据默认的配置创建Logger 对象,默认的日志级别被设置为 WARNING,该函数可选的参数如下表所示。
小菠萝测试笔记
2020/06/09
8640
Python logging模块切分和轮转日志
logging 模块可以实现日志的输出和写入文件,但实际工作中,对于日志的使用不仅限于输出那么简单。
Python碎片公众号
2021/02/26
1.8K0
Python logging模块切分和轮转日志
logrus自定义日志输出格式
所以,实现自定义日志格式,本质上就是实现Formatter接口,然后通过SetFormatter方式将其告知logrus。
跑马溜溜的球
2021/06/01
7.1K0
Python日志库logging总结-可能是目前为止将logging库总结的最好的一篇文章
在部署项目时,不可能直接将所有的信息都输出到控制台中,我们可以将这些信息记录到日志文件中,这样不仅方便我们查看程序运行时的情况,也可以在项目出现故障时根据运行时产生的日志快速定位问题出现的位置。
Wizey
2018/10/15
41.2K1
还在用 print?试一试 logging 的强大!
这次呢?我给大家带来了 logging 的用法,这也是为以后我分享案例做准备,因为以后我的代码不会经常使用 print 来做命令行输出提示,那真的太 low 了,但不能否认,我用了 print 好久而且貌似还挺满足的,可是当自己的代码放在实际的工程开发之中,或者大佬面前根本不是入眼了,这还真不能怪那些大佬或者实际工作需求高,而是我们看到 “烂代码” 的时候,表示一秒我都不想在这样的代码上多浪费时间,比如该换行的不换行、变量的命名各种各样、函数名也是,或者赋值符号两边不加空格、不符合软件工程规范:高内聚低耦合啥的,这类还有很多,培训班出来的有很大一部分都这样,这么说不是没有原因的,培训班老师自己偷懒或者本身就不会,写代码的时候不注意规范,但至少提一下吧!
数据森麟
2020/06/12
5340
django日志logging的配置以及处理
日志是一种可以追踪某些软件运行时所发生事件的方法。软件开发人员可以向他们的代码中调用日志记录相关的方法来表明发生了某些事情。一个事件可以用一个可包含可选变量数据的消息来描述。此外,事件也有重要性的概念,这个重要性也可以被称为严重性级别(level)。
菲宇
2019/06/13
2.3K0
django日志logging的配置以及处理
Python 日志打印之logging.config.dictConfig使用总结
dictConfig函数位于logging.config模块,该函数通过字典参数config对logging进行配置。3.2版本新增的函数
授客
2021/01/13
4.1K2
Python Logging 库超详细的解读
在软件开发过程中,日志记录是一项至关重要的任务。通过在代码中引入适当的日志记录,开发人员可以更容易地追踪应用程序的行为、排除错误并进行性能分析。Python 的 logging 库是一个强大的工具,提供了丰富的功能,使得日志记录变得更加灵活和可配置。本文将深入探讨 Python logging 库的各个方面,包括基本概念、配置方法、处理程序和格式化等内容。
Michel_Rolle
2024/01/26
2.8K0
python 日志封装
写python项目时,需要用到日志类,需求为:日志信息可配置,提供几种类型不同的配置,并且日志既可以写到文本也可以写到数据库中。 实现时日志类直接使用python的logging,配置信息写到配置文件logging_data.conf,并使用logging.config.fileConfig(log_config_path)加载配置。写日志到数据库参考了log4mongo-1.6.0.tar.gz的写法,同时每当在数据库写日志时,同时需要插入一些额外信息,比如:projectId runningId algorithmId,所以使用了python的logging.LoggerAdapter把额外信息添加进去。
py3study
2020/01/06
8550
python学习笔记7.7-日志记录模块logging
段子里说,使用日志的程序员鄙视使用print记录信息的程序员,所以作为一个合格的程序员,合理的记录日志实数非常必要的。本文主要介绍在python中如何使用logging模块记录日志。
锦小年
2019/05/26
7050
python 日志模块 logging 详解
Java 中最通用的日志模块莫过于 Log4j 了,在 python 中,也自带了 logging 模块,该模块的用法其实和 Log4j 类似。 Python 使用logging模块记录日志涉及四个主要类,使用官方文档中的概括最为合适: logger提供了应用程序可以直接使用的接口; handler将(logger创建的)日志记录发送到合适的目的输出; filter提供了细度设备来决定输出哪条日志记录; formatter决定日志记录的最终输出格式。 logging模块是在2.3新引进的功能,下面是一些常用
用户1177713
2018/02/24
2.2K0
python 日志模块 logging 详解
Python入门之logging日志模块以及多进程日志
本篇文章主要对 python logging 的介绍加深理解。更主要是 讨论在多进程环境下如何使用logging 来输出日志, 如何安全地切分日志文件。 1. logging日志模块介绍 python的logging模块提供了灵活的标准模块,使得任何Python程序都可以使用这个第三方模块来实现日志记录。python logging 官方文档 logging框架中主要由四个部分组成: Loggers: 可供程序直接调用的接口 Handlers: 决定将日志记录分配至正确的目的地 Filters: 提供更细粒
Jetpropelledsnake21
2018/05/03
5.4K1
Python入门之logging日志模块以及多进程日志
Python自动化之使用loguru优雅输出日志
Hi,大家好。在之前的文章:Python接口自动化之logging日志,介绍了logging日志。今天给大家介绍另外一款优雅的日志——loguru。loguru是Python 中一个简易且强大的第三方日志记录库,在通过添加一系列有用的功能来解决标准记录器的注意事项,从而减少 Python 日志记录的痛苦。
可可的测试小栈
2022/04/13
3K0
Python自动化之使用loguru优雅输出日志
python接口自动化(三十九)- logger 日志 - 上(超详解)
Python的logging模块提供了通用的日志系统,可以方便第三方模块或者是应用使用。这个模块提供不同的日志级别,并可以采用不同的方式记录日志,比如文件,HTTP GET/POST,SMTP,Socket等,甚至可以自己实现具体的日志记录方式。
北京-宏哥
2019/09/11
3K0
python接口自动化(三十九)- logger 日志 - 上(超详解)
Python logging 较佳实践
记录日志是程序中尤其是 web 服务中的重要一环,恰到好处的日志记录可以帮助我们了解程序运行情况以及 方便排(shuai)错(guo)。
Alan Lee
2020/02/13
8660
相关推荐
Openstack之log详解
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
本文部分代码块支持一键运行,欢迎体验
本文部分代码块支持一键运行,欢迎体验