前言
如果你想在调试时能看到错误信息,但又不想在生产环境中输出错误信息,可以使用 log 库来记录错误信息,在调试时输出 log,在生产环境中不输出。
步骤
首先导包
import logging
然后开启logging
logging.basicConfig(filename='example.log', level=logging.DEBUG)
其中 filename='example.log
表示把 logging 中的信息输出到 example.log 文件中,如果不需要可省略。filename 参数指定了日志文件的名称, level 参数指定了日志级别, logging.DEBUG 就是打印所有debug及以上级别的log
在生产环境中,我们可以关闭 logging 或者更改 logging level,不会有错误信息的输出。
当然你也可以通过
logging.basicConfig(filename='example.log', filemode='w', level=logging.DEBUG)
来进行配置,filemode=‘w’ 代表每次运行程序都会清空之前的日志
日志消息的格式
format
参数用来指定日志消息的格式,它是一个格式化字符串
format 字段中可以包含特定的格式化指示符,它们将被日志记录器替换为相应的日志信息。以下是一些常用的格式化指示符:
%(asctime)s
:日志事件发生的时间%(levelname)s
:日志级别名称(例如,INFO,DEBUG,ERROR)%(message)s
:日志消息%(name)s
:记录器的名称%(filename)s
:调用日志记录的源文件的文件名%(lineno)d
:调用日志记录的源文件中的行号%(funcName)s
:调用日志记录的函数名%(threadName)s
:线程名
下面是一个示例,展示如何配置和使用logging.basicConfig
来设置日志的格式:
import logging
# 配置日志记录器
logging.basicConfig(
level=logging.INFO,
format='%(asctime)s - %(name)s - %(levelname)s - %(message)s'
)
# 创建日志记录器
logger = logging.getLogger(__name__)
# 测试日志记录
logger.debug('这是一个调试消息')
logger.info('这是一个信息消息')
logger.warning('这是一个警告消息')
logger.error('这是一个错误消息')
logger.critical('这是一个严重消息')
在上面的示例中,日志格式被配置为 ‘%(asctime)s - %(name)s - %(levelname)s - %(message)s’,这将生成类似以下的日志消息:
2024-07-03 12:34:56,789 - __main__ - INFO - 这是一个信息消息
常见格式化指示符示例
- 基本格式:
logging.basicConfig(format='%(levelname)s:%(message)s') # INFO:这是一个信息消息
- 包含时间、文件名和行号:
logging.basicConfig(format='%(asctime)s - %(filename)s:%(lineno)d - %(levelname)s - %(message)s')
# 2024-07-03 12:34:56,789 - example.py:10 - INFO - 这是一个信息消息
- 包含线程名:
logging.basicConfig(format='%(asctime)s - %(threadName)s - %(levelname)s - %(message)s')
# 2024-07-03 12:34:56,789 - MainThread - INFO - 这是一个信息消息
- 包含模块名和函数名:
logging.basicConfig(format='%(asctime)s - %(module)s - %(funcName)s - %(levelname)s - %(message)s')
# 2024-07-03 12:34:56,789 - example - <module> - INFO - 这是一个信息消息
应当了解的知识
logging 模块支持五种日志级别,从高到低分别是:
- CRITICAL (50): 严重错误,程序无法继续运行
- ERROR (40): 错误信息,需要人工干预
- WARNING (30): 警告信息,程序可以继续运行,但可能会有问题
- INFO (20): 普通信息,比如连接成功
- DEBUG (10): 调试信息,帮助理解程序运行过程 使用
logging.basicConfig(level=logging.LEVEL_NAME) 来配置日志级别,LEVEL_NAME
是要设置的级别名称,可以是 CRITICAL, ERROR, WARNING, INFO,DEBUG
如果你设置日志级别为 logging.WARNING,只会输出级别为 WARNING 及以上级别的日志信息.
例如:
logging.basicConfig(filename='example.log', level=logging.WARNING)
其他
logging.exception()
函数与 logging.error()
函数类似,但除了记录错误信息之外,它还会记录错误的调用栈。这使得它在调试时特别有用。
如果在之前已经调用了 logging.basicConfig(filename=‘example.log’) 来配置日志输出到文件,logging.exception(e) 会把错误信息记录到 example.log 文件中。如果没有进行配置,默认会在控制台输出错误信息。
关于颜色的补充
Python 的内置 logging
模块默认情况下不支持彩色输出。然而,为了在终端中根据日志级别显示不同颜色的日志信息,可以使用第三方库 colorlog
。该库扩展了 logging
模块的功能,允许为不同的日志级别设置不同的颜色,从而提高日志的可读性。
安装:
pip install colorlog
以下是使用 colorlog
实现彩色日志输出的示例:
import logging
import colorlog
# 创建 logger 对象
logger = logging.getLogger(__name__)
logger.setLevel(logging.DEBUG)
# 创建控制台处理器
console_handler = colorlog.StreamHandler()
console_handler.setLevel(logging.DEBUG)
# 定义日志输出格式
formatter = colorlog.ColoredFormatter(
'%(log_color)s%(asctime)s - %(name)s - %(levelname)s - %(message)s',
datefmt='%Y-%m-%d %H:%M:%S',
log_colors={
'DEBUG': 'cyan',
'INFO': 'green',
'WARNING': 'yellow',
'ERROR': 'red',
'CRITICAL': 'red,bg_white',
}
)
# 将格式器添加到处理器
console_handler.setFormatter(formatter)
# 将处理器添加到 logger
logger.addHandler(console_handler)
# 测试日志输出
logger.debug('这是调试信息')
logger.info('这是信息日志')
logger.warning('这是警告信息')
logger.error('这是错误信息')
logger.critical('这是严重错误信息')
在上述代码中,我们首先导入了 logging
和 colorlog
模块。然后,创建了一个 logger
对象,并设置其日志级别为 DEBUG
。接着,创建了一个控制台处理器 console_handler
,并定义了日志的输出格式,其中 log_colors
参数指定了不同日志级别对应的颜色。最后,将格式器添加到处理器,再将处理器添加到 logger
,即可实现根据日志级别输出不同颜色的日志信息