step1:logging、Logger初始化。logging定义日志等级
step2:设置日志格式 logging.formatter()。常用的有:
%(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 |
用户输出的消息 |
step3:handlers初始化及使用【handler决定日志输出位置】,本例中使用的是按天写入:
logging.StreamHandler->控制台输出
logging.FileHandler -> 文件输出
logging.handlers.RotatingHandler ->按大小自动分割日志文件,一旦达到指定大小,重新生成文件
logging.handlers.TimeRotatingFileHandler -> 按时间自动分割日志文件
step4:handlers中加入日志等级、日志格式 。
step5:Logger中加入handler
step6:以test_log.py作为log配置的单独模块,需要在项目启动一开始就实例化日志类。实例化后就可以直接使用。
def cfg_logging(self, log_level=logging.INFO):
current = self.path
# logging初始化工作,将信息打印到控制台。以level判定打印的信息等级。debug<info<warning<error<critical。默认为warning
logging.basicConfig(level=log_level)
# logger初始化工作
logger = logging.getLogger()
if len(logger.handlers) > 1:
return
#设置格式
formatter = logging.Formatter('[%(asctime)s][%(levelname)s][%(threadName)s] %(message)s')
error_info_handler = logger.handlers[0]
error_info_handler.setFormatter(formatter)
error_info_handler.setLevel(log_level)
#滚动文件输出,按大小自动分割日志文件
# file_handler = RotatingFileHandler(filename='{0}/TestLog_{1}.log'.format(current,
# datetime.datetime.now().strftime('%Y-%m-%d')), maxBytes=10*1024*1024, backupCount=5)
file_handler = TimedRotatingFileHandler(filename='{0}/TestLog_{1}.log'.format(current,
datetime.datetime.now().strftime('%Y-%m-%d')),when='D',backupCount=7,encoding='utf-8')
#记录器Logger的级别决定了消息是否要传递给处理器handler。每个处理器的级别决定消息是否要分发
file_handler.setLevel(log_level)
file_handler.setFormatter(formatter)
#设置log后缀名称
logger.addHandler(file_handler)