我给这个Python库打101分!
日志在開發過程中是一種被很多程序員不重視,但是卻至關重要的一項功能。
我認為在一個系統的整個生命周期里,日志系統雖然工作量不大,但是論重要性程度能夠占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_actionwith?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:
to_file:用于指定輸出日志文件;
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使用,簡歷搜索索引,能夠通過自建的搜索引擎快速搜索到想要的日志信息。
與50位技術專家面對面20年技術見證,附贈技術全景圖總結
以上是生活随笔為你收集整理的我给这个Python库打101分!的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 《京东商业化数据分析师培养计划》
- 下一篇: 30 个极简Python代码,拿走即用(