目录
目录
一、学习链接
http://www.cnblogs.com/dkblog/archive/2011/08/26/2155018.html
http://www.jb51.net/article/63502.htm
二、logging模块四大基本概念
2.1 logger
创建一个对象,调用logging模块的方法来答应日志
2.2 handler
控制日志打印的位置
2.3 filter
2.4 formatter
控制日志打印格式
三、 基本使用
3.1 引入日志模块
import logging
3.2 简单打印日志
默认情况下只打印warning及以上级别的日志
import logging
logging.debug('This is debug message')
logging.error('This is error message')
logging.info('This is info message')
logging.warning('This is warning message')
logging.critical('This is critical message')
四、实际场景应用推导
4.1 打印日志到文件:basicConfig()方法
import logging
# 日志打印到test.log文件中,日志打印级别为DEBUG(默认日志打印方式是a)
logging.basicConfig(filename='test.log', level=logging.DEBUG)
logging.debug('This is debug message')
logging.error('This is error message')
logging.info('This is info message')
logging.warning('This is warning message')
logging.critical('This is critical message')
4.1.1 basicConfig参数详解
filename: 指定日志文件名
filemode: 和file函数意义相同,指定日志文件的打开模式,'w'或'a'
format: 指定输出的格式和内容,format可以输出很多有用信息(和formatter组件的参数一致)
datefmt: 指定时间格式,同time.strftime()
level: 设置日志级别,默认为logging.WARNING
stream: 指定将日志的输出流,可以指定输出到sys.stderr,sys.stdout或者文件,默认输出到sys.stderr,当stream和filename同时指定时,stream被忽略
4.2 结合logger、handler以及formatter打印日志
import logging
# 日志文件位置
log_type = 'test_info.log'
log_level = logging.DEBUG
logger = logging.getLogger()
logger.setLevel(log_level)
# 日志打印到文件中
# 设置日志文件路径
log_file = "%s/logs/%s" %(settings.BASE_DIR, log_type)
fh = logging.FileHandler(log_file)
fh.setLevel(log_level)
# 设置日志文件格式
formatter = logging.Formatter('%(asctime)s - %(name)s - %(levelname)s - lineno:%(lineno)d - %(message)s')
# 将日志文件格式设置到fh中
fh.setFormatter(formatter)
# 将句柄添加至logger
logger.addHandler(fh)
logger.debug('This is debug message')
logger.error('This is error message')
logger.info('This is info message')
logger.warning('This is warning message')
logger.critical('This is critical message')
4.3 日志打印模块封装
4.3.1 日志封装代码展示
import logging
from config import settings
def Logger(log_type):
'''
打印日志类
:param log_type:
:return:
'''
#create logger
logger = logging.getLogger(log_type)
logger.setLevel(settings.LOG_LEVEL)
# 日志打印到控制台
# create console handler and set level to debug
# ch = logging.StreamHandler()
# ch.setLevel(log_level)
# create file handler and set level to warning
log_file = "%s/logs/%s" %(settings.BASE_DIR, settings.LOG_TYPES[log_type])
fh = logging.FileHandler(log_file, encoding='utf-8', mode='a') # 指定打印日志格式为utf-8解决乱码问题,默认情况mode也是a
fh.setLevel(settings.LOG_LEVEL)
# create formatter
formatter = logging.Formatter(
fmt = '%(asctime)s - %(name)s -%(threadName)s:%(process)d - %(filename)s:%(lineno)d - %(message)s',
datefmt = '%Y-%m-%d %A %H:%M:%S', # 格式化日期输出
)
# add formatter to ch and fh
# ch.setFormatter(formatter)
fh.setFormatter(formatter)
# add ch and fh to logger
# logger.addHandler(ch)
logger.addHandler(fh)
return logger
4.3.2 调用日志模块示例
logger = Logger("INFO")
logger.debug("测试数据")
logger.info("测试数据")
logger.error("测试数据")
logger.critical("测试数据")
logger.warning("测试数据")
五、补充
5.1 formatter格式化日志展示字段列表
%(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: 打印日志信息