python標準日誌模組logging的使用方法

2021-09-22 13:24:19 字數 4040 閱讀 5105

參考位址

最近寫乙個爬蟲系統,需要用到python的日誌記錄模組,於是便學習了一下。

python的標準庫里的日誌系統從python2.3開始支援。只要import logging這個模組即可使用。如果你想開發乙個日誌系統, 既要把日誌輸出到控制台, 還要寫入日誌檔案,只要這樣使用:

複製****如下:

import logging

# 建立乙個logger

logger = logging.getlogger('mylogger')

logger.setlevel(logging.debug)

# 建立乙個handler,用於寫入日誌檔案

fh = logging.filehandler('test.log')

fh.setlevel(logging.debug)

# 再建立乙個handler,用於輸出到控制台

ch = logging.streamhandler()

ch.setlevel(logging.debug)

# 定義handler的輸出格式

formatter = logging.formatter('%(asctime)s - %(name)s - %(levelname)s - %(message)s')

fh.setformatter(formatter)

ch.setformatter(formatter)

# 給logger新增handler

logger.addhandler(fh)

logger.addhandler(ch)

# 記錄一條日誌

logger.info('foorbar')

結合上面的例子,我們說下幾個最常使用的api:

logging.getlogger([name])

返回乙個logger例項,如果沒有指定name,返回root logger。只要name相同,返回的logger例項都是同乙個而且只有乙個,即name和logger例項是一一對應的。這意味著,無需把logger例項在各個模組中傳遞。只要知道name,就能得到同乙個logger例項。

logger.setlevel(lvl)

設定logger的level, level有以下幾個級別:

級別高低順序:notset < debug < info < warning < error < critical

如果把looger的級別設定為info, 那麼小於info級別的日誌都不輸出, 大於等於info級別的日誌都輸出  

複製****如下:

logger.debug("foobar")    # 不輸出   

logger.info("foobar")        # 輸出  

logger.warning("foobar")  # 輸出  

logger.error("foobar")      # 輸出  

logger.critical("foobar")    # 輸出  

logger.addhandler(hdlr)

通過handler物件可以把日誌內容寫到不同的地方。比如簡單的streamhandler就是把日誌寫到類似檔案的地方。python提供了十幾種實用handler,比較常用有:

複製****如下:

streamhandler: 輸出到控制台

filehandler:   輸出到檔案

baserotatinghandler 可以按時間寫入到不同的日誌中。比如將日誌按天寫入不同的日期結尾的檔案檔案。

sockethandler 用tcp網路連線寫log

datagramhandler 用udp網路連線寫log

smtphandler 把log寫成email郵寄出去

logging.basicconfig([**kwargs])* 這個函式用來配置root logger, 為root logger建立乙個streamhandler,設定預設的格式。* 這些函式: logging.debug()、logging.info()、logging.warning()、logging.error()、logging.critical() 如果呼叫的時候發現root logger沒有任何handler,會自動呼叫basicconfig新增乙個handler* 如果root logger已有handler,這個函式不做任何事情使用basicconfig來配置root logger的輸出格式和level:

複製****如下:

import logging

logging.basicconfig(format='%(levelname)s:%(message)s', level=logging.debug)

ogger物件直接提供日誌介面。formatter描述日誌的格式。handler把日誌寫到不同的地方,你可以把日誌儲存成本地檔案,也可以每個小時寫乙個日誌檔案,還可以把日誌通過socket傳到別的機器上。

從最簡單的formatter物件來看。formatter指定的是每一條日誌記錄的抬頭資訊,也就是你可以指定日誌記錄的時間格式、程序號、檔名、函式名等資訊。可以用這個方法來建立乙個formatter物件:

複製****如下:

logging.formatter.__init__( fmt=none, datefmt=none)

fmt引數指定程序號、檔名、函式名等資訊是否出現以及格式, datefmt為日期時間格式,預設的日期格式精確到微秒,例如『2003-07-08 16:49:45,896'。fmt中可以指定多個字段,每個欄位的格式為「%()s」, 例如你想列印時間、日誌級別、日誌資訊可以用下面的format:

複製****如下:

在記錄爬蟲系統日誌的時候需要定義記錄日誌的級別,級別越高表示打出來的日誌越詳細。我們可以用乙個字典來設定不同級別對應的不同日誌資訊:

複製****如下:

#用字典儲存日誌級別

format_dict =

將本文開始的**封裝在乙個類中

複製****如下:

#開發乙個日誌系統, 既要把日誌輸出到控制台, 還要寫入日誌檔案   

class logger():

def __init__(self, logname, loglevel, logger):

'''指定儲存日誌的檔案路徑,日誌級別,以及呼叫檔案

將日誌存入到指定的檔案中

'''# 建立乙個logger

self.logger = logging.getlogger(logger)

self.logger.setlevel(logging.debug)

# 建立乙個handler,用於寫入日誌檔案

fh = logging.filehandler(logname)

fh.setlevel(logging.debug)

# 再建立乙個handler,用於輸出到控制台

ch = logging.streamhandler()

ch.setlevel(logging.debug)

# 定義handler的輸出格式

#formatter = logging.formatter('%(asctime)s - %(name)s - %(levelname)s - %(message)s')

formatter = format_dict[int(loglevel)]

fh.setformatter(formatter)

ch.setformatter(formatter)

# 給logger新增handler

self.logger.addhandler(fh)

self.logger.addhandler(ch)

def getlog(self):

return self.logger

再通過以下方式呼叫,便是乙個簡單的日誌系統了

複製****如下:

logger = logger(logname='log.txt', loglevel=1, logger="fox").getlog()

Python 日誌記錄 log

usr bin python3.4 logger物件相當於是寫日誌的人 hand處理器相當於是寫日誌的規則 import logging import datetime def my log record my logger,my formatter fh logging.filehandler m...

Go標準庫學習筆記 日誌 log

log 模組用於在程式中輸出日誌,它的使用十分簡單,類似於fmt中的print,乙個最簡單的示例如下 package main import log func main 上面的程式會在命令列列印一條日誌 2018 05 16 16 48 06 hello worldlogger是寫入日誌的基本元件,...

python日誌模組

logging.debug 10 logging.info 20 logging.warning 30 logging.error 40 logging.critical 50預設級別為warning 預設輸出位置為控制台 import logging logging.basicconfig 可用引...