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')
 
相关文章
相关标签/搜索