import logging
# 创建一个logger
logger = logging.getLogger('mylogger')
logger.setLevel(logging.DEBUG)
# 创建一个handler,用于写入日志文件
fh = logging.FileHandler('test.log')
fh.setLevel(logging.DEBUG)
# 再创建一个handler,用于输出到控制台
ch = logging.StreamHandler()
ch.setLevel(logging.DEBUG)
# 定义handler的输出格式
formatter = logging.Formatter('%(asctime)s - %(name)s - %(levelname)s - %(message)s')
fh.setFormatter(formatter)
ch.setFormatter(formatter)
# 给logger添加handler
logger.addHandler(fh)
logger.addHandler(ch)
# 记录一条日志
logger.info('foorbar')
2019-06-23 23:06:11,507 - mylogger - INFO - foorbar
Logger是一个树形层级结构,在使用接口debug,info,warn,error,critical之前必须创建Logger实例,即创建一个记录器,如果没有显式的进行创建,则默认创建一个root logger,并应用默认的日志级别(warning),处理器Handler(默认为StreamHandler,即将日志信息打印输出在标准输出上),格式化器Formatter(默认的格式即为第一个简单使用程序中输出的格式)。
# 创建logging实例
logger = logging.getLogger(logger_name)
# 设置日志级别为ERROR,即只有日志级别大于等于ERROR的日志才会输出
logger.setLevel(logging.ERROR)
# 为Logger实例增加一个处理器
logger.addHandler(handler_name)
# 为Logger实例删除一个处理器
logger.removeHandler(handler_name)
Handler处理器类型有很多种,比较常用的有三个,StreamHandler,FileHandler,NullHandler
sh = logging.StreamHandler(stream=None)
fh = logging.FileHandler(filename, mode='a', encoding=None, delay=False)
创建处理器后,处理器对象的方法
# 指定日志级别,低于WARN级别的日志将被忽略
ch.setLevel(logging.WARN)
# 设置一个格式化器formatter
ch.setFormatter(formatter_name)
# 增加一个过滤器,可以增加多个
ch.addFilter(filter_name)
# 删除一个过滤器
ch.removeFilter(filter_name)
使用Formatter对象设置日志信息的输出规则、结构和内容,默认的时间格式为%Y-%m-%d %H:%M:%S。
formatter = logging.Formatter(fmt=None, datefmt=None)
# fmt是消息的格式化字符串,datefmt是日期字符串。如果不指明fmt,将使用'%(message)s'。如果不指明datefmt,将使用ISO8601日期格式。
#定义Formatter
formatter = logging.Formatter('%(asctime)s - %(name)s - %(levelname)s - %(message)s')
#为Handler添加Formatter
fh.setFormatter(formatter)
ch.setFormatter(formatter
限制只有满足过滤规则的日志才会输出。
比如我们定义了filter = logging.Filter(‘a.b.c’),并将这个Filter添加到了一个Handler上,则使用该Handler的Logger中只有名字带a.b.c前缀的Logger才能输出其日志。
filter = logging.Filter(name='')
logging模块保证在同一个python解释器内,多次调用logging.getLogger(‘log_name’)都会返回同一个logger实例,即使是在多个模块的情况下。所以典型的多模块场景下使用logging的方式是在main模块中配置logging,这个配置会作用于多个的子模块,然后在其他模块中直接通过getLogger获取Logger对象即可。
main
import logging
import logging.config
logging.config.fileConfig('logging.conf')
root_logger = logging.getLogger('root')
root_logger.debug('test root logger...')
logger = logging.getLogger('main')
logger.info('test main logger')
logger.info('start import module \'mod\'...')
import mod
logger.debug('let\'s test mod.testLogger()')
mod.testLogger()
root_logger.info('finish test...')
子模块mod.py
import logging
import submod
logger = logging.getLogger('main.mod')
logger.info('logger of mod say something...')
def testLogger():
logger.debug('this is mod.testLogger...')
submod.tst()
子模块submod.py
import logging
logger = logging.getLogger('main.mod.submod')
logger.info('logger of submod say something...')
def tst():
logger.info('this is submod.tst()...')