basicConfig方法
bashicConfig方法使用logging是比较简单方便的方法;
分两步:
- 申请logger;
logging.basicConfig(level = logging.DEBUG,format = '[%(asctime)s]%(name)s:%(levelname)s:%(message)s'
- 使用logger;
#message为需要输出的信息,该信息为格式化字符串的方式输出。
logging.debug(message)
3. 测试代码
def test_basicConfig():
'''
测试basicConfig方法对logging进行配置,该方法满足大多数场景的使用需求
'''
logging.basicConfig(level = logging.DEBUG,format = '[%(asctime)s]%(name)s:%(levelname)s:%(message)s'
)
for i in range(10):
logging.debug(i)
标准logging使用方法
- 创建logger实例,设置logger级别,创建logger输出格式
logger = logging.getLogger(name)
logger.setLevel(logging.DEBUG)
formatter = logging.Formatter('[%(asctime)s] %(name)s:' '%(levelname)s: %(message)s')
- 创建输出handler
创建输出到控制台的stremhandler;创建输出到文件的filehandler;
hdr = logging.StreamHandler()
fhr = logging.FileHandler('filelog.log')
- 给两个handler设置格式
设置streamhandler的输出格式;设置filehandler的输出格式
hdr.setFormatter(formatter)
fhr.setFormatter(formatter)
- 将两个handler增加到logger
logger.addHandler(hdr)
logger.addHandler(fhr)
- logger的使用
logger使用级别为info;logger使用级别为debug
logger.info(message) #massage为带输出的信息
logger.debug(message)
自定义的logging函数,可以直接调用
- 函数
def my_log(name):
'''
:param name: 申请logger的名字
:return:申请号的logger
函数用来申请logger,同时返回申请的logger;
申请logger:logger_name = test_logging.my_log('name')
调用logger:logger_name.debug('mylog test b: %d'%(b))
'''
logger = logging.getLogger(name)
logger.setLevel(logging.DEBUG)
formatter = logging.Formatter('[%(asctime)s] %(name)s: %(levelname)s: %(message)s')
#输出到控制台
hd = logging.StreamHandler()
hd.setFormatter(formatter)
#输出到文本
fh = logging.FileHandler('logfile.log')
fh.setFormatter(formatter)
#增加handler
logger.addHandler(fh)
logger.addHandler(hd)
return logger
- 函数的使用
import test_logging
#logger申请,注意如果放在循环中,会创建多个logger
logger_logb = test_logging.my_log('logb')
logger_logi = test_logging.my_log('logi')
for i in range(10):
a = 0
b = a + i
#logger的使用
logger_logb.debug('mylog test b: %d'%(b))
logger_logi.info('mylog test i: %d'%(i))
自定义logging类,使用代码更简单
class Logger():
def __init__(self, logname, loglevel, logger):
'''
指定保存日志的文件路径,日志级别,以及调用文件
将日志存入到指定的文件中
'''
# 创建一个logger
self.logger = logging.getLogger(logger)
self.logger.setLevel(logging.DEBUG)
# 创建一个handler,用于写入日志文件
fh = logging.FileHandler(logname)
fh.setLevel(logging.DEBUG)
# 再创建一个handler,用于输出到控制台
ch = logging.StreamHandler()
ch.setLevel(logging.DEBUG)
# 定义handler的输出格式
#formatter = logging.Formatter('%(asctime)s - %(name)s - %(levelname)s - %(message)s')
formatter = format_dict[int(loglevel)]
fh.setFormatter(formatter)
ch.setFormatter(formatter)
# 给logger添加handler
self.logger.addHandler(fh)
self.logger.addHandler(ch)
def getlog(self):
return self.logger
- 调用方式
logger = Logger(logname='log.txt', loglevel=1, logger="fox").getlog()
logging中的关键词
logging.basicConfig函数各参数:
filename: 指定日志文件名
filemode: 和file函数意义相同,指定日志文件的打开模式,’w’或’a’
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: 打印日志信息
datefmt: 指定时间格式,同time.strftime()
level: 设置日志级别,默认为logging.WARNING
stream: 指定将日志的输出流,可以指定输出到sys.stderr,sys.stdout或者文件,默认输出到sys.stderr,当stream和filename同时指定时,stream被忽略