logging知識點小結

1. logging模塊的基本構成python

logging(/usr/lib/python2.7/logging/)含有三個文件, app

引用方法分別爲python2.7

1  import logging   #  __init__.py
2  import logging.config
3   import  logging.handlers 

 2. logging模塊使用的基本概念socket

a. Logger函數

主要功能:url

1)  輸出log信息(debug, info, warning/warn, error, exception, critical/fatal, log等方法)spa

2)  根據log信息的嚴重程度經過Handler決定如何輸出debug

Logger的初始化接收兩個參數,name和level(默認爲NOTSET=0), 其他的參數初始值爲(parent, propagate, handlers, disabled)=(None, 1, [], 0), level的初始值經過函數_checklevel(level)來進行初始化。日誌

Manager類主要用於管理Logger的繼承關係, 其中的getLogger函數則用於返回返回"a.b.c"這類具備繼承關係的Logger對象,對其父子關係進行修正。因此在這裏可能出現父類'a'不存在,而子類‘a.b'存在的情形。code

 getLogger(name)函數這是對Manager.getLogger(name)的一次封裝, 若無name,則返回RootLogger(WARNING), 也便是logging.root  

b. level 

 level用來表明消息的嚴重程度,這些字段都有字符串表示和整型表示, 對應關係以下:

CRITICAL = 50
FATAL = CRITICAL
ERROR = 40
WARNING = 30
WARN = WARNING
INFO = 20
DEBUG = 10
NOTSET = 0

c. Handler

Handler用於將信息分配到不一樣的目的地, logging模塊中的Handler能夠在__init__.py和handlers.py中找到:

__init__.py

class Handler(Filterer)

class StreamHandler(Handler)

class FileHandler(StreamHandler) 

handlers.py 

class BaseRotatingHandler(logging.FileHandler)

class RotatingFileHandler(BaseRotatingHandler)

class TimedRotatingFileHandler(BaseRotatingHandler)

class WatchedFileHandler(logging.FileHandler)

class SocketHandler(logging.Handler)

class DatagramHandler(SocketHandler)

class SysLogHandler(logging.Handler)

class SMTPHandler(logging.Handler)

class NTEventLogHandler(logging.Handler)

class HTTPHandler(logging.Handler)

class BufferingHandler(logging.Handler)

class MemoryHandler(logging.Handler) 

 

Handlers 參數 備註
Handler level=NOSET _name=None, level=_checkLevel(level), formatter=None
StreamHandler stream=None stream=sys.stderr, level=NOSET, _name=None, level=_checkLevel(level), formatter=None
FileHandler filename, mode='a', encoding=None, delay=0 baseFilename=os.path.abspath(filename), 若delay爲True則stream=None, 不然stream=self._open()
BaseRotatingHandler filename, mode, encoding=None, delay=0 mode沒有默認值的FileHandler初始化
RotatingFileHandler filename, mode='a', maxBytes=0, backupCount=0, encoding=None, delay=0 若果maxBytes>0則mode被覆蓋爲'a'
TimedRotatingFileHandler filename, when='h', interval=1, backupCount=0, encoding=None, delay=0 when=when.upper()爲時間的單位, interval爲時間的數字
WatchedFileHandler filename, mode='a', encoding=None, delay=0 dev=-1, ino=-1, 用於監控文件是否改變
SocketHandler host, port sock=None, closeOnError=0, retryTime=None, retryStart=0.1, retryMax=30.0, retryFactor=2.0, log信息以pickle形式寫入一個stream socket
DatagramHandler host, port closeOnError=0, log信息以pickle形式寫入一個diagram socket
SysLogHandler address=('localhost', SYSLOG_UDP_PORT), facility=LOG_USER, socktype=None 若是address爲一個string,則使用Unix socket, 若要把log信息發送給本地syslogd, 則能夠使用(SysLogHandler(address="/dev/log")
SMTPHandler mailhost, fromaddr, toaddrs, subject, credentials=None, secure=None,
_timeout=5.0
用於發送email傳遞log信息, 若要使用非標準SMTP斷開,則mailhost使用(host, port)形式。 credentials使用(username, password)參數
NTEventLogHandler appname, dllname=None, logtype='Application' 發送log信息到NT Event Log, 若無dllname參數,則使用win32service.pyd
HTTPHandler host, url, method='GET' method僅有'POST', 'GET'兩個選項
BufferingHandler capacity buffer=[], 使用flush函數決定內存是否被flush
MemoryHandler capacity, flushLevel=logging.ERROR, target=None 將log信息存入內存,週期性的flush到目標handler中

d. Fomatter

  初始化方法: Fomatter(fmt=None, datefmt=None)

可選fmt和datefmt參數:

fmt: %(name)s, %(levelno)s, %(levelname)s, %(pathname)s, %(filename)s, %(module)s, %(lineno)d, %(funcName)s, %(created)f, %(asctime)s, %(msecs)d, %(relativeCreated)d, %(thread)d, %(threadName)s, %(process)d, %(message)s

datefmt:  '%a, %d %b %Y %H:%M:%S', '%y%m%d %H:%M:%S'  

e. Filterer

logging模塊中的filter經過logger的名稱來定義'a.b.c'等等 

3. 函數定製logging的基本步驟 

a. 定義logger, 經過函數logging.getLogger(name), 若name=None或者‘’,得到的是root,經過相同的name得到的logger是同一個對象實例

b. 定義handler, 經過前文介紹的Handler子類來定義

c. 爲handler定義formatter, 經過logging.Formatter(fmt, datefmt)來定義,經過handler.setFormatter(formatter)來添加

d. 爲handler添加level, 經過handler.setLevel(logging.INFO)

e. 爲logger 添加handler, 經過logger.addHandler(handler) 

4. 配置文件定製日誌文件,基本步驟同上,形式上略有變化 

  a. 配置文件(log.conf爲例)

 1   # #################################################################  
 2  [loggers] 
 3 keys=root, example01, example02 
 4 [logger_root] 
 5 level=DEBUG 
 6 handlers=hand01, hand02 
 7 [logger_example01] 
 8 handlers=hand01, hand02 
 9 qualname=example01 
10 propagate=0 
11 [logger_example02] 
12 handlers=hand01, hand03 
13 qualname=example02 
14 propagate=0 
15  # ################################################################ 
16  [handlers] 
17 keys=hand01, hand02, hand03 
18 [handler_hand01] 
19  class=StreamHandler 
20 level=INFO 
21 formatter=form02 
22 args=[sys.stderr] 
23 [handler_hand02] 
24  class=FileHandler 
25 level=DEBUG 
26 formatter=form01 
27 args=[ ' test.log '' a '
28 [handler_hand03] 
29  class=handlers.RotatingFileHandler 
30 level=INFO 
31 formatter=form02 
32 args=[ ' log.txt '' a ', 10*1024*1024, 5] 
33  # ######################################################## [formatters]
34  keys=form01, form02 
35 [formatter_form01] 
36 format=%(asctime)s %(filename)s %(funcName)s [line: %(lineno)d] %(levelname)s  ' \n\r '  %(message)s 
37 datefmt=%a, %d %b %Y %H:%M:%S 
38 [formatter_form02] 
39 format=%(name)-12s %(levelname)-8s %(message)s 
40 datefmt=

  b. 調用配置文件

1  import logging.config
2  import logging
3 
4 
5 logging.config.fileConfig( ' log.conf ')
6  logger = logging.getLogger( ' example02 ' ) 

4. basicConfig

 1  #  basicConfig在root logger有handler的時候失效
 2 # basicConfig默認建立一個StreamHandler, 輸出定向爲sys.stderr, fomatter爲BASIC_FORMAT, 而後將這個handler加到root logger
 3 # BASIC_FORMAT = "%(levelname)s:%(name)s:%(message)s"
 4 # 經常使用參數:
 5 # filename: 建立一個FileHandler, 指定文件名,而不是StreamHandler
 6 # filemode: 指定文件寫模式
 7 # format: 爲handler指定輸出格式
 8 # datefmt: 指定日期時間格式
 9 # level: 指定root logger的logging級別
10 # stream: 指定輸出流來初始化StreamHandler, 與filename不可同時使用
11 # ### StreamHandler不會自動關閉輸出流,而FileHandler會自動關閉文件
12 logging.basicConfig(
13         level=logging.INFO,
14         format='%(asctime)s %(name)-12s %(levelname)-8s %(message)s',
15         datefmt='%m-%d %H:%M',
16         filename='a.log',
17         filemode='a')
 
相關文章
相關標籤/搜索