溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊(cè)×
其他方式登錄
點(diǎn)擊 登錄注冊(cè) 即表示同意《億速云用戶服務(wù)條款》

Python日志模塊logging

發(fā)布時(shí)間:2020-08-13 01:03:25 來(lái)源:網(wǎng)絡(luò) 閱讀:171 作者:阿飛coach 欄目:編程語(yǔ)言

在上一篇文章《Python系統(tǒng)模塊os》中我留了一個(gè)問(wèn)題,就是python中怎么刪除非空的目錄,這里給出答案。Python刪除非空目錄使用的是shutil模塊。這個(gè)模塊一般用于復(fù)制文件,但是它也具有刪除非空目錄的能力。我們看一下它是怎么刪除的。

>>> os.makedirs('dir1/dir2')
>>> os.listdir('dir1')
['dir2']
>>> shutil.rmtree('dir1')
>>> os.listdir()
[]

在上面的示例代碼中,我先創(chuàng)建了一個(gè)兩級(jí)目錄 dir1/dir2,我使用shutil.rmtree()函數(shù)來(lái)刪除,可以看到可以直接刪除成功。它的用法就是直接給出對(duì)應(yīng)的目錄路徑就可以了。

今天我要介紹的是python提供的日志記錄模塊logging,說(shuō)到日志,相信不管是做開發(fā)的同學(xué)還是做日志的同學(xué)都知道,這個(gè)功能是非常重要的。因?yàn)閺娜罩纠锩嫖覀兛梢宰粉櫿麄€(gè)程序的運(yùn)行過(guò)程,查看報(bào)錯(cuò)信息,進(jìn)行故障分析等等,應(yīng)用可以說(shuō)是非常廣泛。說(shuō)到這里,學(xué)過(guò)Python基礎(chǔ)的同學(xué)可能會(huì)問(wèn),Python不是有print函數(shù)可以用來(lái)輸出調(diào)試信息嗎?
沒(méi)錯(cuò),print函數(shù)確實(shí)可以用來(lái)輸出,但是在實(shí)際的生產(chǎn)環(huán)境代碼中,日志需要?jiǎng)澐謱?duì)應(yīng)的級(jí)別,根據(jù)不同的目的輸出不同數(shù)量的日志。例如排錯(cuò)的時(shí)候,就需要更詳細(xì)一點(diǎn)的日志,而正常運(yùn)行的時(shí)候,輸出少量日志即可。這些功能都是print函數(shù)無(wú)法滿足的,而Python提供的logging庫(kù)則可以滿足需求,話不多說(shuō)。我們來(lái)看這個(gè)模塊的一些知識(shí)。

日志級(jí)別

剛我們說(shuō)到,不同的目的需要不同級(jí)別的日志。在logging模塊中,將日志劃分為7個(gè)級(jí)別,分別是:

  • CRITICAL,災(zāi)難級(jí)別,對(duì)應(yīng)數(shù)值50
  • ERROR,錯(cuò)誤級(jí)別,對(duì)應(yīng)數(shù)值40
  • WARNING,警告級(jí)別,對(duì)應(yīng)數(shù)值30(默認(rèn)值)
  • INFO,信息級(jí)別,對(duì)應(yīng)數(shù)值20
  • DEBUG,調(diào)試級(jí)別,對(duì)應(yīng)數(shù)值10
  • NOTEST,非測(cè)試,對(duì)應(yīng)數(shù)值0

當(dāng)你把日志級(jí)別設(shè)置為其中一個(gè)時(shí),你在程序中進(jìn)行輸出的時(shí)候,只有輸出位置的信息級(jí)別高于默認(rèn)配置,才運(yùn)行讓你把日志信息輸出到文件或者控制臺(tái)。也就是說(shuō),默認(rèn)值是30,你輸出位置的級(jí)別是30,40,50,可以輸出,20,10,0級(jí)別的信息不允許輸出。
當(dāng)你需要進(jìn)行程序調(diào)試的時(shí)候,把日志級(jí)別改為DEBUG,那么能夠輸出的日志數(shù)值大于10就夠了,那么可以輸出的信息就更多,有利于調(diào)試。

格式化字符串

我們?cè)诟鱾€(gè)應(yīng)用程序的日志里看到的信息一般都會(huì)有一些標(biāo)準(zhǔn)格式,常見(jiàn)的是:
什么時(shí)候(日期 時(shí)間) 誰(shuí)(哪個(gè)程序) 做了什么操作 導(dǎo)致了什么后果
而logging模塊中,也可以定制這樣的日志格式,它是通過(guò)不同格式的字符串來(lái)實(shí)現(xiàn)的,我們看一下常用的字符串有哪些。

  • %(message)s,日志的內(nèi)容,需要用戶自己提供信息字符串message
  • %(asctime)s,日志的時(shí)間,默認(rèn)格式是YYYY-mm-dd HH:MM:SS,sss,精確到毫秒
  • %(funcName)s,日志調(diào)用的位置,即日志在哪個(gè)函數(shù)里被調(diào)用。便于排錯(cuò)
  • %(levelno)s,日志級(jí)別,使用INFO,DEBUG這樣的值
  • %(lineno)s,日志調(diào)用的代碼行數(shù),即在哪一行代碼處報(bào)錯(cuò),便于排錯(cuò)。
  • %(module)s,日志在哪個(gè)模塊被調(diào)用,便于排錯(cuò)
  • %(process)d / %(thread)d,進(jìn)程/線程 ID,即調(diào)用日志模塊的進(jìn)程/線程ID。
  • %(processName)s / %(threadName)s,進(jìn)程/ 線程名稱,即調(diào)用日志模塊的進(jìn)程/線程ID。

基本知識(shí)就這些,我們來(lái)看一個(gè)簡(jiǎn)單的示例:

import logging

# 格式化字符串
FORMAT = '%(asctime)-15s\t Log out info : %(thread)d %(threadName)s  %(message)s'

# 使用格式化字符串來(lái)初始化日志模塊輸出的日志格式
logging.basicConfig(format=FORMAT) 

# 輸出日志信息
logging.info("This is an info message")
logging.warning("This is a warning message")

代碼執(zhí)行后的輸出結(jié)果是

2020-02-27 20:40:10,701  Log out info : 140552040826688 MainThread This is an warning message

我們?cè)谏厦嫒罩炯?jí)別里說(shuō)到,WARNING級(jí)別是默認(rèn)級(jí)別,而低于這個(gè)級(jí)別的無(wú)法輸出。logging也為每個(gè)級(jí)別提供了對(duì)應(yīng)的函數(shù),例如這里代碼中的logging.info和logging.warning,就是用來(lái)輸出不同級(jí)別的日志信息。因此只有l(wèi)ogging.warning的信息可以輸出,而logging.info級(jí)別因?yàn)榈陀赪ARNING,不允許輸出。輸出的內(nèi)容包括我們定義的日期、線程ID,線程名稱,自定義的日志信息。

因此,在你的代碼中,在異常處理的時(shí)候,使用WARNING級(jí)別的信息,普通的調(diào)試信息則一般建議使用INFO級(jí)別來(lái)進(jìn)行輸出。

修改日志級(jí)別和日期格式

當(dāng)默認(rèn)日志級(jí)別是WARNING的時(shí)候,INFO級(jí)別是無(wú)法輸出的,那么如果我們需要對(duì)程序進(jìn)行調(diào)試的時(shí)候怎么辦呢?當(dāng)然是修改默認(rèn)的日志級(jí)別了,默認(rèn)的日志級(jí)別可以在日志模塊初始化的時(shí)候進(jìn)行設(shè)置,格式是:

logging.basicConfig(format=FROMAT, level=logging.INFO)

這樣就可以把日志默認(rèn)級(jí)別改為INFO,如果還想輸出更多的信息進(jìn)行調(diào)試,可以改為更低的DEBUG級(jí)別。但是同時(shí)別忘了,在你的程序中,輸出的日志定義的格式也需要分級(jí)的。

上面格式化字符串中我們看到,默認(rèn)的日期格式是YYYY-mm-dd HH:MM:SS,sss,而每個(gè)開發(fā)人員可能習(xí)慣不一樣,或者說(shuō)每個(gè)公司的標(biāo)準(zhǔn)不一樣,這個(gè)時(shí)候可能就需要修改日期格式了。這個(gè)參數(shù)的修改也是在日志模塊初始化的時(shí)候進(jìn)行,用法是:

logging.basicConfig(format=FORMAT, datefmt='%Y/%m/%d %I:%M:%S')

在上面的示例中,我們將輸出的日期改為了上面的格式。這里%Y字樣的字符串,是日期格式化的內(nèi)容,

  • %Y表示YYYY
  • %m表示mm
  • %d表示dd
  • %I表示HH格式,但是是12小時(shí),24小時(shí)使用%H
  • %M表示MM格式分鐘
  • %S表示SS格式秒
    最終的輸出結(jié)果就是:
    2020/02/27 08:43:22  Log out info : 140034488715072 MainThread This is an warning message
輸出日志到文件

上面的基本配置中,沒(méi)有配置是否要把日志輸出到文件,那么它默認(rèn)就會(huì)把文件輸出到控制臺(tái)。必須指定輸出文件的位置,才會(huì)自動(dòng)輸出到文件中。配置格式如下:

logging.basicConfig(format=FORMAT,  filename='/var/log/demo.log')

這樣配置以后,日志就會(huì)自動(dòng)輸出到/var/log/demo.log這個(gè)文件中,這里有幾個(gè)需要注意的地方:

  1. 需要保證程序?qū)@個(gè)日志文件有讀寫權(quán)限
  2. 盡量使用絕對(duì)路徑,使用相對(duì)路徑,可能會(huì)因?yàn)槌绦驁?zhí)行的位置不同,導(dǎo)致日志文件出現(xiàn)在不同的位置
  3. 還有一個(gè)filemode參數(shù)設(shè)置日志文件打開方式,默認(rèn)值是'a',即追加的方式。

以上就是logging模塊的基本用法,如果覺(jué)得對(duì)你有幫助,可以為我點(diǎn)個(gè)贊。

向AI問(wèn)一下細(xì)節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如果涉及侵權(quán)請(qǐng)聯(lián)系站長(zhǎng)郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI