这两天在优化公司一个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
分享到:
相关推荐
logging模块是Python的一个标准库模块,开发过程中,可以通过该模块,灵活的完成日志的记录。 logging模块提供了两种记录日志的方式: 1)使用logging提供的模块级别的函数(logging.basicConfig,logging.debug,...
标题中的“PyPI 官网下载 | django-logging-json-1.5.3.tar.gz”表明这是一个在Python Package Index(PyPI)上发布的开源软件包,名为“django-logging-json”,版本为1.5.3,且以tar.gz格式打包。这种格式通常是...
总之,使用JSON配置文件进行Python日志管理可以提供更高级别的定制能力,方便地调整日志级别、格式和输出目的地,同时对于日志收集系统(如logstash)的集成也有很大帮助,能有效提高日志处理的效率和便利性。
【Python之日志处理(logging模块)】 日志处理在软件开发中扮演着至关重要的角色,它能够帮助开发者和运维人员了解系统运行状态,定位和解决问题。Python的logging模块提供了全面的日志记录功能,便于对应用程序...
Python中的`pickle`或`json`模块可用于序列化对象(将对象转换为可存储或传输的格式)和反序列化(从存储或传输的格式恢复对象)。序列化有助于持久化数据或跨进程通信,而反序列化则允许恢复原始数据结构。 6. **...
6. **标准库扩展**:Python 2.7.8的标准库中增加了多个新的模块和函数,如`multiprocessing`用于并行计算,`configparser`用于处理配置文件,以及`logging`模块的改进,提高了日志记录的功能。 7. **兼容性**:...
`GELF`(Graylog Extended Log Format)是Graylog日志管理系统所采用的一种日志格式,它允许开发者以JSON格式发送日志数据到Graylog服务器,支持分布式系统中的日志收集和分析。`UDP`(User Datagram Protocol)是一...
6. `database.py`或`logging.py`:可能用于记录游戏历史或错误日志。 这个项目提供了一个学习和实践Python网络编程、游戏开发和并发处理的实例。开发者不仅需要掌握Python基础,还要理解网络通信协议,熟悉并发编程...
而使用`logging`库记录日志,则有助于排查和调试问题。 最后,随着Python爬虫技术的发展,出现了许多高级框架,如Scrapy,它提供了一个完整且强大的爬虫项目结构,包括中间件、调度器和下载器等组件,使得爬虫开发...
而Python的内置库logging,则是一个强大的模块,用于在Python程序中记录日志信息。在Web应用开发中,合理使用日志记录功能对于监控应用运行状态、调试程序和事后分析都至关重要。 首先,我们需要了解Python logging...
Python的第三方库如`requests`用于发送HTTP请求,`unittest`或`pytest`作为测试框架,`json`处理JSON格式的数据,`logging`记录测试日志,以及`mock`模拟对象等,都是构建接口自动化测试的关键组件。 1. **`...
这本书涵盖了Python编程语言的核心组件和各种模块,为程序员提供了全面的知识体系,使得他们能够在实际项目中高效地应用Python。 Python标准库是Python语言的核心组成部分,它包含了大量预先编写好的模块,涵盖了...
4. 日志框架:Python中的常见日志框架有logging,Java中有log4j,这些框架提供了丰富的配置选项和插件支持,使得日志管理更加灵活。 配置文件模块: 配置文件模块主要用于存储应用程序的参数和设置,允许用户或...
5. **日志框架**:企业通常会使用成熟且可扩展的日志框架,如Java的Log4j、Python的logging或者Node.js的winston等。这些框架提供了丰富的配置选项,能够满足不同需求。 6. **日志旋转**:为了防止日志文件过大,...
5. `commons-logging-1.1.jar`:Apache Commons Logging库是一个轻量级的日志抽象层,允许应用程序代码使用简单的接口,而实际的日志实现可以通过配置进行选择。在开发过程中,日志记录是必不可少的,用于调试和追踪...
- **docker daemon日志**:自1.13版本起,docker daemon使用了`logrus`作为日志库,但不支持JSON格式的日志输出。 - **容器日志**:每个容器的运行日志会被收集并存储。需要注意的是,一个日志代理可能对应多个...
本文将深入探讨在GitHub上5000多个开源Python项目中最常用的库,包括os、os.path、glob、sys、re、logging、subprocess、time、datetime、urllib、random、telnetlib、paramiko、pexpect、threading、yaml、json、...
Python提供了强大的异常处理机制,以及如logging模块来记录运行时信息,帮助调试和排查问题。 性能优化是后端开发不可忽视的一环。Python的性能相对较弱,但可以通过一些策略优化,比如使用生成器减少内存占用,...
Python 消息队列是一种用于进程间通信(IPC)的技术,它允许程序将任务或数据放入队列,然后由其他程序或线程处理,而无需直接交互。这种异步处理方式提高了系统的可扩展性和响应速度,尤其适用于处理大量并发请求的...
11. **错误处理与日志**:Python的logging库用于记录系统日志,追踪和调试问题。异常处理(try/except)确保程序的健壮性。 12. **版本控制**:项目可能使用Git进行版本控制,确保代码的可追踪性和协作性。 以上...