有一种简便方法实现按日志时间与按日志大小对日志进行切分,即通过python配置文件实现。 该配置文件分为三个部分。 第一部分定义日志模块及其实现。如下面代码所示,下面代码定义了三个日志配置名root,example及example01。 ############################################### [loggers] keys=root,example,example01 #-------------------------------------------------- # 实现上面定义的logger模块,必需是[logger_xxxx]这样的形式 #-------------------------------------------------- # [logger_xxxx] logger_模块名称 # level 级别,级别有DEBUG、INFO、WARNING、ERROR、CRITICAL # handlers 处理类,可以有多个,用逗号分开,实现见第二部分 # qualname logger名称,应用程序通过 logging.getLogger获取。对于不能获取的名称,则记录到root模块。 # propagate 是否继承父类的log信息,0:否 1:是 [logger_root] level=DEBUG handlers=consoleHandler,rotateFileHandler [logger_example] level=DEBUG handlers=consoleHandler,rotateFileHandler qualname=example propagate=0 [logger_example01] level=DEBUG handlers=consoleHandler,timedrotateFileHandler qualname=example01 propagate=0 ############################################### 第二部分定义每个模块的Handler。其中rotateFileHandler用来根据日志文件大小进行切分,而timedrotateFileHandler则根据时间进行日志切分。 ############################################### #-------------------------------------------------- # handler #-------------------------------------------------- # [handler_xxxx] # class handler类名 # level 日志级别 # formatter 日志格式,见第三部分 # args handler初始化函数参数 [handlers] keys=consoleHandler,rotateFileHandler,timedrotateFileHandler [handler_consoleHandler] class=StreamHandler level=DEBUG formatter=simpleFormatter args=(sys.stdout,) [handler_rotateFileHandler] class=handlers.RotatingFileHandler level=DEBUG formatter=simpleFormatter args=('test.log', 'a', 1000, 9) [handler_timedrotateFileHandler] class=handlers.TimedRotatingFileHandler level=DEBUG formatter=form02 args=('upload.log',"midnight", 1) ############################################### 第三部分定义日志格式,下面定义了两种日志格式。 ############################################### #-------------------------------------------------- # 日志格式 #-------------------------------------------------- # %(asctime)s 年-月-日 时-分-秒,毫秒 2013-04-26 20:10:43,745 # %(filename)s 文件名,不含目录 # %(pathname)s 目录名,完整路径 # %(funcName)s 函数名 # %(levelname)s 级别名 # %(lineno)d 行号 # %(module)s 模块名 # %(message)s 消息体 # %(name)s 日志模块名 # %(process)d 进程id # %(processName)s 进程名 # %(thread)d 线程id # %(threadName)s 线程名 [formatters] keys=simpleFormatter,form01 [formatter_simpleFormatter] format=[%(asctime)s](%(levelname)s)%(name)s : %(message)s [formatter_form01] format=%(asctime)s %(filename)s[line:%(lineno)d] %(levelname)s %(message)s datefmt=%a, %d %b %Y %H:%M:%S ############################################### 测试代码如下,假设上述配置文件名为logger.conf。 #-*- coding:utf-8 -*- import logging import logging.config # from logging.handlers import RotatingFileHandler logging.config.fileConfig("logger.conf") # example01为根据日志大小切分日志的配置名logger = logging.getLogger("example01") logger.debug('This is debug message') logger.info('This is info message') logger.warning('This is warning message') |
|