python语言中logger模块的学习笔记
logging模块的介绍
Python的logging模块提供了通用的日志系统,使用logging模块可以方便开发者记录日志,还可以自定义日志的级别,并可以采用不同的方式记录日志,比如文件,HTTP、GET/POST,SMTP,Socket等,甚至可以自己实现具体的日志记录方式。
logging模块的结构
logging模块包括:logger,handler,fltter,formatter这四个基本概念。
-
logger:提供日志的接口供代码应用,logger模块最常用的操作主要有两类:配置和发送日志消息,可以通过logging.getLogger(name)获取logger对象,如果不指定name则返回root对象,多次使用相同的name调用getLogger方法返回同一个logger对象。
logger对象扮演三重角色;
它给应用程序暴漏了几个方法,以便应用程序能在运行时记录日志。
Logger对象根据日志的级别或根据Filter对象,来决定记录哪些日志。
Logger对象负责把日志信息传递给相关的handler。
在logger中,最常用的方法有两种:configuration,messing sending
cinfiguration方法包括;setLevel(level),用来设置日志的级别。如果用例的界别低于setLevel(level)方法这是的值,那么logger就不会处理它 -
handler:将日志记录(log record)发送到合适的目的地(destination),比如文件,socket等。一个logger对象可以通过addHandler方法添加0到多个handler,每个handler又可以定义不同日志级别,以实现日志分级过滤显示。
logging.StreamHandler:日志输出到流
logging.FileHander;日志输出到文件
logging.handlers.RotatingFileHandler:日志回滚方式
logging.handlers.TimedRotatingFileHandler:日志回滚方式
ogging.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服务器 -
filter:提供一种优雅的方式,决定一个日志记录是否发送到handler。
Filter对象用于对LogRecord对象执行过滤,logger和handler都可以使用filter来过滤record。下面用一个列子来说明Filter基类的作用:
如果使用A.B实例化一个filter,那么它允许名称为A.B,A.B.C,A.B.C.D这样的logger记录的日志通过,不允许名称为A.BB,B.A.B这样的logger记录的日志通过。
如果使用空字符串实例化一个filter,那么它允许所有的事件通过。
Filter基类有一个方法叫filter(record),它用来决定指定的record(LogRecord对象)是否被记录。如果该方法返回0,则不记录record;返回非0则记录record。 -
formatter:制定日志输出的具体格式,formatter的构造方法需要两两个参数,消息格字符串和日期字符串。
Formatter对象用于把一个LogRecord对象转换成文本,它定义了日志的格式、结构。与logging.Handler类不同,应用程序可以直接实例化Formatter类,如果需要也可以子类化Formatter,以便定制一些行为。
Formatter的构造函数接受两个参数:第一个参数是用于日志信息的格式化字符串;第二个参数是用于日期的格式化字符串。第二个参数可选的,默认值是%Y-%m-%d %H:%M:%S。
日志信息的格式化字符串用%()s风格的字符串做替换。
下面是替换字符串和它们所代表的含义:
%(name)s
logger的名称
%(levelno)s
日志级别的数字表现形式
%(levelname)s
日志级别的文本表现形式
%(pathname)s
调用logging的源文件的全路径名
%(filename)s
pathname的文件名部分
%(module)s
模块名(filename的名称部分)
%(lineno)d
调用logging的行号
%(funcName)s
函数名
%(created)f
LogRecord的创建时间(time.time()的返回值)
%(asctime)s
LogRecord的创建时间的文本表现形式
%(msecs)d
创建时间的毫秒部分
%(relativeCreated)d
LogRecord的创建时间,单位是毫秒。这个时间是相对logging模块被加载的时间的(通常就是应用程序启动的时间)。
%(thread)d
线程ID
%(threadName)s
线程名称
%(process)d
进程ID
%(message)s
record.getMessage()的返回结果。