• 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:[root@monitor logging]# vim test2.py#!/usr/bin/python#coding=utf-8import logging#创建一个loggerlogger1 = 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的输出格式formatterformatter = logging.Formatter('%(asctime)s - %(name)s - %(levelname)s - %(message)s')fh.setFormatter(formatter)ch.setFormatter(formatter)#给logger添加handlerlogger1.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')#执行脚本[root@monitor logging]# python test2.py #马上就有屏幕的输出2015-12-15 17:38:52,024 - yaobin - DEBUG - logger1 debug message2015-12-15 17:38:52,024 - yaobin - INFO - logger1 info message2015-12-15 17:38:52,025 - yaobin - WARNING - logger1 warning message2015-12-15 17:38:52,025 - yaobin - ERROR - logger1 error message2015-12-15 17:38:52,025 - yaobin - CRITICAL - logger1 critical message#查看文件的记录[root@zabbix_monitor logging]# cat /tmp/test.log2016-02-25 19:37:20,718 - yaobin - DEBUG - logger1 debug message2016-02-25 19:37:20,719 - yaobin - INFO - logger1 info message2016-02-25 19:37:20,719 - yaobin - WARNING - logger1 warning message2016-02-25 19:37:20,719 - yaobin - ERROR - logger1 error message2016-02-25 19:37:20,720 - yaobin - CRITICAL - logger1 critical message