1竟趾、日志的作用
從事與軟件相關(guān)工作的人憔购,應(yīng)該都聽(tīng)過(guò)“日志”一詞。
日志就是跟蹤軟件運(yùn)行時(shí)事件的方法岔帽,為了能夠在程序運(yùn)行過(guò)程中記錄錯(cuò)誤玫鸟。
通過(guò)日志記錄程序的運(yùn)行,方便我們查詢(xún)信息犀勒,以便追蹤問(wèn)題屎飘、進(jìn)行維護(hù)和調(diào)試妥曲、還是數(shù)據(jù)分析。
并且各編程語(yǔ)言都形成了各自的日志體系和相應(yīng)的框架钦购。
總結(jié):日志的作用
程序調(diào)試檐盟。
了解軟件程序運(yùn)行情況,是否正常押桃。
軟件程序運(yùn)行故障分析與問(wèn)題定位葵萎。
2、為什么需要寫(xiě)日志
首先我們要樹(shù)立一個(gè)觀點(diǎn)唱凯,那就是“不是為了記錄日志而記錄日志陌宿,日志也不是隨意記的”。要實(shí)現(xiàn)能夠只通過(guò)日志文件還原整個(gè)程序執(zhí)行的過(guò)程波丰,達(dá)到能透明地看到程序里執(zhí)行情況壳坪,每個(gè)線(xiàn)程每個(gè)過(guò)程到底執(zhí)行結(jié)果的目的。日志就像飛機(jī)的黑匣子一樣掰烟,應(yīng)當(dāng)能夠復(fù)原異常的整個(gè)現(xiàn)場(chǎng)乃至細(xì)節(jié)爽蝴。
在項(xiàng)目中,日志這個(gè)功能非常重要纫骑,我們要重視起來(lái)蝎亚。
我們要知道日志能用來(lái)干什么,能干到什么程度先馆。
要知道日志框架的使用方法和配置方式发框。
要知道什么地方該進(jìn)行日志記錄。
要知道進(jìn)行什么級(jí)別的日志記錄煤墙。
日志中該寫(xiě)些什么內(nèi)容梅惯。
3、Python中的日志處理
(1)logging模塊介紹
在Python中仿野,使用logging
模塊來(lái)進(jìn)行日志的處理铣减。
logging
是python的內(nèi)置模塊,主要用于將日志信息進(jìn)行格式化內(nèi)容輸出脚作,可將格式化內(nèi)容輸出到文件葫哗,也可輸出到屏幕。
我們?cè)陂_(kāi)發(fā)過(guò)程中球涛,常用print()
函數(shù)來(lái)進(jìn)行調(diào)試劣针,但是在實(shí)際應(yīng)用的部署時(shí),我們要將日志信息輸出到文件中亿扁,方便后續(xù)查找以及備份捺典。
在我們使用日志管理時(shí),我們也可以將日志格式化成Json對(duì)象轉(zhuǎn)存到ELK中方便圖形化查看及管理魏烫。
(2)logging模塊的四大組件
logging
模塊將日志系統(tǒng)從高向低依次定義了四個(gè)類(lèi)辣苏,分別是logger(日志器)、handler(處理器)哄褒、filter(過(guò)濾器)和formatter(格式器)稀蟋。其中由日志器生成的實(shí)例將接管原本日志記錄函數(shù)logging.log
的功能。
組件 | 說(shuō)明 |
---|---|
logger | 提供應(yīng)用程序代碼直接使用的接口呐赡。 |
handler | 用于將日志記錄發(fā)送到指定的目的位置骡尽。 |
formatter | 用于控制日志信息的最終輸出格式县爬,格式化輸出。 |
filter | 提供更細(xì)粒度的日志過(guò)濾功能,用于決定哪些日志記錄將會(huì)被輸出(其它的日志記錄將會(huì)被忽略)确憨。 |
說(shuō)明:
-
Logger
用于記錄日志的對(duì)象。
工作流程:
1借尿、判斷需要記錄的日志level是否滿(mǎn)足當(dāng)前l(fā)ogger對(duì)象設(shè)置的level等級(jí)要求民鼓。
比如logger設(shè)置的level是Info,記錄時(shí)使用的logger.debug霹琼,那么就會(huì)不滿(mǎn)足务傲,所以不會(huì)記錄日志。
2枣申、查看logger的filter過(guò)濾器是否滿(mǎn)足售葡。
3、filter通過(guò)之后忠藤,交給logger的handler來(lái)記錄日志挟伙,一個(gè)logger是可以設(shè)置多個(gè)handler。
注意:在整個(gè)應(yīng)用中可以有多個(gè)logger模孩,使用logging.getLogger時(shí)通過(guò)指定name來(lái)獲取對(duì)象尖阔,實(shí)際logging中還存在一個(gè)Manager類(lèi),由Manager來(lái)進(jìn)行多l(xiāng)ogger的單例模式管理榨咐。
-
Handler
用于記錄日志到具體的文件诺祸、輸出流或其他的管道。
功能:
1祭芦、查看記錄日志是否滿(mǎn)足過(guò)濾器筷笨。
2、滿(mǎn)足過(guò)濾器龟劲,按照設(shè)置的Formatter生成字符串胃夏。
3、將內(nèi)容寫(xiě)入到具體的文件或者輸出流
不同的Handler可能有不同的處理昌跌,但是底層原理還是做這三件事情仰禀。
(3)logging日志級(jí)別
我們先來(lái)思考下下面的兩個(gè)問(wèn)題:
作為開(kāi)發(fā)人員,在開(kāi)發(fā)一個(gè)應(yīng)用程序時(shí)需要什么日志信息蚕愤?在應(yīng)用程序正式上線(xiàn)后需要什么日志信息答恶?
作為應(yīng)用運(yùn)維人員饺蚊,在部署開(kāi)發(fā)環(huán)境時(shí)需要什么日志信息?在部署生產(chǎn)環(huán)境時(shí)需要什么日志信息悬嗓?
在軟件開(kāi)發(fā)階段或部署開(kāi)發(fā)環(huán)境時(shí)污呼,為了盡可能詳細(xì)的查看應(yīng)用程序的運(yùn)行狀態(tài)來(lái)保證上線(xiàn)后的穩(wěn)定性,我們可能需要把該應(yīng)用程序所有的運(yùn)行日志全部記錄下來(lái)進(jìn)行分析包竹,這是非常耗費(fèi)機(jī)器性能的燕酷。
當(dāng)應(yīng)用程序正式發(fā)布或在生產(chǎn)環(huán)境部署應(yīng)用程序時(shí),我們通常只需要記錄應(yīng)用程序的異常信息周瞎、錯(cuò)誤信息等苗缩,這樣既可以減小服務(wù)器的I/O壓力,也可以避免我們?cè)谂挪楣收蠒r(shí)被淹沒(méi)在日志的海洋里声诸。
那么怎樣才能在不改動(dòng)應(yīng)用程序代碼的情況下酱讶,根據(jù)事件的重要性或者稱(chēng)之為等級(jí),實(shí)現(xiàn)在不同的環(huán)境中彼乌,記錄不同詳細(xì)程度的日志呢浴麻?
這就是日志等級(jí)的作用了,我們通過(guò)配置文件指定我們需要的日志等級(jí)就可以了囤攀。
級(jí)別 | 何時(shí)使用 |
---|---|
DEBUG |
細(xì)節(jié)信息软免,僅當(dāng)診斷問(wèn)題時(shí)適用。 |
INFO |
確認(rèn)程序按預(yù)期運(yùn)行焚挠。 |
WARNING |
表明發(fā)生了一些意外膏萧,或者不久的將來(lái)會(huì)發(fā)生問(wèn)題(如‘磁盤(pán)滿(mǎn)了’)。但程序還是在正常工作蝌衔。 |
ERROR |
由于嚴(yán)重的問(wèn)題榛泛,程序的某些功能已經(jīng)不能正常執(zhí)行。 |
CRITICAL |
嚴(yán)重的錯(cuò)誤噩斟,表明程序已不能繼續(xù)運(yùn)行了曹锨。 |
說(shuō)明:
上面列表中的日志等級(jí)是從上到下依次升高的,即:DEBUG<INFO<WARNING<ERROR<CRITICAL剃允。而日志的信息量是依次減少的沛简。
當(dāng)為某個(gè)應(yīng)用程序指定一個(gè)日志級(jí)別后,應(yīng)用程序會(huì)記錄所有日志級(jí)別大于或等于指定日志級(jí)別的日志信息斥废,而不是僅僅記錄指定級(jí)別的日志信息椒楣,小于該等級(jí)的日志記錄將會(huì)被丟棄。
總結(jié):
- 開(kāi)發(fā)應(yīng)用程序時(shí)或部署開(kāi)發(fā)環(huán)境時(shí)牡肉,可以使用DEBUG或INFO級(jí)別的日志獲取盡可能詳細(xì)的日志信息捧灰,可以方便進(jìn)行開(kāi)發(fā)或部署調(diào)試。
- 應(yīng)用上線(xiàn)或部署生產(chǎn)環(huán)境時(shí)统锤,應(yīng)用使用WARNING或ERROR或CRITICAL級(jí)別的日志毛俏,來(lái)降低機(jī)器的I/O壓力和提高獲取錯(cuò)誤日志信息的效率炭庙。
- 日志級(jí)別的指定通常都是在應(yīng)用程序的配置文件中進(jìn)行指定的。
- 不同的應(yīng)用程序所定義的日志等級(jí)會(huì)有所差別煌寇,根據(jù)實(shí)際需求來(lái)決定焕蹄。
參考: