Python logging

基础知识

日志的作用

  • 调试: 在开发过程中,日志记录能够提供程序运行时的信息,帮助开发者快速定位错误。
  • 监控: 在生产环境中,日志可以帮助监测应用的性能和状态。
  • 问题追踪: 日志记录能够跟踪程序执行中的关键事件,根据日志信息可以迅速找到问题的根源。
  • 审计: 记录用户的操作和系统的变化,以便进行后续审计。

不同级别的日志

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.")
Python logging

基础使用

logging.basicConfig() 函数

logging.basicConfig() 用于设置日志记录的基本配置。可以通过此函数配置日志级别、输出格式、文件名、处理器等。

以下是 basicConfig 函数的一些常用参数:

  1. level:
    • 类型:int
    • 用途:设置日志记录的最低级别。只有该级别及以上的日志信息才会被记录。
    • 常用值:
      • logging.DEBUG:详细的调试信息,通常用于问题诊断。
      • logging.INFO:常规信息,确认程序正常运行。
      • logging.WARNING:警告信息,有可能会导致问题。
      • logging.ERROR:错误信息,程序某部分出现了问题。
      • logging.CRITICAL:严重错误的信息,可能导致程序无法继续运行。
  2. filename:
    • 类型:str
    • 用途:指定日志输出的文件名。如果设置了该参数,所有日志信息将写入到文件中,而不是输出到控制台。
    • 示例:filename='app.log'
  3. filemode:
    • 类型:str
    • 用途:指定打开日志文件的模式。如果使用 filename 参数,您可以通过该参数设置文件模式。
    • 常用值:
      • 'a':追加模式(默认)。
      • 'w':写入模式(会覆盖原文件)。
  4. format:
    • 类型:str
    • 用途:指定日志输出的格式,您可以定义信息的显示方式(包括时间戳、日志级别、消息内容等)。
    • 常用格式化指示符:
      • %(asctime)s:日志产生的时间。
      • %(levelname)s:日志级别(如 DEBUG, INFO, WARNING, ERROR, CRITICAL)。
      • %(message)s:日志记录的具体信息。
      • %(name)s:日志记录器的名称。
      • %(filename)s:日志来源文件的名称。
  5. datefmt:
    • 类型:str
    • 用途:指定时间字符串的格式。如果使用 %(asctime)s,该参数会影响时间格式。
    • 示例:datefmt='%Y-%m-%d %H:%M:%S'
  6. 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中:

Python logging

高级用法

日志处理器(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

Like (0)
LJH的头像LJH
Previous 6天前
Next 6天前

相关推荐

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注