The logging library takes a modular approach and offers several categories of components: loggers, handlers, filters, and formatters.
? Loggers expose the interface that application code directly uses.
? Handlers send the log records (created by loggers) to the appropriate destination.
? Filters provide a finer grained facility for determining which log records to output.
? Formatters specify the layout of log records in the final output.
logger:提供日志接口,供应用代码使用。logger最长用的操作有两类:配置和发送日志消息。可以通过logging.getLogger(name)获取logger对象,如果不指定name则返回root对象,多次使用相同的name调用getLogger方法返回同一个logger对象。
handler:将日志记录(log record)发送到合适的目的地(destination),比如文件,socket等。一个logger对象可以通过addHandler方法添加0到多个handler,每个handler又可以定义不同日志级别,以实现日志分级过滤显示。
filter:提供了过滤日志信息的方法,。
formatter:指定日志记录输出的具体格式。formatter的构造方法需要两个参数:消息的格式字符串和日期字符串,这两个参数都是可选的。
说说最常用logging的函数或者类:
①logging.getLogger([name])
返回一个logger实例,如果没有name,返回root logger
如果name相同那么是同一个logger的实例
②Logger.setLevel(level)
日志级别大小关系为: critical > error > warning > info > debug > notset 也可自定义日志级别
logger.debug("xxx")
logger.info("xxx")
logger.warning("xxx")
logger.error("xxx")
logger.critical("xxx")
③Logger.addHandler(hdlr)
logger可以雇佣handler来帮它处理日志, handler主要有以下几种:
StreamHandler: 输出到控制台
FileHandler: 输出到文件
handler还可以设置自己的level以及输出格式。
④logging.basicConfig([**kwargs])
* 这个函数用来配置root logger, 为root logger创建一个StreamHandler,
设置默认的格式。
* 这些函数: logging.debug()、logging.info()、logging.warning()、
logging.error()、logging.critical() 如果调用的时候发现root logger没有任何
handler, 会自动调用basicConfig添加一个handler
* 如果root logger已有handler, 这个函数不做任何事情
logging.basicConfig # 通过logging.basicConfig函数对日志的输出格式及方式做相关配置
# basicConfig 相关参数帮助
filename # 指定日志文件名
filemode # 和file函数意义相同,指定日志文件的打开模式,‘w‘或‘a‘
datefmt # 指定时间格式,同time.strftime()
level # 设置日志级别,默认为logging.WARNING
stream # 指定将日志的输出流,可以指定输出到sys.stderr,sys.stdout或者文件,默认输出到sys.stderr,当stream和filename同时指定时,stream被忽略
format # 指定输出的格式和内容,format可以输出很多有用信息,如上例所示:
%(levelno)s # 打印日志级别的数值
%(levelname)s # 打印日志级别名称
%(pathname)s # 打印当前执行程序的路径,其实就是sys.argv[0]
%(filename)s # 打印当前执行程序名
%(funcName)s # 打印日志的当前函数
%(lineno)d # 打印日志的当前行号
%(asctime)s # 打印日志的时间
%(thread)d # 打印线程ID
%(threadName)s # 打印线程名称
%(process)d # 打印进程ID
%(message)s # 打印日志信息
例子:
logging.basicConfig(level=logging.DEBUG,
format=‘%(asctime)s %(filename)s[line:%(lineno)d] %(levelname)s %(message)s‘,
datefmt=‘%a, %d %b %Y %H:%M:%S‘,
filename=‘myapp.log‘,
filemode=‘w‘)
实践例子:
一.直接在程序中定义Logger、Handler、Fiter、Formatter:
[[email protected] logging]# vim test2.py
#!/usr/bin/python
#coding=utf-8
import logging
#创建一个logger
logger1 = logging.getLogger(‘yaobin‘)
logger1.setLevel(logging.DEBUG) #全局的日志水平,最高,奇葩东西,应该单独最高的,不然我单独设置日志水平没意义了。
#创建一个handler,用于写入日志文件创建一个handler,用于写入日志文件
fh = logging.FileHandler(‘/tmp/test.log‘)
fh.setLevel(logging.DEBUG) #单独设置日志水平
#再创建一个handler,用于输出到控制台,即是屏幕
ch = logging.StreamHandler()
ch.setLevel(logging.WARNING) #单独设置日志水平
#最后我发现单独设置的日志水平比全局的高,生效单独的日志水平
#单独设置的日志水平比全局的低,生效全局的日志水平
# 定义handler的输出格式formatter
formatter = logging.Formatter(‘%(asctime)s - %(name)s - %(levelname)s - %(message)s‘)
fh.setFormatter(formatter)
ch.setFormatter(formatter)
#给logger添加handler
logger1.addHandler(fh)
logger1.addHandler(ch)
#记录日志
logger1.debug(‘logger1 debug message‘)
logger1.info(‘logger1 info message‘)
logger1.warning(‘logger1 warning message‘)
logger1.error(‘logger1 error message‘)
logger1.critical(‘logger1 critical message‘)
#执行脚本
[[email protected] logging]# python test2.py #马上就有屏幕的输出
2015-12-15 17:38:52,024 - yaobin - DEBUG - logger1 debug message
2015-12-15 17:38:52,024 - yaobin - INFO - logger1 info message
2015-12-15 17:38:52,025 - yaobin - WARNING - logger1 warning message
2015-12-15 17:38:52,025 - yaobin - ERROR - logger1 error message
2015-12-15 17:38:52,025 - yaobin - CRITICAL - logger1 critical message
#查看文件的记录
[[email protected]_monitor logging]# cat /tmp/test.log
2016-02-25 19:37:20,718 - yaobin - DEBUG - logger1 debug message
2016-02-25 19:37:20,719 - yaobin - INFO - logger1 info message
2016-02-25 19:37:20,719 - yaobin - WARNING - logger1 warning message
2016-02-25 19:37:20,719 - yaobin - ERROR - logger1 error message
2016-02-25 19:37:20,720 - yaobin - CRITICAL - logger1 critical message