天天看点

Python 项目标准库中的 logging 如何使用?

作者:小逗IT

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:该参数决定了能留几个日志文件。
Python 项目标准库中的 logging 如何使用?

举例:

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 | 线程名称

生成的日志:

Python 项目标准库中的 logging 如何使用?

完整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——