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

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

阅读更多


这两天在优化公司一个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自定义字段输出及打印颜色

    logging模块是Python的一个标准库模块,开发过程中,可以通过该模块,灵活的完成日志的记录。 logging模块提供了两种记录日志的方式: 1)使用logging提供的模块级别的函数(logging.basicConfig,logging.debug,...

    PyPI 官网下载 | django-logging-json-1.5.3.tar.gz

    标题中的“PyPI 官网下载 | django-logging-json-1.5.3.tar.gz”表明这是一个在Python Package Index(PyPI)上发布的开源软件包,名为“django-logging-json”,版本为1.5.3,且以tar.gz格式打包。这种格式通常是...

    python logging通过json文件配置的步骤

    总之,使用JSON配置文件进行Python日志管理可以提供更高级别的定制能力,方便地调整日志级别、格式和输出目的地,同时对于日志收集系统(如logstash)的集成也有很大帮助,能有效提高日志处理的效率和便利性。

    Python之日志处理(logging模块).docx

    【Python之日志处理(logging模块)】 日志处理在软件开发中扮演着至关重要的角色,它能够帮助开发者和运维人员了解系统运行状态,定位和解决问题。Python的logging模块提供了全面的日志记录功能,便于对应用程序...

    Python常用组件、命令大总结.pdf

    Python中的`pickle`或`json`模块可用于序列化对象(将对象转换为可存储或传输的格式)和反序列化(从存储或传输的格式恢复对象)。序列化有助于持久化数据或跨进程通信,而反序列化则允许恢复原始数据结构。 6. **...

    python-2.7.8(32位和64位)

    6. **标准库扩展**:Python 2.7.8的标准库中增加了多个新的模块和函数,如`multiprocessing`用于并行计算,`configparser`用于处理配置文件,以及`logging`模块的改进,提高了日志记录的功能。 7. **兼容性**:...

    PyPI 官网下载 | supervisor-logging-gelfudp-0.0.3.tar.gz

    `GELF`(Graylog Extended Log Format)是Graylog日志管理系统所采用的一种日志格式,它允许开发者以JSON格式发送日志数据到Graylog服务器,支持分布式系统中的日志收集和分析。`UDP`(User Datagram Protocol)是一...

    基于python的网络版中国象棋

    6. `database.py`或`logging.py`:可能用于记录游戏历史或错误日志。 这个项目提供了一个学习和实践Python网络编程、游戏开发和并发处理的实例。开发者不仅需要掌握Python基础,还要理解网络通信协议,熟悉并发编程...

    Python爬虫是指使用Python编程语言编写的程序,用于从互联网上获取数据 爬虫程序通过模拟浏览器的行为

    而使用`logging`库记录日志,则有助于排查和调试问题。 最后,随着Python爬虫技术的发展,出现了许多高级框架,如Scrapy,它提供了一个完整且强大的爬虫项目结构,包括中间件、调度器和下载器等组件,使得爬虫开发...

    python3-flask-3将信息写入日志的实操方法

    而Python的内置库logging,则是一个强大的模块,用于在Python程序中记录日志信息。在Web应用开发中,合理使用日志记录功能对于监控应用运行状态、调试程序和事后分析都至关重要。 首先,我们需要了解Python logging...

    Python语言 + Python第三方库 实现的接口自动化测试工具

    Python的第三方库如`requests`用于发送HTTP请求,`unittest`或`pytest`作为测试框架,`json`处理JSON格式的数据,`logging`记录测试日志,以及`mock`模拟对象等,都是构建接口自动化测试的关键组件。 1. **`...

    我收集的电子书Python+Standard+Library中文版.pdf

    这本书涵盖了Python编程语言的核心组件和各种模块,为程序员提供了全面的知识体系,使得他们能够在实际项目中高效地应用Python。 Python标准库是Python语言的核心组成部分,它包含了大量预先编写好的模块,涵盖了...

    日志模块和配置文件模块

    4. 日志框架:Python中的常见日志框架有logging,Java中有log4j,这些框架提供了丰富的配置选项和插件支持,使得日志管理更加灵活。 配置文件模块: 配置文件模块主要用于存储应用程序的参数和设置,允许用户或...

    企业库日志代码

    5. **日志框架**:企业通常会使用成熟且可扩展的日志框架,如Java的Log4j、Python的logging或者Node.js的winston等。这些框架提供了丰富的配置选项,能够满足不同需求。 6. **日志旋转**:为了防止日志文件过大,...

    json 2.2.3 jdk 1.5依赖的jar包 天涯浪子

    5. `commons-logging-1.1.jar`:Apache Commons Logging库是一个轻量级的日志抽象层,允许应用程序代码使用简单的接口,而实际的日志实现可以通过配置进行选择。在开发过程中,日志记录是必不可少的,用于调试和追踪...

    石山石_从OpenStack到Kubernetes-云平台日志监控的新挑战.pdf

    - **docker daemon日志**:自1.13版本起,docker daemon使用了`logrus`作为日志库,但不支持JSON格式的日志输出。 - **容器日志**:每个容器的运行日志会被收集并存储。需要注意的是,一个日志代理可能对应多个...

    python常用库

    本文将深入探讨在GitHub上5000多个开源Python项目中最常用的库,包括os、os.path、glob、sys、re、logging、subprocess、time、datetime、urllib、random、telnetlib、paramiko、pexpect、threading、yaml、json、...

    后端开发 、python

    Python提供了强大的异常处理机制,以及如logging模块来记录运行时信息,帮助调试和排查问题。 性能优化是后端开发不可忽视的一环。Python的性能相对较弱,但可以通过一些策略优化,比如使用生成器减少内存占用,...

    Python-一个由python写简单和容易使用的消息队列

    Python 消息队列是一种用于进程间通信(IPC)的技术,它允许程序将任务或数据放入队列,然后由其他程序或线程处理,而无需直接交互。这种异步处理方式提高了系统的可扩展性和响应速度,尤其适用于处理大量并发请求的...

    python知识图谱系统后台服务.zip

    11. **错误处理与日志**:Python的logging库用于记录系统日志,追踪和调试问题。异常处理(try/except)确保程序的健壮性。 12. **版本控制**:项目可能使用Git进行版本控制,确保代码的可追踪性和协作性。 以上...

Global site tag (gtag.js) - Google Analytics