日志记录器logger

1. 代码示例 

import logging

class DebugFilter(logging.Filter):
    def filter(self, record):
        return record.levelno == logging.DEBUG

# 创建一个Logger对象
logger = logging.getLogger(__name__)

# 创建一个FileHandler处理程序
file_handler = logging.FileHandler('debug.log')
file_handler.setLevel(logging.DEBUG)

# 创建一个格式化字符串
formatter = logging.Formatter('%(asctime)s - %(levelname)s - %(message)s')

# 创建一个DebugFilter过滤器
debug_filter = DebugFilter()

# 将格式化字符串应用到处理程序
file_handler.setFormatter(formatter)

# 将过滤器应用到处理程序
file_handler.addFilter(debug_filter)

# 添加处理程序到Logger对象
logger.addHandler(file_handler)

# 发送日志信息
logger.debug('这是一个DEBUG级别的日志信息')
logger.info('这是一个INFO级别的日志信息')

2. 模块介绍

  • 记录器暴露了应用程序代码直接使用的接口。

  • 处理器将日志记录(由记录器创建)发送到适当的目标。

  • 过滤器提供了更细粒度的功能,用于确定要输出的日志记录。

  • 格式器指定最终输出中日志记录的样式。

2.1 记录器对象

        记录器有以下的属性和方法。注意 永远 不要直接实例化记录器,应当通过模块级别的函数 logging.getLogger(name) 。多次使用相同的名字调用 getLogger() 会一直返回相同的 Logger 对象的引用。

        name 一般是句点分割的层级值, 像 foo.bar.baz (尽管也可以只是普通的 foo)。层次结构列表中位于下方的记录器是列表中较高位置的记录器的子级。例如,有个名叫 foo 的记录器,而名字是 foo.bar, foo.bar.baz,和 foo.bam 的记录器都是 foo 的子级。记录器的名字分级类似 Python 包的层级,如果您使用建议的结构 logging.getLogger(__name__) 在每个模块的基础上组织记录器,则与之完全相同。这是因为在模块里, __name__ 是该模块在 Python 包命名空间中的名字。

1. 结构清晰: 每个模块都有自己的 logger 对象,这使得日志消息的组织更加清晰。我们可以通过模块名称来轻松地找到相关的日志消息。

2. 独立控制: 每个模块的 logger 对象可以独立设置日志级别、过滤器和格式化器。这使得我们可以根据每个模块的需要来控制日志输出的详细程度。

2.2 日志级别

级别

数值

何种含义 / 何时使用

logging.NOTSET

0

当在日志记录器上设置时,表示将查询上级日志记录器以确定生效的级别。 如果仍被解析为 NOTSET,则会记录所有事件。 在处理器上设置时,所有事件都将被处理。

logging.DEBUG

10

详细的信息,通常只有试图诊断问题的开发人员才会感兴趣。

logging.INFO

20

确认程序按预期运行。

logging.WARNING

30

表明发生了意外情况,或近期有可能发生问题(例如‘磁盘空间不足’)。 软件仍会按预期工作。

logging.ERROR

40

由于严重的问题,程序的某些功能已经不能正常执行

logging.CRITICAL

50

严重的错误,表明程序已不能继续执行

2.3 处理器对象

Logger 对象可以拥有多个处理器对象,用于处理和输出日志消息。以下是常用的处理器对象:

2.3.1 StreamHandler:

 将日志消息输出到标准输出流(sys.stdout)或标准错误流(sys.stderr)。

import logging

logger = logging.getLogger(__name__)
handler = logging.StreamHandler()
logger.addHandler(handler)


2.3.2 FileHandler:

将日志消息输出到指定的文件。

import logging

logger = logging.getLogger(__name__)
handler = logging.FileHandler('my_log.txt')
logger.addHandler(handler)


2.3.3 RotatingFileHandler:

将日志消息输出到指定的文件,并根据文件大小或时间进行自动轮转。

import logging

logger = logging.getLogger(__name__)
handler = logging.RotatingFileHandler('my_log.txt', maxBytes=1024, backupCount=5)
logger.addHandler(handler)

2.4  格式器对象

        logging.Formatter 对象用于格式化日志消息,它可以控制日志消息的输出格式。以下是 Formatter 的使用方法:

2.4.1 创建 Formatter 对象:

import logging

formatter = logging.Formatter('%(asctime)s - %(name)s - %(levelname)s - %(message)s')


2.4.2 将 Formatter 对象添加到 Handler 对象:

handler = logging.StreamHandler()
handler.setFormatter(formatter)


2.4.3 将 Handler 对象添加到 Logger 对象:

logger = logging.getLogger(__name__)
logger.addHandler(handler)


2.4.4 使用 Logger 对象记录日志消息:

logger.info('This is an info message.')
logger.warning('This is a warning message.')
logger.error('This is an error message.')


2.4.5 格式化后的日志消息示例:

2023-10-27 10:00:00 - __main__ - INFO - This is an info message.
2023-10-27 10:00:00 - __main__ - WARNING - This is a warning message.
2023-10-27 10:00:00 - __main__ - ERROR - This is an error message.


Formatter 的常用格式化字符串:

  • %(asctime)s: 记录时间
  • %(name)s: 记录器名称
  • %(levelname)s: 日志级别
  • %(message)s: 日志消息
  • %(pathname)s: 文件路径
  • %(lineno)d: 行号
  • %(funcName)s: 函数名
  • %(process)d: 进程 ID
  • %(thread)d: 线程 ID

Formatter 的其他方法:

  • format(record): 格式化日志记录对象
  • formatException(ei): 格式化异常信息
  • usesTime(): 检查是否使用时间格式化字符串
  • default_time_format: 默认时间格式

2.5 过滤器对象

        logging.Filter 对象用于过滤日志消息,它可以控制哪些日志消息可以被记录。以下是 Filter 的使用方法:

2.5.1 创建 Filter 对象:

import logging

class MyFilter(logging.Filter):
    def filter(self, record):
        # 返回 True 表示记录该日志消息,返回 False 表示丢弃该日志消息
        if record.levelname == 'DEBUG':
            return True
        else:
            return False


2.5.2 将 Filter 对象添加到 Handler 对象:

handler = logging.StreamHandler()
handler.addFilter(MyFilter())


2.5.3 将 Handler 对象添加到 Logger 对象:

logger = logging.getLogger(__name__)
logger.addHandler(handler)


2.5.4 使用 Logger 对象记录日志消息:

logger.debug('This is a debug message.')
logger.info('This is an info message.')
logger.warning('This is a warning message.')


2.5.5 只有符合 Filter 条件的日志消息才会被记录:

This is an info message.
This is a warning message.

@logger

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值