关注微信公众号【七步编程】,Python、AI、大数据原创文章第一时间推送!
日志在开发过程中是一种被很多程序员不重视,但是却至关重要的一项功能。
我认为在一个系统的整个生命周期里,日志系统虽然工作量不大,但是论重要性程度能够占10%-15%的比重,或者更高。
优秀的日志管理,至少能够从3个方面提升系统:
很少有人敢确保一个系统开发完成之后不会出现任何问题,因此,在一个完善的商业化系统设计过程中,日志管理都会被视为一个重要模块。
日志输出、Kafka日志订阅、日志分析,完备的日志管理能够在系统出现问题时,维护人员需要明确4个问题:
然后,快速定位、快速恢复系统正常运行。要清楚的是,系统正式上线之后,恢复系统时间每多耗费1分钟,它带来的资损和负面影响都是无法估量的。
而在Python中,提到日志管理每个大多数Python开发者都会脱口而出logging
。
logging
是Python内置的标准库,也是使用频率较高的日志管理Python库,但是它有着一些明显的缺点:
Python内置的标准logging库默认配置输出的日志内容非常简单,没有时间、位置这些在日志管理过程中至关重要的信息,每一次使用都需要自己手动配置一下,这样会带来冗余的代码和工作量。
为了解决这些问题,本文就来介绍一款可以很好替代标准logging库的第三方日志管理库–Eliot。
前面已经提到,一个优秀的日志管理系统至少要回答4个问题:
但是,大多数日志库都不具备这样的功能。而本文介绍的Eliot恰好都能满足这些需求。
除了能够回答上述问题,告诉你问题是什么、问题出在哪、为什么出现问题,Eliot还具有很多其他特性:
下面就来看一下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:
然后再命令行下执行代码:
$ 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使用,简历搜索索引,能够通过自建的搜索引擎快速搜索到想要的日志信息。
文章目录一、前端核心分析1.VUE概述2. 前端三要素3. JavaScript框架二、第一个Vue程序1. 什么是MVVM2. 为什么要使用MVVM3. Vue 是 MVVM 模式的实现者三、Vue基本语法1. `v-bind`( : )2. `v-if` `v-else`3. `v-for`4.`v-on`事件绑定(@click)四、Vue双向绑定`v-model`1. 什么是双向绑定2. 为什么要实现数据的双向绑定3. 在表单中使用双向数据绑定五、Vue组件六、Axios通信1. 什么是Axios2.
Linux基础学习目标1、了解Linux的简介与安装2、掌握Linux常用的命令3、掌握Linux系统上JDK、Mysql、Tomcat的安装一、Linux的简介1.Linux的概述Linux是基于Unix的开源免费的操作系统,由于系统的稳定性和安全性几乎成为程序代码运行的最佳系统环境。Linux是由...
清幽现云山,虚静出内功。
我本身是一个喜欢安装各种软件的人,有的应用虽然使用频率不高,但我也不喜欢卸载,毕竟有时候会用到,所以手机里各种app比较多。之前这些软件都还比较小,后来都是越更新越大。然后问题就来了,国产的这些流氓app打开一个之后会接二连三的启动其他app,到最后整个大家族都参与进来,手机立马发热,卡比了。之前用了绿色守护和LBE,360极客等东西,但是现在感觉换了华为手机,没有root权限,这些软件就都不好使
这个问题折腾了我好久,也找了好的博客,还有嗯嗯,,网络上的东西。。。 记录一下, 首先,创建一个类继承自BroadcastReceiver。不明白怎么回事的自己百度。 public class AutoStartReceiver extends BroadcastReceiver{ @Override public void...
最近在写一个关于开机自启的后台服务,在这里做个总结。测试环境:Anroid 4.4(LG)Android 6.0(小米4)ROOT权限代码分析:程序开机自启需要监听系统开机时发出的广播,安装在SD的应用无法启动,因为开机广播发出后才加载SD卡:android.intent.action.BOOT_COMPLETED 监听广播需要在AndroidManifest添加...
Shiro介绍就跳过了,这里记录怎么在项目中使用1 添加maven依赖<shiro.version>1.4.0</shiro.version><druid.version>1.1.20</druid.version><shiro-redis.version>3.2.3</shiro-redis.version>...
原文地址:苦逼的程序员怎么发展1:就像软件工程中说的,整个软件开发真正编码阶段只是其中一个很小的阶段,最起作用的是前面的需求分析,系统架构设计。就算在真正的编码阶段里,真正的敲代码时间业不是占很大比例。一个优秀的程序员真正敲代码时间占他整个开发的很少一部分时间。2:BFS进程调度器的发明者不还是一个医生嘛,其实他还不是科班出身的,据说他真正在做BFS调度器时,对C语言还不熟悉,甚至
在MySQL中删除一张表或一条数据的时候,出现[Err] 1451 -Cannot deleteor update a parent row: a foreign key constraint fails (...)这是因为MySQL中设置了foreign key关联,造成无法更新或删除数据。可以通过设置FOREIGN_KEY_CHECKS变量来避免这种情况。我们可以使用 SET FORE...
《matlab常见错误(gui篇)》由会员分享,可在线阅读,更多相关《matlab常见错误(gui篇)(99页珍藏版)》请在金锄头文库上搜索。1、MATLAB 中文论坛相关帖子整理 (www.ilovematlab.cn) 说明: 本资料所有问题及代码均摘选自matlab中文论坛(www.ilovematlab.cn),主要供自己学习使用。 非常感谢论坛的所有提出以及解答问题的会员。 目录 1、G...
1.目的:在某些安卓 设备开机自启(广告屏等)2.权限设置<!--开机启动--> <uses-permission android:name="android.permission.RECEIVE_BOOT_COMPLETED" />3.新建BootReceiverimport android.content.BroadcastReceiver;import android.content.Context;import android.conten