日志在开发过程中是一种被很多程序员 不重视 ,但是却 至关重要 的一项功能。

很多人学习python,不知道从何学起。
很多人学习python,掌握了基本语法过后,不知道在哪里寻找案例上手。
很多已经做案例的人,却不知道如何去学习更加高深的知识。
那么针对这三类人,我给大家提供一个好的学习平台,免费领取视频教程,电子书籍,以及课程的源代码!
QQ群:1097524789

我认为在一个系统的整个生命周期里,日志系统虽然工作量不大,但是论重要性程度能够占10%-15%的比重,或者更高。

优秀的日志管理,至少能够从3个方面提升系统:

  • 调试速度

  • 执行效率

  • 运维效率

很少有人敢确保一个系统开发完成之后不会出现任何问题,因此,在一个完善的商业化系统设计过程中,日志管理都会被视为一个重要模块。

日志输出、Kafka日志订阅、日志分析,完备的日志管理能够在系统出现问题时,维护人员需要明确4个问题:

  • 问题是什么?

  • 问题出在哪?

  • 什么时间出现的问题?

  • 为什么出现问题?

然后, 快速定位 、快速恢复系统正常运行。要清楚的是,系统正式上线之后,恢复系统时间每多耗费1分钟,它带来的资损和负面影响都是无法估量的。

而在Python中,提到日志管理每个大多数Python开发者都会脱口而出 logging 。

logging 是Python内置的标准库,也是使用频率较高的日志管理Python库,但是它有着一些明显的缺点:

  • 功能单一

  • 执行效率低

  • 需要手动配置

Python内置的标准logging库默认配置输出的日志内容非常简单,没有时间、位置这些在日志管理过程中至关重要的信息,每一次使用都需要自己手动配置一下,这样会带来冗余的代码和工作量。

为了解决这些问题,本文就来介绍一款可以很好替代标准logging库的第三方日志管理库-- Eliot

Eliot

前面已经提到,一个优秀的日志管理系统至少要回答4个问题:

  • 问题是什么?

  • 问题出在哪?

  • 什么时间出现的问题?

  • 为什么出现问题?

但是,大多数日志库都不具备这样的功能。而本文介绍的Eliot恰好都能满足这些需求。

除了能够回答上述问题,告诉你问题是什么、问题出在哪、为什么出现问题,Eliot还具有很多其他特性:

  • 结构化输出日志信息,能够对输出一目了然

  • 可以用于解析和过滤日志

  • 不仅记录简单信息,还可以追踪程序的执行过程

  • 性能非常好,使用非堵塞IO

  • 可以结合Logstash/Elasticsearch使用

下面就来看一下 Eliot 的基本使用,更加丰富的功能,各位同学可以阅读一下文档仔细了解一下Eliot的使用。

安装

可以使用 pip 安装,

$ pip install eliot eliot-tree

也可以使用 conda 安装,

$ conda install -c conda-forge eliot eliot-tree

安装的eliot用于日志的生成、输出、分析等功能,eliot-tree可以实现以树结构可视化日志信息。

使用

首先给出一段示例代码,

import requests
from eliot import start_action, to_file # 1. to_file
to_file(open("linkcheck.log", "w")) def check_links(urls):
with start_action(action_type="check_links", urls=urls):
for url in urls:
try:
# 2. start_action
with start_action(action_type="download", url=url):
response = requests.get(url)
response.raise_for_status()
except Exception as e:
raise ValueError(str(e)) try:
check_links(["http://eliot.readthedocs.io", "http://nosuchurl"])
except ValueError:
print("Not all links were valid.")

在这段代码中有2处用到了Eliot:

  1. to_file:用于指定输出日志文件;

  2. start_action:用于创建动作,如果动作成功则输出succeed ,否则抛出异常;

然后再命令行下执行代码:

$ python linkcheck.py

这时候会发现生成了一个名为 linkcheck.log 的日志文件。

但是,当用文本编辑器打开的时候会发现,日志的格式很单一、并没有树结构的信息。

如果想以树结构的方式可视化输出信息,就需要用到 eliot-tree 这个工具。

$ eliot-tree linkcheck.log
b1cb58cf-2c2f-45c0-92b2-838ac00b20cc
└── check_links/1 ⇒ started
├── timestamp: 2017-10-27 20:42:47.206684
├── urls:
│ ├── 0: http://eliot.readthedocs.io
│ └── 1: http://nosuchurl
├── download/2/1 ⇒ started
│ ├── timestamp: 2017-10-27 20:42:47.206933
│ ├── url: http://eliot.readthedocs.io
│ └── download/2/2 ⇒ succeeded
│ └── timestamp: 2017-10-27 20:42:47.439203
├── download/3/1 ⇒ started
│ ├── timestamp: 2017-10-27 20:42:47.439412
│ ├── url: http://nosuchurl
│ └── download/3/2 ⇒ failed
│ ├── errno: None
│ ├── exception: requests.exceptions.ConnectionError
│ ├── reason: HTTPConnectionPool(host='nosuchurl', port=80): Max retries exceeded with url: / (Caused by NewConnec…
│ └── timestamp: 2017-10-27 20:42:47.457133
└── check_links/4 ⇒ failed
├── exception: builtins.ValueError
├── reason: HTTPConnectionPool(host='nosuchurl', port=80): Max retries exceeded with url: / (Caused by NewConnec…
└── timestamp: 2017-10-27 20:42:47.457332

在这个结构化的日志信息中,可以一目了然的看出3个方面的信息:

  • 哪些动作成功了,哪些动作失败了;

  • 失败的动作会记录异常

  • 日志追踪并记录了执行的详细动作

另外,执行每一步的详细时间戳也被记录在日志中。

除了在日志生成和输出增强日志管理之外,Eliot还在日志分析方面也提供了很不错的解决方案。

在以往,系统运行很长时间之后会产生大量的日志,通过肉眼逐行去看、或者手动搜索关键字的方式都不显示,从零开始开发一款日志分析系统耗费成本也较高。

Eliot针对日志分析加入了2项非常实用的功能:

  • 过滤

  • 解析

通过这2项功能,就不需要再去写一个复杂的逻辑去处理日志文件、解析对应的行和关键字。在Eliot中,只需要简短的代码就可以实现日志的定位和解析。除此之外,Eliot转为json输出而设计,可以结合Elasticsearch使用,简历搜索索引,能够通过自建的搜索引擎快速搜索到想要的日志信息。

我给这个Python库打101分!的更多相关文章

  1. Python库的安装方法

    Python库的安装方法 Python的解释器CPython是开源的,我们可以下载查看其源代码,同时,Python语言的各种库也都是开源的.利用Python语言编程,可用的库有很多,在Python官方 ...

  2. Python库

    --Python库之Pandas库-------- 自主选择学习了Python中的Pandas库,以下是本人对Pandas库的认识: Pandas库是Python最受欢迎的库之一,主要用于数据的操作. ...

  3. Python 库/模块/工具收集

    1 算法 1.1 字符串处理 re 正则表达式的标准库. StringIO / cStringIO 以读写文件的方式来操作字符串(有点类似于内存文件). cStringIO 是 C 语言实现的,提供高 ...

  4. Python 库,资源

    库名称简介 Chardet字符编码探测器,可以自动检测文本.网页.xml的编码. colorama主要用来给文本添加各种颜色,并且非常简单易用. Prettytable主要用于在终端或浏览器端构建格式 ...

  5. 各种 Python 库/模块/工具

    1 算法 1.1 字符串处理 re 正则表达式的标准库. StringIO / cStringIO 以读写文件的方式来操作字符串(有点类似于内存文件). cStringIO 是 C 语言实现的,提供高 ...

  6. 1000个经常使用的Python库和演示样例代码

    以下是programcreek.com通过分析大量开源码,提取出的最经常使用的python库. 1. sys    (4627) 2. os    (4088)  3. re    (3563)  4 ...

  7. Python 库打包分发、setup.py 编写、混合 C 扩展打包的简易指南(转载)

    转载自:http://blog.konghy.cn/2018/04/29/setup-dot-py/ Python 有非常丰富的第三方库可以使用,很多开发者会向 pypi 上提交自己的 Python ...

  8. 这几天加班熬夜把所有Python库整理了一遍,非常全面!

    库名称简介 Chardet 字符编码探测器,可以自动检测文本.网页.xml的编码.colorama 主要用来给文本添加各种颜色,并且非常简单易用.Prettytable 主要用于在终端或浏览器端构建格 ...

  9. 花了三个月终于把所有的 Python 库全部整理了!可以说很全面了

    库名称简介 Chardet字符编码探测器,可以自动检测文本.网页.xml的编码. colorama主要用来给文本添加各种颜色,并且非常简单易用. Prettytable主要用于在终端或浏览器端构建格式 ...

随机推荐

  1. (一)pandas的两种对象

    将鱼图像数据进行操作,使用numpy知识 import numpy as np import matplotlib.pyplot as plt %matplotlib inline #咱们可以不用sh ...

  2. mongodb(五):聚合操作(python)

    pymongo的聚合操作 数据类型样式 /* 1 */ { "_id" : ObjectId("5e5a32fe2a89d7c2fc05b9fc"), &quo ...

  3. 整理 Linux下列出目录内容的命令

    在 Linux 中,有非常多的命令可以让我们用来执行各种各样的任务.当我们想要像使用文件浏览器一样列出一个目录下的内容时,大家第一时间想到的是 ls 命令.但只有 ls 命令能实现这个目的吗?显然不是 ...

  4. idea 项目启动console卡在Connected to the target VM, address: '127.0.0.1:51140', transport: 'socket'不动了

  5. Arctic Code Vault Contributor 上榜了 go-admin v1.1 beta 版本发布

    Arctic Code Vault Contributor 上榜了,内心比较喜悦,谢谢开源社区的支持,也谢谢广大 coder 的支持: go-admin 是一个基于 Gin + Vue + Eleme ...

  6. SDS——重用StringBuilder

    package example.java; /** * @author 杜科 * @description 简单动态字符串,非线程安全.采取类似buffer的设计,使其成为一个可以方便重用的Strin ...

  7. 搭建jmeter+influxdb+grafana压测实时监控平台(超详细,小白适用)

    1.前言 在使用jmeter做性能测试的时候,监控系统性能的时候,无论是使用插件还是报告生成,都没法实现实时监控.使用JMeter+Influxdb+Grafana可以实现实时监控. 本次环境搭建各软 ...

  8. Split Screen

    Split Screen 是一个用来分屏的 bookmarklet 程序. 它通过 javascript 通信协议实现[1]. 特点 使用 HTML5 <dialog> 元素实现 使用 G ...

  9. JavaFX布局神器-SceneBuilder

    JavaFX允许开发使用FXML来设计和布局界面,跟Qt和Android的布局有点类似,JavaFX用SceneBuilder来设计和布局界面. SceneBuilder最新的下载地址:https:/ ...

  10. lua中 string.find(查找获取字符串) string.gsub(查找替换字符串) string.sub(截取字符串)

    > aaa='/p/v2/api/winapi/adapter/lgj'> print(string.find(aaa, "^/.+/adapter/(.*)"))1 ...