首頁  >  文章  >  後端開發  >  python日誌模組 logging

python日誌模組 logging

高洛峰
高洛峰原創
2017-02-22 09:23:141156瀏覽

模組級函數

logging.getLogger([name]):傳回一個logger對象,如果沒有指定名字會傳回root logger

logging.debug()、logging.info( )、logging.warning()、logging.error()、logging.critical():設定root logger的日誌等級

logging.basicConfig():用預設Formatter為日誌系統建立一個StreamHandler,設定基礎配置並加到root logger中

Logger

logging.getLogger([name])

傳回一個logger實例,如果沒有指定name,傳回root logger。

每個程式在輸出資訊前都要取得一個Logger。 Logger通常對應了程式的模組名,例如聊天工具的圖形介面模組可以這樣得到它的Logger:

LOG=logging.getLogger(”chat.gui”)

而核心模組可以這樣:

LOG=logging.getLogger(”chat.kernel”)

 

Logger.setLevel(logging.WARNING):指定最低的日誌級別,低於WARNING的等級將被忽略

Logger.addFilter(filt)、Logger.removeFilter(filt):新增或刪除指定的filter

Logger.addHandler(hdlr)、Logger.removeHandler(hdlr ):增加或刪除指定的handler

 

 

#Handlers

handler物件負責傳送相關的資訊到指定目的地。可以是檔案、螢幕、網路、socket等

Handler.setLevel(lel):指定被處理的資訊級別,低於lel級別的資訊將忽略

##Handler.setFormatter() :給這個handler選擇一個輸出格式

Handler.addFilter(filt)、Handler.removeFilter(filt):新增或刪除一個filter物件

 

#日誌印到螢幕

import logging

logging.debug('This is debug message')
logging.info('This is info message')
logging.warning('This is warning message')

 

返回:
WARNING:root:This is warning message

打印到屏幕
預設情況下,logging將日誌印到螢幕,日誌等級為WARNING;

日誌等級大小關係為:CRITICAL > ERROR > WARNING > INFO > DEBUG > NOTSET,當然也可以自己定義日誌等級。

 

格式化日誌輸出

logging.basicConfig函數各參數:

filename: 指定日誌檔案名稱
filemode: 和file函數意義相同,指定日誌檔案的開啟模式,'w'或'a'
format: 指定輸出的格式和內容,format可以輸出很多有用信息,如上例所示:

import logging

logging.basicConfig(level=logging.DEBUG,
                format='%(asctime)s %(filename)s[line:%(lineno)d] %(levelname)s %(message)s',
                datefmt='%a, %d %b %Y %H:%M:%S',
                filename='myapp.log',
                filemode='w')
    
logging.debug('This is debug message')
logging.info('This is info message')
logging.warning('This is warning message')

 

./myapp.log文件中内容为:
Sun, 24 May 2009 21:48:54 demo2.py[line:11] DEBUG This is debug message
Sun, 24 May 2009 21:48:54 demo2.py[line:12] INFO This is info message
Sun, 24 May 2009 21:48:54 demo2.py[line:13] WARNING This is warning message

修改输出格式
日誌格式變數

%(levelno)s: 打印日志级别的数值
 %(levelname)s: 打印日志级别名称
 %(pathname)s: 打印当前执行程序的路径,其实就是sys.argv[0]
 %(filename)s: 打印当前执行程序名
 %(funcName)s: 打印日志的当前函数
 %(lineno)d: 打印日志的当前行号
 %(asctime)s: 打印日志的时间
 %(thread)d: 打印线程ID
 %(threadName)s: 打印线程名称
 %(process)d: 打印进程ID
 %(message)s: 打印日志信息
datefmt: 指定时间格式,同time.strftime()
level: 设置日志级别,默认为logging.WARNING
stream: 指定将日志的输出流,可以指定输出到sys.stderr,sys.stdout或者文件,默认输出到sys.stderr,当stream和filename同时指定时,stream被忽略

日志格式
logging方法

logging.StreamHandler: 日志输出到流,可以是sys.stderr、sys.stdout或者文件
logging.FileHandler: 日志输出到文件

日志回滚方式,实际使用时用RotatingFileHandler和TimedRotatingFileHandler
logging.handlers.BaseRotatingHandler
logging.handlers.RotatingFileHandler
logging.handlers.TimedRotatingFileHandler

logging.handlers.SocketHandler: 远程输出日志到TCP/IP sockets
logging.handlers.DatagramHandler:  远程输出日志到UDP sockets
logging.handlers.SMTPHandler:  远程输出日志到邮件地址
logging.handlers.SysLogHandler: 日志输出到syslog
logging.handlers.NTEventLogHandler: 远程输出日志到Windows NT/2000/XP的事件日志
logging.handlers.MemoryHandler: 日志输出到内存中的制定buffer
logging.handlers.HTTPHandler: 通过"GET"或"POST"远程输出到HTTP服务器

logging方法
由於StreamHandler和FileHandler是常用的日誌處理方式,所以直接包含在logging模組中,而其他方式則包含在logging.handlers模組中 

在程式中定義日誌模組

import logging
# create logger
def logger(log_type):
logger = logging.getLogger(log_type) # 创建Logger对象,类型是'TEST-LOG'
logger.setLevel(logging.WARNING) # 设置最低的日志级别,此级别覆盖ch and fh的级别
# 创建输出到控制台处理程序,并设置级别为DEBUG
ch = logging.StreamHandler()
ch.setLevel(logging.DEBUG) # 控制输出到屏幕的级别
# 创建输出到文件的处理程序,并设置级别
fh = logging.FileHandler("access.log")
fh.setLevel(logging.WARNING)
# 创建日志格式
formatter_Stream = logging.Formatter('%(name)s - %(levelname)s - %(message)s')
formatter_File = logging.Formatter('%(asctime)s - %(name)s - %(levelname)s - %(message)s')
# add formatter to ch and fh
ch.setFormatter(formatter_Stream)
fh.setFormatter(formatter_File)
# add ch and fh to logger
logger.addHandler(ch)
logger.addHandler(fh)
return logger
eee = logger('EEE')
rrr = logger('RRR')
rrr.debug('debug message')
rrr.info('info message')
rrr.warning('warn message')
eee.error('error message')
eee.critical('critical message')

代码
畫面顯示內容

RRR - INFO - info message

RRR - WARNING - warn message

#EEE - ERROR - error message

EEE - CRITICAL - critical message

檔案中內容

2017-02-21 21:35:05,700 - RRR - WARNING - warn message


2017-02-21 21:35:05,700 - EEE - ERROR - error message

2017-02-21 21:35:05,700 - EEE - CRITICAL - critical message






篩選器

呼叫logging.getLogger()時參數的格式類似「A.B.C」。採取這樣的格式就是為了配置過濾器。新增過濾器後日誌會經過過濾器處理後才輸出

python日志模块 logging

過濾器"AAA.BBB"只讓名字以"AAA.BBB"開頭的logger輸出訊息

## ##可以新增多個過濾器,只要有一個過濾器拒絕,日誌就不會輸出###
import logging
def logger(log_type):
logger = logging.getLogger(log_type) # 创建Logger对象,类型是'TEST-LOG'
logger.setLevel(logging.DEBUG) # 此级别覆盖ch and fh的级别
# 创建输出到控制台处理程序,并设置级别为DEBUG
ch = logging.StreamHandler()
ch.setLevel(logging.DEBUG) # 控制输出到屏幕的级别
 
# 设置过滤器
filter = logging.Filter('AAA.BBB.CCC')
ch.addFilter(filter)
formatter_Stream = logging.Formatter('%(name)s - %(levelname)s - %(message)s')
ch.setFormatter(formatter_Stream)
logger.addHandler(ch) # ch加入logger
return logger
eee = logger('AAA.BBB.CCC')
rrr = logger('AAA.BBB.DDD')
rrr.error('debug message')
rrr.error('info message')
eee.error('critical message')
eee.error('critical message')

代码
###切割日誌######以大小切割###
import logging
from logging import handlers
# create logger
def logger(log_type):
logger = logging.getLogger(log_type)
logger.setLevel(logging.DEBUG)
fh = logging.FileHandler("access.log")
fh.setLevel(logging.WARNING)
# 按时间切割日志文件
fh = handlers.TimedRotatingFileHandler(filename='access.log', when='s', interval=10 )
formatter_File = logging.Formatter('%(asctime)s - %(name)s - %(levelname)s - %(message)s')
fh.setFormatter(formatter_File)
logger.addHandler(fh)
return logger
rrr = logger('AAA.BBB.DDD')
rrr.error('debug message')
rrr.error('info message')
rrr.error('warn message')

代码
###interval:時間間隔#########when: 時間單位 S 秒 M 分 H 小時 D 天 W 每週(interval==0時代表星期一) midnight 每天凌晨###### ###### # ###########關於root logger以及logger的父子關係######前面多次提到root logger, 實際上logger實例之間還有父子關係, root logger就是處於最頂層的logger, 它是所有logger的祖先。如下圖:root logger是預設的logger如果不建立logger實例, 直接呼叫logging.debug()、logging.info()logging.warning()、logging.error()、logging.critical()這些函數,那麼使用的logger就是root logger, 它可以自動創建,也是單一實例的。 ##################### ###


如何得到root logger透過logging.getLogger()或logging.getLogger("")得到root logger實例。
預設的levelroot logger預設的level是logging.WARNING
如何表示父子關係logger的name的命名方式可以表示logger之間的父子關係. 例如:parent_logger = logging.getLogger('foo')child_logger = logging.getLogger('foo.bar')
什麼是effective levellogger有一個概念,叫做effective level。 如果一個logger沒有顯示地設定level,那麼它就用父親的level。如果父親也沒有顯示地設置level, 就用父親的父親的level,以此推....最後到達root logger,一定設置過level。預設為logging.WARNINGchild loggers得到訊息後,既把訊息分發給它的handler處理,也會傳遞給所有祖先logger處理

 

更多python日誌模組logging 相關文章請關注PHP中文網!

 

陳述:
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn