📜  python 日志文件 (1)

📅  最后修改于: 2023-12-03 14:46:16.044000             🧑  作者: Mango

Python 日志文件

简介

日志是程序开发过程中非常重要的部分。日志文件可以帮助程序员在开发、测试和部署过程中记录和追踪程序的行为和错误。

在 Python 中,标准库中的 logging 模块提供了一个用于创建和写入日志文件的框架。这个框架提供了非常灵活的配置方法,使得程序员可以根据自己的需要编写自定义的日志信息。

logging 模块的五个关键组件

logging 模块的五个关键组件是: logger, handler, formatter, filter 和 level。这些组件用于不同的日志操作,例如写入日志文件、打印日志信息到控制台等等。

Logger

Logger 用于向客户端程序员公开可用的访问日志模块的方式。通过使用 Logger,程序员可以向不同类型的 handler 发送不同类型的日志消息。一个 Logger 的名称必须是一个以点分隔的名称。

import logging

logger = logging.getLogger(__name__)

在上面的例子中,__name__ 指的是当前模块的名称。Logger 对象可以在各处通过 logger 调用进行使用。例如,可以使用 logger.info 方法来将一条信息添加到日志中。

Handler

Handlers 将日志消息发送到指定位置。例如,可以将消息发送到文件、控制台或者本地 socket 端口。有多个不同的 handler 可以用于不同的操作。

import logging

logger = logging.getLogger(__name__)
handler = logging.FileHandler('example.log')

logger.addHandler(handler)

在上面的例子中,将会创建一个 handler ,并将其添加到 logger 中。handler 将日志写入到 'example.log' 文件中。

Formatter

Formatter 用于控制日志消息的格式。默认格式可能不适合你的需求,因此你通常需要使用 formatter 来定制自己的格式。

import logging

logger = logging.getLogger(__name__)
handler = logging.FileHandler('example.log')
formatter = logging.Formatter('%(asctime)s %(levelname)s %(message)s')

handler.setFormatter(formatter)
logger.addHandler(handler)

在上面的例子中,创建了一个 formatter ,并将其添加到 handler 中。formatter 将使磁盘上的日志消息以包含时间戳、日志级别和消息文本的格式进行记录。

Filter

Filter 可以更精细地控制哪些日志消息将被发送到 handler。

import logging

class IgnoreCertainFilter(logging.Filter):
    def filter(self, record):
        return 'ignore me' not in record.getMessage()

logger = logging.getLogger(__name__)
handler = logging.FileHandler('example.log')
formatter = logging.Formatter('%(asctime)s %(levelname)s %(message)s')
filter = IgnoreCertainFilter()

handler.setFormatter(formatter)
handler.addFilter(filter)
logger.addHandler(handler)

在上面的例子中,创建了一个 filter ,并添加到 handler 中。filter 只允许那些不包含 'ignore me' 字符串的日志消息进入 handler。

Level

Level 指定了处理的日志消息的最低级别。在不同情况下,一个不同的 level 可能更适合你的需求。

import logging

logger = logging.getLogger(__name__)
logger.setLevel(logging.WARNING)

handler = logging.FileHandler('example.log')
formatter = logging.Formatter('%(asctime)s %(levelname)s %(message)s')

handler.setLevel(logging.ERROR)
handler.setFormatter(formatter)

logger.addHandler(handler)

在上面的例子中,logger.setLevel(logging.WARNING) 指定了日志记录的最低级别为 'WARNING' 。handler.setLevel(logging.ERROR) 指定了 handler 只处理错误等级以上的日志消息。

结论

虽然 logging 模块看起来有些复杂,但了解这五个组件是使用该模块的关键。这个模块提供了一些默认值,但由于自定义日志格式和处理程序的灵活性,因此程序员可以完全控制其工作方式。