基础知识
日志的作用
- 调试: 在开发过程中,日志记录能够提供程序运行时的信息,帮助开发者快速定位错误。
- 监控: 在生产环境中,日志可以帮助监测应用的性能和状态。
- 问题追踪: 日志记录能够跟踪程序执行中的关键事件,根据日志信息可以迅速找到问题的根源。
- 审计: 记录用户的操作和系统的变化,以便进行后续审计。
不同级别的日志
Python logging
提供五个标准日志级别,依次为:
DEBUG
: 详细的信息,通常用于诊断问题。INFO
: 一般的信息,用于确认程序按预期工作。WARNING
: 表示某种不好的情况,可能会影响程序的执行。ERROR
: 表示问题导致某些功能无法正常工作。CRITICAL
: 表示严重错误,系统可能无法继续运行。
示例
import logging
logging.basicConfig(level=logging.DEBUG)
logging.debug("This is a debug message.")
logging.info("This is an info message.")
logging.warning("This is a warning message.")
logging.error("This is an error message.")
logging.critical("This is a critical message.")

基础使用
logging.basicConfig() 函数
logging.basicConfig()
用于设置日志记录的基本配置。可以通过此函数配置日志级别、输出格式、文件名、处理器等。
以下是 basicConfig
函数的一些常用参数:
- level:
- 类型:
int
- 用途:设置日志记录的最低级别。只有该级别及以上的日志信息才会被记录。
- 常用值:
logging.DEBUG
:详细的调试信息,通常用于问题诊断。logging.INFO
:常规信息,确认程序正常运行。logging.WARNING
:警告信息,有可能会导致问题。logging.ERROR
:错误信息,程序某部分出现了问题。logging.CRITICAL
:严重错误的信息,可能导致程序无法继续运行。
- 类型:
- filename:
- 类型:
str
- 用途:指定日志输出的文件名。如果设置了该参数,所有日志信息将写入到文件中,而不是输出到控制台。
- 示例:
filename='app.log'
- 类型:
- filemode:
- 类型:
str
- 用途:指定打开日志文件的模式。如果使用
filename
参数,您可以通过该参数设置文件模式。 - 常用值:
'a'
:追加模式(默认)。'w'
:写入模式(会覆盖原文件)。
- 类型:
- format:
- 类型:
str
- 用途:指定日志输出的格式,您可以定义信息的显示方式(包括时间戳、日志级别、消息内容等)。
- 常用格式化指示符:
%(asctime)s
:日志产生的时间。%(levelname)s
:日志级别(如 DEBUG, INFO, WARNING, ERROR, CRITICAL)。%(message)s
:日志记录的具体信息。%(name)s
:日志记录器的名称。%(filename)s
:日志来源文件的名称。
- 类型:
- datefmt:
- 类型:
str
- 用途:指定时间字符串的格式。如果使用
%(asctime)s
,该参数会影响时间格式。 - 示例:
datefmt='%Y-%m-%d %H:%M:%S'
- 类型:
- handlers:
- 类型:
list
- 用途:指定日志处理器的列表。
- 类型:
示例:
import logging
# 配置基本日志设置
logging.basicConfig(
level=logging.INFO, # 设置日志级别为 INFO,记录 INFO 及以上级别的日志
format='%(asctime)s - %(levelname)s - %(message)s', # 定义日志输出格式
datefmt='%Y-%m-%d %H:%M:%S', # 自定义日期时间格式
filename='app.log', # 将日志记录到文件 app.log 中
filemode='a' # 以追加模式打开日志文件
)
# 示例日志记录
logging.debug("这是一条调试信息,对调试问题有帮助。") # 这条日志不会被记录,因为级别低于 INFO
logging.info("应用程序已启动。") # 这条信息会被记录
logging.warning("这是一个警告,提示正在发生的事情。") # 这条信息会被记录
logging.error("发生了一个错误! 请检查。") # 这条信息会被记录
logging.critical("致命错误,程序无法继续运行!") # 这条信息会被记录
日志记录在app.log中:

高级用法
日志处理器(Handlers):日志处理器是 logging
模块中用于将日志消息发送到输出目标的组件。每个日志记录器可以有一个或多个处理器。以下是常用的几种处理器:控制台处理器(StreamHandler)、文件处理器(FileHandler)、SMTP 处理器(SMTPHandler)
日志过滤器(Filters):日志过滤器用于决定特定的日志消息是否应该被记录。您可以使用过滤器来创建自定义的日志记录规则。
日志记录器(Loggers):日志记录器是 logging
模块的核心对象,您可以使用它记录日志消息。日志记录器可以按照模块或功能进行组织,便于管理和维护。
通过日志处理器,您可以将日志信息发送到不同的目标(如控制台、文件、邮件等);通过日志过滤器,您可以控制记录哪些特定消息;通过日志记录器,您可以组织和管理不同模块的日志信息。这些特性结合起来,可以帮助您更有效地管理应用程序的日志记录。
日志处理器
日志处理器是 logging
模块的核心部件之一,负责决定应将日志记录发送到何处。每个日志记录器可以拥有一个或多个处理器。
1.1. 控制台处理器 (StreamHandler)
- 作用:将日志消息输出到控制台(通常是终端或命令行窗口)。
- 示例代码:
import logging
# 配置日志记录器
logger = logging.getLogger('my_logger') # 创建一个日志记录器
logger.setLevel(logging.DEBUG) # 设置日志级别为DEBUG
# 创建控制台处理器
console_handler = logging.StreamHandler()
console_handler.setLevel(logging.INFO) # 设置该处理器的级别为INFO
# 创建格式化器并设置给处理器
formatter = logging.Formatter('%(asctime)s - %(levelname)s - %(message)s')
console_handler.setFormatter(formatter)
# 将处理器添加到记录器
logger.addHandler(console_handler)
# 测试日志输出
logger.debug("This is a debug message.") # 不会打印到控制台
logger.info("This is an info message.") # 会打印到控制台
logger.warning("This is a warning message.") # 会打印到控制台
1.2. 文件处理器 (FileHandler)
- 作用:将日志消息写入文件。
- 示例代码:
# 创建文件处理器
file_handler = logging.FileHandler('app.log') # 创建文件处理器,将日志写入app.log文件
file_handler.setLevel(logging.ERROR) # 设置该处理器的级别为ERROR
# 创建格式化器并设置给处理器
file_handler.setFormatter(formatter)
# 将处理器添加到日志记录器
logger.addHandler(file_handler)
# 测试日志输出
logger.error("This is an error message.") # 会写入到文件app.log
1.3. SMTP 处理器 (SMTPHandler)
- 作用:将日志消息通过电子邮件发送。
- 示例代码:
from logging.handlers import SMTPHandler
# 基本的电子邮件配置
mail_handler = SMTPHandler(
mailhost=('smtp.example.com', 587), # SMTP服务器地址和端口
fromaddr='from@example.com',
toaddrs=['to@example.com'],
subject='Application Error',
credentials=('user@example.com', 'password'), # 邮箱登录凭证
secure=() # 需要使用安全连接,可能需要添加 TLS。
)
mail_handler.setLevel(logging.ERROR) # 设置为ERROR级别,只在错误时发送邮件
mail_handler.setFormatter(formatter) # 设置格式化器
# 将SMTP处理器添加到记录器
logger.addHandler(mail_handler)
# 测试错误日志
logger.error("This error will trigger an email.")
日志过滤器
过滤器用于控制哪些日志记录会发送到处理器。例如,您可能希望只记录特定来源或特定内容的日志。
示例代码
class CustomFilter(logging.Filter):
def filter(self, record):
# 只记录消息中包含 'example' 的日志
return 'example' in record.msg
# 创建日志记录器
logger = logging.getLogger('my_logger')
logger.addFilter(CustomFilter())
logger.debug("This is a debug message.") # 不会被记录
logger.info("This is an example info message.") # 会被记录
logger.warning("This will also be ignored.") # 不会被记录
在上面的示例中,只有当日志消息中包含字符串 "example" 时,才会通过过滤器。
日志记录器
日志记录器是 logging
模块的核心对象,它负责记录日志。您可以创建多个日志记录器以便更好地组织日志输出。
# 创建主模块的日志记录器
main_logger = logging.getLogger('main_module')
# 创建子模块的日志记录器
sub_logger = logging.getLogger('sub_module')
# 设置日志级别
main_logger.setLevel(logging.DEBUG)
sub_logger.setLevel(logging.WARNING)
# 测试日志输出
main_logger.info("This is information from the main module.")
sub_logger.warning("This is a warning from the sub module.")
在这个例子中,有两个日志记录器:一个用于主模块,另一个用于子模块。每个记录器可以配置为不同的级别,这样可以根据需要进行更加细粒度的日志管理。
发布者:LJH,转发请注明出处:https://www.ljh.cool/43094.html