基本使用方法
調(diào)用函數(shù)
- Logger 記錄器摊唇,直接提供日志接口。
- Handler 處理器涯鲁,將(記錄器產(chǎn)生的)日志記錄發(fā)送至合適的目的地巷查。
- Formatter 格式化器,指明了最終輸出中日志記錄的布局抹腿。
- Filter 過(guò)濾器岛请,提供了更好的粒度控制,它可以決定輸出哪些日志記錄警绩。
Logger 記錄器
創(chuàng)建方法:
logger = logging.getLogger(logger_name)
創(chuàng)建Logger實(shí)例后崇败,可以使用以下方法進(jìn)行日志級(jí)別設(shè)置,增加處理器Handler肩祥。
logger.setLevel(logging.ERROR) # 設(shè)置日志級(jí)別為ERROR后室,即只有日志級(jí)別大于等于ERROR的日志才會(huì)輸出
logger.addHandler(handler_name) # 為L(zhǎng)ogger實(shí)例增加一個(gè)處理器
logger.removeHandler(handler_name) # 為L(zhǎng)ogger實(shí)例刪除一個(gè)處理器
Handler 處理器
Handler處理器類型有很多種,比較常用的有三個(gè)混狠,StreamHandler岸霹,FileHandler,NullHandler将饺,詳情可以訪問(wèn)Python logging.handlers
創(chuàng)建方法:
sh = logging.StreamHandler(stream=None) #創(chuàng)建StreamHandler贡避,輸出到控制臺(tái)
fh = logging.FileHandler(filename, mode='a', encoding=None, delay=False)#創(chuàng)建FileHandler,輸出到文件
Formatter 格式化器
Formatter指定的是每一條日志記錄的抬頭信息予弧,也就是你可以指定日志記錄的時(shí)間格式贸桶、進(jìn)程號(hào)、文件名桌肴、函數(shù)名等信息皇筛。可以用這個(gè)方法來(lái)創(chuàng)建一個(gè)Formatter對(duì)象:
logging.Formatter.__init__( fmt=None, datefmt=None)
fmt參數(shù)指定進(jìn)程號(hào)坠七、文件名水醋、函數(shù)名等信息是否出現(xiàn)以及格式旗笔, datefmt為日期時(shí)間格式,默認(rèn)的日期格式精確到微秒拄踪,例如‘2003-07-08 16:49:45,896’蝇恶。fmt中可以指定多個(gè)字段,每個(gè)字段的格式為“%(<dictionary key>)s”惶桐, 例如你想打印時(shí)間撮弧、日志級(jí)別、日志信息可以用下面的format:
'%(asctime)s - %(levelname)s - %(message)s'
在記錄爬蟲(chóng)系統(tǒng)日志的時(shí)候需要定義記錄日志的級(jí)別姚糊,級(jí)別越高表示打出來(lái)的日志越詳細(xì)贿衍。我們可以用一個(gè)字典來(lái)設(shè)置不同級(jí)別對(duì)應(yīng)的不同日志信息:
#用字典保存日志級(jí)別
format_dict = {
1 : logging.Formatter('%(asctime)s - %(name)s - %(levelname)s - %(message)s'),
2 : logging.Formatter('%(asctime)s - %(name)s - %(levelname)s - %(message)s'),
3 : logging.Formatter('%(asctime)s - %(name)s - %(levelname)s - %(message)s'),
4 : logging.Formatter('%(asctime)s - %(name)s - %(levelname)s - %(message)s'),
5 : logging.Formatter('%(asctime)s - %(name)s - %(levelname)s - %(message)s')
}
Filter 過(guò)濾器
Handlers和Loggers可以使用Filters來(lái)完成比級(jí)別更復(fù)雜的過(guò)濾。Filter基類只允許特定Logger層次以下的事件救恨。例如用‘A.B’初始化的Filter允許Logger ‘A.B’, ‘A.B.C’, ‘A.B.C.D’, ‘A.B.D’等記錄的事件贸辈,logger‘A.BB’, ‘B.A.B’ 等就不行。 如果用空字符串來(lái)初始化肠槽,所有的事件都接受擎淤。
filter = logging.Filter(name='')
將本文開(kāi)始的代碼封裝在一個(gè)類中
#開(kāi)發(fā)一個(gè)日志系統(tǒng), 既要把日志輸出到控制臺(tái)秸仙, 還要寫(xiě)入日志文件
class Logger():
def __init__(self, logname, loglevel, logger):
'''
指定保存日志的文件路徑嘴拢,日志級(jí)別,以及調(diào)用文件
將日志存入到指定的文件中
'''
# 創(chuàng)建一個(gè)logger
self.logger = logging.getLogger(logger)
self.logger.setLevel(logging.DEBUG)
# 創(chuàng)建一個(gè)handler寂纪,用于寫(xiě)入日志文件
fh = logging.FileHandler(logname)
fh.setLevel(logging.DEBUG)
# 再創(chuàng)建一個(gè)handler炊汤,用于輸出到控制臺(tái)
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
再通過(guò)以下方式調(diào)用,便是一個(gè)簡(jiǎn)單的日志系統(tǒng)了
logger = Logger(logname='log.txt', loglevel=1, logger="fox").getlog()