import logging from conf import settingsdef logger(log_type):# 生成 logger 对象logger = logging.getLogger(log_type)logger.setLevel(settings.LOG_LEVEL)# 生成handler对象,向文件输出日志信息log_file = "%s/log/%s.log" % (settings.BASE_DIR, log_type)global fhfh = logging.FileHandler(log_file)fh.setLevel(settings.LOG_LEVEL)# 生成formatter对象formatter = logging.Formatter('%(asctime)s - %(name)s - %(levelname)s - %(message)s')# formatter对象绑定到handler对象 fh.setFormatter(formatter)if logger.handlers: # 清空logger.handlers,否则会重复打印日志 logger.handlers.pop()# handler对象绑定到logger logger.addHandler(fh)return logger
%(name)s Logger的名字 %(levelno)s 数字形式的日志级别 %(levelname)s 文本形式的日志级别 %(pathname)s 调用日志输出函数的模块的完整路径名,可能没有 %(filename)s 调用日志输出函数的模块的文件名 %(module)s 调用日志输出函数的模块名 %(funcName)s 调用日志输出函数的函数名 %(lineno)d 调用日志输出函数的语句所在的代码行 %(created)f 当前时间,用UNIX标准的表示时间的浮 点数表示 %(relativeCreated)d 输出日志信息时的,自Logger创建以 来的毫秒数 %(asctime)s 字符串形式的当前时间。默认格式是 “2003-07-08 16:49:45,896”。逗号后面的是毫秒 %(thread)d 线程ID。可能没有 %(threadName)s 线程名。可能没有 %(process)d 进程ID。可能没有 %(message)s 用户输出的消息
生成logger对象
1 def logger(): 2 logger = logging.getLogger() 3 4 #设置logger 5 fh = logging.FileHandler('text_log')#向文件发送信息 6 ch = logging.StreamHandler()#向屏幕发送信息 7 8 #定义格式 9 fm = logging.Formatter('%(asctime)s %(filename)s') 10 fh.setFormatter(fm) #设置fh的格式 11 ch.setFormatter(fm) #设置ch的格式 12 13 logger.addHandler(fh) #传给logger 14 logger.addHandler(ch) #传给logger 15 logger.setLevel('DEBUG') 16 17 return logger
调用logger
logging的日志可以分为 debug(), info(), warning(), error() and critical()
5个级别
1 logger = logger() 2 3 logging.debug('debug message') 4 logging.info('info message') 5 logging.warning('warning message') 6 logging.error('error message') 7 logging.critical('critical message')
注意:
如果指定名称,则mylogger为root的子树,如果定义两个子树名字相同,则实际生成一个子树(根默认名称为root)
1 logger1 = logging.getLogger('mylogger') 2 3 logger2 = logging.getLogger('mylogger')