Python标准库logging常用的日志实现类有:StreamHandler和TimeRotatingFileHandler,
这两者组合,可以实现按天记录日志及实现了日志控制台上的输出,在我们日志工作中已经
够用了,不过Python在日志实现上,还提供了其他的Handler,具体前往logging.handlers查看。
下面是一段代码,结合代码我们介绍logging的用法:
from logging.handlers import TimedRotatingFileHandler
file_handler = TimedRotatingFileHandler(filename=LOG_FILE, when="MIDNIGHT", interval=1, backupCount=30)
console_handler = logging.StreamHandler() # 输出到控制台
file_handler.setLevel('INFO') # 定义日志等级,这里INFO以上才输出到文件
console_handler.setLevel('INFO') # 定义日志等级,这里INFO以上才输出到控制台
上面分别定义了文件和控制台的日志记录handler,日志级别是INFO,日志级别定义大家非
常熟悉,跟Java是一样的,但这里有几个参数非常重要:
- interval:日志滚动周期
- when:时间间隔类型,具体类型请参考下表。
- backupCount:该参数决定了能留几个日志文件。
举例:
when='D',interval=2,backupCount=30
就是每2天生成一个日志文件,保留30个日志文件。
when="MIDNIGHT", interval=1, backupCount=30
表示每天0点为更新点,每天生成一个文件。
下面这段代码是日志格式定义:
fmt = '[%(asctime)s] [%(process)d] [%(levelname)s] - %(module)s.%(funcName)s (%(filename)s:%(lineno)d) - %(message)s'
formatter = logging.Formatter(fmt)
file_handler.setFormatter(formatter)
# filename="mylog" suffix设置,会生成文件名为mylog.2020-02-25.log
file_handler.suffix = "%Y-%m-%d.log"
# extMatch是编译好正则表达式,用于匹配日志文件名后缀
# 需要注意的是suffix和extMatch一定要匹配的上,如果不匹配,过期日志不会被删除。
file_handler.extMatch = re.compile(r"^\d{4}-\d{2}-\d{2}.log#34;)
console_handler.setFormatter(formatter)
logger = logging.getLogger(__file__)
logger.setLevel('INFO')
logger.addHandler(file_handler)
logger.addHandler(console_handler)
format格式字符串定义说明:
- %(asctime)s | 日志事件发生的时间,如:2003-07-08 16:49:45,896
- %(created)f | 日志事件发生的时间。
- %(msecs)d | 日志事件发生事件的毫秒部分
- %(levelname)s | 日志级别('DEBUG', 'INFO', 'WARNING', 'ERROR', 'CRITICAL')
- %(name)s | 日志器名称,默认是'root'
- %(message)s | 日志记录的文本内容
- %(pathname)s | 调用日志记录函数的源码文件的全路径
- %(filename)s | pathname的文件名部分,包含文件后缀
- %(module)s | filename的名称部分,不包含后缀
- %(lineno)d | 调用日志记录函数的源代码所在的行号
- %(funcName)s | 调用日志记录函数的函数名
- %(process)d | ID
- %(processName)s | 进程名称,Python 3.1新增
- %(thread)d | 线程ID
- %(thread)s | 线程名称
生成的日志:
完整Demo:
from logging.handlers import TimedRotatingFileHandler
LOG_FILE = '/tmp/car.log'
file_handler = TimedRotatingFileHandler(filename=LOG_FILE, when="MIDNIGHT", interval=1, backupCount=30)
console_handler = logging.StreamHandler() # 输出到控制台
file_handler.setLevel('INFO') # 定义日志等级,这里INFO以上才输出到文件
console_handler.setLevel('INFO') # 定义日志等级,这里INFO以上才输出到控制台
# 定义日志显示格式
fmt = '[%(asctime)s] [%(process)d] [%(levelname)s] - %(module)s.%(funcName)s (%(filename)s:%(lineno)d) - %(message)s'
formatter = logging.Formatter(fmt)
file_handler.setFormatter(formatter)
# filename="mylog" suffix设置,会生成文件名为mylog.2020-02-25.log
file_handler.suffix = "%Y-%m-%d.log"
# extMatch是编译好正则表达式,用于匹配日志文件名后缀
# 需要注意的是suffix和extMatch一定要匹配的上,如果不匹配,过期日志不会被删除。
file_handler.extMatch = re.compile(r"^\d{4}-\d{2}-\d{2}.log#34;)
console_handler.setFormatter(formatter)
logger = logging.getLogger(__file__)
logger.setLevel('INFO')
logger.addHandler(file_handler)
logger.addHandler(console_handler)
logger.info('hello,Python logging你好。')
——END——