Python日志模塊介紹

logging是python自帶的標準庫,無需使用pip進行安裝挺智。

import logging

日志模塊作用

  • 用于程序開發(fā)過程中的調(diào)試運行記錄
  • 可以輸出到日志文件矾瑰,方便開發(fā)人員和運維人員對已經(jīng)在現(xiàn)場部署程序的運行狀態(tài)的掌握衷佃,若程序報錯或運行結(jié)果不對欺冀,可根據(jù)日志文件進行錯誤定位

日志級別

logging模塊預(yù)定義了5種日志級別试幽,并根據(jù)它們所跟蹤的事件的級別或嚴重程度來命名筝蚕,具體如下:

Level Numeric Value When it's used
DEBUG 10 報告詳細的程序運行結(jié)果,用于調(diào)試
INFO 20 報告程序正常運行期間發(fā)生的事件铺坞,或一些結(jié)果記錄饰及,確認程序在按照預(yù)期進行。
WARNING 30 發(fā)出關(guān)于特定運行時事件的警告康震,說明程序本身對這種情況的處理是無能為力的燎含,但是依然需要報告該情況。(例如輸入數(shù)據(jù)小于0等不是由于算法造成的情況)
ERROR 40 報告異常腿短,由于一個更嚴重的問題屏箍,程序已經(jīng)不能執(zhí)行一些功能。
CRITICAL 50 表明程序本身可能無法繼續(xù)運行橘忱。

注意:

  • 在配置日志模塊時赴魁,需要設(shè)定日志級別,低于該日志級別的日志記錄將不會被打印輸出钝诚。(默認級別是WARNING

  • 可以自己自定義新的日志級別颖御,當新定義的numeric value與預(yù)定義的value重復時,預(yù)定義的級別將會被覆蓋

日志模塊的四個重要組件

  • Loggers:算法與日志模塊的接口

  • Handlers:將日志記錄發(fā)送到指定的目標(控制臺凝颇、文件潘拱、郵件等)

  • Formatters:指定最終輸出中日志記錄的樣式。

  • Filters:為確定輸出哪些日志記錄提供了更細粒度的工具拧略。

Loggers

Logger對象有三個功能:

  • 提供接口給算法芦岂,算法在運行時通過調(diào)用這些接口來記錄日志
  • 根據(jù)級別或過濾對象確定要對哪些日志消息進行操作(to Handles)。
  • 將日志消息傳遞給所有與之相關(guān)的處理器垫蛆。

Logger對象的使用最廣泛的方法主要是:配置和記錄消息

常用配置:
  • Logger.setLever(): 用于設(shè)置日志級別
  • Logger.addHandler(): 添加處理器
  • Logger.addFilter(): 添加過濾器
記錄消息

當配置了Logger對象后禽最,就可以使用Logger.debug(), Logger.info(), Logger.warning, Logger.error, Logger.critical() 方法來創(chuàng)建日志消息,只需將需要記錄的消息寫進括號內(nèi)即可

所有需要被記錄的消息實際上是一個字符串袱饭,它可以包含標準字符串替換語法%s川无、%d%f等來實現(xiàn)具體數(shù)據(jù)的輸出虑乖。

Handlers

Handler對象負責將日志消息(基于日志消息的嚴重性)分派給處理器的指定目標懦趋。在上一步中提到,可以使用Logger.addHandler()來添加零個或多個處理器對象决左。例如愕够,算法可以將所有日志消息都發(fā)送到控制臺,將ERROR或者更高級別的消息發(fā)送到磁盤文件佛猛。這就需要兩個單獨的處理器惑芭。

處理器有很多種類,常用的主要有以下幾種:

  • StreamHandler: 將日志記錄輸出到數(shù)據(jù)流(例如sys.stdout, sys.stderr, 或者任何文件類對象)

  • FileHandler:將日志記錄輸出到磁盤文件中继找,它繼承了StreamHandler的輸出

  • RotatingFileHandler:支持磁盤日志文件按文件大小輪換遂跟。當文件即將超出預(yù)定大小時,將關(guān)閉舊文件并打開一個新文件用于輸出婴渡。

  • TimedRotatingFileHandler:支持磁盤日志文件按照特定時間間隔輪換幻锁。

Formatters

Formatter對象是用來配置日志消息的最終輸出形式。其格式由%(<dictionary key>)s這樣的表達形式來組合成字符串边臼。例如:

'%(asctime)s - %(levelname)s - %(message)s'

其中哄尔,可以設(shè)置的<dictionary key>可參考LogRecord屬性

配置日志模塊

將日志記錄輸出在控制臺
import logging

# 創(chuàng)建一個logger實例并設(shè)置日志級別
logger = logging.getLogger('alg_name')
logger.setLevel(logging.DEBUG)

# 配置handler,擬將日志記錄輸出在控制臺
stdout_handler = logging.StreamHandler()

# 配置formatter
formatter = logging.Formatter('%(asctime)s - %(name)s - %(levelname)s - %(message)s')
stdout_handler.setFormatter(formatter)

# 添加handler至logger
logger.addHandler(stdout_handler)

配置完后柠并,我們就可以在我們算法想要進行日志記錄的地方調(diào)用Logger.debug(), Logger.info(), Logger.warning, Logger.error, Logger.critical()來進行日志輸出了岭接。比如:

# 下面的內(nèi)容都是寫在算法文件里你需要的地方
logger.debug('debug message')
logger.info('info message')
logger.warning('warn message')
logger.error('error message')
logger.critical('critical message')

當運行算法時,你會看到控制臺輸出以下內(nèi)容

2005-03-19 15:10:26,618 - alg_name - DEBUG - debug message
2005-03-19 15:10:26,620 - alg_name - INFO - info message
2005-03-19 15:10:26,695 - alg_name - WARNING - warn message
2005-03-19 15:10:26,697 - alg_name - ERROR - error message
2005-03-19 15:10:26,773 - alg_name - CRITICAL - critical message
將日志記錄輸出至日志文件
import logging

# 創(chuàng)建一個logger實例并設(shè)置日志級別
logger = logging.getLogger('alg_name')
logger.setLevel(logging.DEBUG)

# 配置handler臼予,擬將日志記錄輸出至/log/文件夾
file_name = './log/alg_name_log.log'  # 注意:如果/log/文件夾不存在鸣戴,則需要新建
file_handler = logging.handlers.TimedRotatingFileHandler(file_name, when='MIDNIGHT', interval=1, backupCount=30)  # 每天午夜生成alg_name_log.log文件,最多保留30天

# 配置formatter
formatter = logging.Formatter('%(levelname)s - %(asctime)s [%(filename)s:%(lineno)d] %(message)s \n')
file_handler.setFormatter(formatter)

# 添加handler至logger
logger.addHandler(file_handler)
參考鏈接

https://docs.python.org/3/howto/logging.html#logging-howto

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末粘拾,一起剝皮案震驚了整個濱河市窄锅,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌缰雇,老刑警劉巖入偷,帶你破解...
    沈念sama閱讀 217,509評論 6 504
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異械哟,居然都是意外死亡盯串,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,806評論 3 394
  • 文/潘曉璐 我一進店門戒良,熙熙樓的掌柜王于貴愁眉苦臉地迎上來体捏,“玉大人,你說我怎么就攤上這事糯崎〖哥裕” “怎么了?”我有些...
    開封第一講書人閱讀 163,875評論 0 354
  • 文/不壞的土叔 我叫張陵沃呢,是天一觀的道長年栓。 經(jīng)常有香客問我,道長薄霜,這世上最難降的妖魔是什么某抓? 我笑而不...
    開封第一講書人閱讀 58,441評論 1 293
  • 正文 為了忘掉前任纸兔,我火速辦了婚禮,結(jié)果婚禮上否副,老公的妹妹穿的比我還像新娘汉矿。我一直安慰自己,他們只是感情好备禀,可當我...
    茶點故事閱讀 67,488評論 6 392
  • 文/花漫 我一把揭開白布洲拇。 她就那樣靜靜地躺著,像睡著了一般曲尸。 火紅的嫁衣襯著肌膚如雪赋续。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,365評論 1 302
  • 那天另患,我揣著相機與錄音纽乱,去河邊找鬼。 笑死昆箕,一個胖子當著我的面吹牛迫淹,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播为严,決...
    沈念sama閱讀 40,190評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼敛熬,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了第股?” 一聲冷哼從身側(cè)響起应民,我...
    開封第一講書人閱讀 39,062評論 0 276
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎夕吻,沒想到半個月后诲锹,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,500評論 1 314
  • 正文 獨居荒郊野嶺守林人離奇死亡涉馅,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,706評論 3 335
  • 正文 我和宋清朗相戀三年归园,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片稚矿。...
    茶點故事閱讀 39,834評論 1 347
  • 序言:一個原本活蹦亂跳的男人離奇死亡庸诱,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出晤揣,到底是詐尸還是另有隱情桥爽,我是刑警寧澤,帶...
    沈念sama閱讀 35,559評論 5 345
  • 正文 年R本政府宣布昧识,位于F島的核電站钠四,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏跪楞。R本人自食惡果不足惜缀去,卻給世界環(huán)境...
    茶點故事閱讀 41,167評論 3 328
  • 文/蒙蒙 一侣灶、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧缕碎,春花似錦褥影、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,779評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽煞檩。三九已至处嫌,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間斟湃,已是汗流浹背熏迹。 一陣腳步聲響...
    開封第一講書人閱讀 32,912評論 1 269
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留凝赛,地道東北人注暗。 一個月前我還...
    沈念sama閱讀 47,958評論 2 370
  • 正文 我出身青樓,卻偏偏與公主長得像墓猎,于是被迫代替她去往敵國和親捆昏。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 44,779評論 2 354

推薦閱讀更多精彩內(nèi)容