Python logging模塊

Python logging 模塊

例子

  • 代碼


    Paste_Image.png
  • 輸出結(jié)果


    Paste_Image.png

詳解

  • logging.basicConfig()函數(shù)中可通過(guò)具體參數(shù)來(lái)更改logging模塊默認(rèn)行為,可用參數(shù)
  • filename:用于指定文件名創(chuàng)建FileHandler,存儲(chǔ)日志到指定文件中。
  • filemode:文件打開(kāi)方式,在指定了filename時(shí)使用這個(gè)參數(shù),默認(rèn)值為"a"(只讀),還可指定為"w"(只寫)。
  • format:指定handler使用的日志顯示格式。
  • datefmt:指定日期時(shí)間格式。
  • level:設(shè)置rootlog的日志級(jí)別。
  • stream:用指定的stream創(chuàng)建StreamHandler??梢灾付ㄝ敵龅絪ys.stderr,sys.stdout或者文件,默認(rèn)為sys.stderr。若同時(shí)列出了fliename和stream兩個(gè)參數(shù),則stream參數(shù)會(huì)被忽略。

format 參數(shù)中可能用到的格式化串:

  • %(name)s Logger的名字
  • %(levelno)s 數(shù)字形式的日志
  • %(levelname)s 文本形式的日志
  • %(pathname)s 調(diào)用日志輸出函數(shù)的模塊的完整路徑名,可能沒(méi)有
  • %(filename)s 調(diào)用日志輸出函數(shù)的模塊的文件名
  • %(module)s 調(diào)用日志輸出函數(shù)的模塊名
  • %(funcName)s 調(diào)用日志輸出函數(shù)的函數(shù)名
  • %(lineno)d 調(diào)用日志輸出函數(shù)的語(yǔ)句所在的代碼行
  • %(created)f 當(dāng)前時(shí)間,用UNIX標(biāo)準(zhǔn)的表示時(shí)間的浮點(diǎn)數(shù)表示
  • %(relativeCreated)d 輸出日志信息時(shí)的,自logger創(chuàng)建以來(lái)的毫秒數(shù)。
  • %(asctime)s 字符串形式的當(dāng)前時(shí)間。默認(rèn)格式"2016-07-19 16:06:46,292"
  • %(thread)d 線程名??赡軟](méi)有
  • %(process)d 進(jìn)程ID??赡軟](méi)有
  • %(message)s 用戶輸出的信息。

logging

  • logging 庫(kù)提供了多個(gè)組件:Logger、Handler、Filter、Formatter。Logger對(duì)象提供應(yīng)用程序可直接使用的接口,Handler發(fā)生日志到適當(dāng)?shù)哪康牡?,F(xiàn)ilter提供了過(guò)濾日志信息的方法,F(xiàn)ormatter指定日志顯示格式。

Logger

  • Logger 是一個(gè)樹(shù)形層級(jí)結(jié)構(gòu),輸出信息之前都要獲得一個(gè)Logger(如果沒(méi)有顯示的獲取則自動(dòng)創(chuàng)建并使用root Logger)。logger=logging.getLogger()返回一個(gè)默認(rèn)的Logger也即root Logger,并應(yīng)用默認(rèn)日志級(jí)別、Handler和Formatter設(shè)置。當(dāng)然也可以通過(guò)Logger.setLevel(lel)指定最低的日志級(jí)別,可用的日志級(jí)別有l(wèi)ogging.DEBUG、logging.INFO、logging.WARNING、logging.ERROR、logging.CRITICAL。

  • Logger.debug()、Logger.info()、Logger.warning()、Logger.error()、Logger.critical()輸出不同級(jí)別的日志,只有日志等級(jí)大于或等于設(shè)置的日志級(jí)別的日志才會(huì)被輸出。

  • 創(chuàng)建一個(gè)logger


日志級(jí)別等級(jí)

  • 默認(rèn)的日志級(jí)別設(shè)置為WARNING,日志級(jí)別等級(jí)CRITICAL > ERROR > WARNING > INFO > DEBUG > NOTSET

Handler

  • 定義Handler
    fh = logging.FileHandler('test.log')
    ch = logging.StreamHandler()
  • Handler 對(duì)象負(fù)責(zé)發(fā)送相關(guān)信息到指定目的地,有幾個(gè)常用的Handler方法:
    Handler.setLevel(lev):指定日志級(jí)別,低于級(jí)別的日志將被忽略
    Handler.setFormatter():給這個(gè)handler選擇一個(gè)Formatter
    Handler.addFilter(filt):新增一個(gè)filter對(duì)象
    Handler.removeFilter(filt):刪除一個(gè)filter對(duì)象
  • 為 Logger 添加多個(gè)Handler:
    logger.addHandler(fh)
    logger.addHandler(ch)
  • 有多種可用的Handler:
    logging.StreamHandler 可以向類似與sys.stdout或者sys.stderr的任何文件對(duì)象(file object)輸出信息
    logging.FileHandler 用于向一個(gè)文件輸出日志信息logging.handlers.RotatingFileHandler 類似于上面的FileHandler,但是它可以管理文件大小。當(dāng)文件達(dá)到一定大小之后,它會(huì)自動(dòng)將當(dāng)前日志文件改名,然后創(chuàng)建一個(gè)新的同名日志文件繼續(xù)輸出logging.handlers.TimedRotatingFileHandler 和RotatingFileHandler類似,不過(guò),它沒(méi)有通過(guò)判斷文件大小來(lái)決定何時(shí)重新創(chuàng)建日志文件,而是間隔一定時(shí)間就自動(dòng)創(chuàng)建新的日志文件
    logging.handlers.SocketHandler 使用TCP協(xié)議,將日志信息發(fā)送到網(wǎng)絡(luò)。
    logging.handlers.DatagramHandler 使用UDP協(xié)議,將日志信息發(fā)送到網(wǎng)絡(luò)。
    logging.handlers.SysLogHandler 日志輸出到sysloglogging.handlers.NTEventLogHandler 遠(yuǎn)程輸出日志到Windows NT/2000/XP的事件日志
    logging.handlers.SMTPHandler 遠(yuǎn)程輸出日志到郵件地址logging.handlers.MemoryHandler 日志輸出到內(nèi)存中的制定bufferlogging.handlers.HTTPHandler 通過(guò)"GET"或"POST"遠(yuǎn)程輸出到HTTP服務(wù)器
    https://docs.python.org/2/library/logging.handlers.html#module-logging.handlers

Formatter

  • Formatter 對(duì)象設(shè)置日志信息最后的規(guī)則、結(jié)構(gòu)、和內(nèi)容,默認(rèn)時(shí)間格式為 %Y-%m-%d %H:%M:%S
  • 定義 Formatter
    formatter = logging.Formatter('%(asctime)s - %(name)s - %(levename)s - %(message)s')
  • 為Handler添加Formatter
    fh.setFormatter(formatter)
    ch.setFormatter(formatter)

Filter

  • 限制只有滿足過(guò)濾規(guī)則的日志才會(huì)輸出
  • 比如我們定義了filter = logging.Filter('a.b.c'),并將這個(gè)Filter添加到了一個(gè)Handler上,則使用該Handler的Logger中只有名字帶a.b.c前綴的Logger才能輸出其日志
    filter = logging.Filter('mylogger.child1.child2')
    fh.addFilter(filter)
  • 若為Handler添加Filter則所有使用了該Handler的logger都會(huì)受到影響。而為L(zhǎng)ogger添加Filer只會(huì)影響到自身。、
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書(shū)系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容