我给这个Python库打101分!
日志在開(kāi)發(fā)過(guò)程中是一種被很多程序員不重視,但是卻至關(guān)重要的一項(xiàng)功能。
我認(rèn)為在一個(gè)系統(tǒng)的整個(gè)生命周期里,日志系統(tǒng)雖然工作量不大,但是論重要性程度能夠占10%-15%的比重,或者更高。
優(yōu)秀的日志管理,至少能夠從3個(gè)方面提升系統(tǒng):
調(diào)試速度
執(zhí)行效率
運(yùn)維效率
很少有人敢確保一個(gè)系統(tǒng)開(kāi)發(fā)完成之后不會(huì)出現(xiàn)任何問(wèn)題,因此,在一個(gè)完善的商業(yè)化系統(tǒng)設(shè)計(jì)過(guò)程中,日志管理都會(huì)被視為一個(gè)重要模塊。
日志輸出、Kafka日志訂閱、日志分析,完備的日志管理能夠在系統(tǒng)出現(xiàn)問(wèn)題時(shí),維護(hù)人員需要明確4個(gè)問(wèn)題:
問(wèn)題是什么?
問(wèn)題出在哪?
什么時(shí)間出現(xiàn)的問(wèn)題?
為什么出現(xiàn)問(wèn)題?
然后,快速定位、快速恢復(fù)系統(tǒng)正常運(yùn)行。要清楚的是,系統(tǒng)正式上線之后,恢復(fù)系統(tǒng)時(shí)間每多耗費(fèi)1分鐘,它帶來(lái)的資損和負(fù)面影響都是無(wú)法估量的。
而在Python中,提到日志管理每個(gè)大多數(shù)Python開(kāi)發(fā)者都會(huì)脫口而出logging。
logging是Python內(nèi)置的標(biāo)準(zhǔn)庫(kù),也是使用頻率較高的日志管理Python庫(kù),但是它有著一些明顯的缺點(diǎn):
功能單一
執(zhí)行效率低
需要手動(dòng)配置
Python內(nèi)置的標(biāo)準(zhǔn)logging庫(kù)默認(rèn)配置輸出的日志內(nèi)容非常簡(jiǎn)單,沒(méi)有時(shí)間、位置這些在日志管理過(guò)程中至關(guān)重要的信息,每一次使用都需要自己手動(dòng)配置一下,這樣會(huì)帶來(lái)冗余的代碼和工作量。
為了解決這些問(wèn)題,本文就來(lái)介紹一款可以很好替代標(biāo)準(zhǔn)logging庫(kù)的第三方日志管理庫(kù)--Eliot。
Eliot
前面已經(jīng)提到,一個(gè)優(yōu)秀的日志管理系統(tǒng)至少要回答4個(gè)問(wèn)題:
問(wèn)題是什么?
問(wèn)題出在哪?
什么時(shí)間出現(xiàn)的問(wèn)題?
為什么出現(xiàn)問(wèn)題?
但是,大多數(shù)日志庫(kù)都不具備這樣的功能。而本文介紹的Eliot恰好都能滿足這些需求。
除了能夠回答上述問(wèn)題,告訴你問(wèn)題是什么、問(wèn)題出在哪、為什么出現(xiàn)問(wèn)題,Eliot還具有很多其他特性:
結(jié)構(gòu)化輸出日志信息,能夠?qū)敵鲆荒苛巳?/p>
可以用于解析和過(guò)濾日志
不僅記錄簡(jiǎn)單信息,還可以追蹤程序的執(zhí)行過(guò)程
性能非常好,使用非堵塞IO
可以結(jié)合Logstash/Elasticsearch使用
下面就來(lái)看一下Eliot的基本使用,更加豐富的功能,各位同學(xué)可以閱讀一下文檔仔細(xì)了解一下Eliot的使用。
安裝
可以使用pip安裝,
$?pip?install?eliot?eliot-tree也可以使用conda安裝,
$?conda?install?-c?conda-forge?eliot?eliot-tree安裝的eliot用于日志的生成、輸出、分析等功能,eliot-tree可以實(shí)現(xiàn)以樹(shù)結(jié)構(gòu)可視化日志信息。
使用
首先給出一段示例代碼,
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:用于創(chuàng)建動(dòng)作,如果動(dòng)作成功則輸出succeed ,否則拋出異常;
然后再命令行下執(zhí)行代碼:
$?python?linkcheck.py這時(shí)候會(huì)發(fā)現(xiàn)生成了一個(gè)名為linkcheck.log的日志文件。
但是,當(dāng)用文本編輯器打開(kāi)的時(shí)候會(huì)發(fā)現(xiàn),日志的格式很單一、并沒(méi)有樹(shù)結(jié)構(gòu)的信息。
如果想以樹(shù)結(jié)構(gòu)的方式可視化輸出信息,就需要用到eliot-tree這個(gè)工具。
$ 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在這個(gè)結(jié)構(gòu)化的日志信息中,可以一目了然的看出3個(gè)方面的信息:
哪些動(dòng)作成功了,哪些動(dòng)作失敗了;
失敗的動(dòng)作會(huì)記錄異常
日志追蹤并記錄了執(zhí)行的詳細(xì)動(dòng)作
另外,執(zhí)行每一步的詳細(xì)時(shí)間戳也被記錄在日志中。
除了在日志生成和輸出增強(qiáng)日志管理之外,Eliot還在日志分析方面也提供了很不錯(cuò)的解決方案。
在以往,系統(tǒng)運(yùn)行很長(zhǎng)時(shí)間之后會(huì)產(chǎn)生大量的日志,通過(guò)肉眼逐行去看、或者手動(dòng)搜索關(guān)鍵字的方式都不顯示,從零開(kāi)始開(kāi)發(fā)一款日志分析系統(tǒng)耗費(fèi)成本也較高。
Eliot針對(duì)日志分析加入了2項(xiàng)非常實(shí)用的功能:
過(guò)濾
解析
通過(guò)這2項(xiàng)功能,就不需要再去寫一個(gè)復(fù)雜的邏輯去處理日志文件、解析對(duì)應(yīng)的行和關(guān)鍵字。在Eliot中,只需要簡(jiǎn)短的代碼就可以實(shí)現(xiàn)日志的定位和解析。除此之外,Eliot轉(zhuǎn)為json輸出而設(shè)計(jì),可以結(jié)合Elasticsearch使用,簡(jiǎn)歷搜索索引,能夠通過(guò)自建的搜索引擎快速搜索到想要的日志信息。
與50位技術(shù)專家面對(duì)面20年技術(shù)見(jiàn)證,附贈(zèng)技術(shù)全景圖總結(jié)
以上是生活随笔為你收集整理的我给这个Python库打101分!的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: 《京东商业化数据分析师培养计划》
- 下一篇: 30 个极简Python代码,拿走即用(