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