1. logging模塊的基本構成python
logging(/usr/lib/python2.7/logging/)含有三個文件, app
引用方法分別爲python2.7
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爲例)
b. 調用配置文件
4. basicConfig