Kivy 日志记录

默认情况下,Kivy 提供了一个基于标准 Python logging 模块的日志系统,并增加了若干旨在提高便利性的额外功能。这些功能包括:

  • 简化用法(单实例、简单配置、默认即可运行)

  • 在支持的终端上显示彩色编码输出

  • 默认情况下输出到 stderr

  • 通过冒号分隔进行消息分类

  • 即使日志记录被禁用,也能访问日志历史。

  • 内置处理各种跨平台考虑因素

  • 任何写入 sys.stderr 的杂散输出都会被捕获,并作为警告存储在日志文件中。

这些功能可通过配置文件或环境变量进行配置——包括回退到仅使用标准Python系统。

日志记录器对象

Kivy 的 Logger 类提供了一个单例的 logging.logger 实例。

除了标准的日志级别(debuginfowarningerrorcritical)之外,还提供了一个额外的 trace 级别。

示例用法

像使用标准Python日志器一样使用``Logger``。:

from kivy.logger import Logger

Logger.info('title: This is a info message.')
Logger.debug('title: This is a debug message.')

try:
    raise Exception('bleh')
except Exception:
    Logger.exception('Something happened!')

传递给日志记录器的消息被冒号(:)分隔成两部分。第一部分用作标题,第二部分用作消息内容。这样,您可以轻松地对消息进行“分类”。

Logger.info('Application: This is a test')

# will appear as

[INFO   ] [Application ] This is a test

你可以随时使用 setLevel 方法来更改日志级别。:

from kivy.logger import Logger, LOG_LEVELS

Logger.setLevel(LOG_LEVELS["debug"])

在 2.2.0 版本发生变更.

与其他日志记录的交互

Kivy 日志系统默认会显示来自任何日志记录器(例如第三方库)发送的所有日志消息。

可以添加额外的处理器。

警告

输出到 sys.stderr 的处理程序可能会引发循环,因为 stderr 输出会被报告为警告日志消息。

日志记录器配置

Kivy 日志模式

在最高层级上,Kivy 的日志系统由一个环境变量 KIVY_LOG_MODE 控制。它可以被设置为以下三个值之一:KIVYPYTHONMIXED

KIVY 模式(默认)

KIVY 模式下,所有 Kivy 处理器都连接到根日志记录器,因此系统中的所有日志消息都会输出到 Kivy 日志文件和控制台。任何对 sys.stderr 的杂散输出都会被记录为警告。

如果你从头开始编写一个完整的Kivy应用,这是最方便的模式。

PYTHON 模式

PYTHON 模式下,不会添加任何处理器,且不会捕获 sys.stderr 输出。由客户端自行添加适当的处理器。(如果未添加任何处理器,logging 模块将把输出发送到 stderr。)

使用 Logger 记录的消息将从名为 kivy 的日志器传播到根日志器。

如果Kivy应用是一个更大的项目的一部分,而该项目有自己的日志管理机制,那么这种模式能提供最大的控制力。

kivy.logger 文件包含多个 logging.handlerlogging.formatter 以及其他辅助类,使用户能够采用他们喜欢的 Kivy 日志功能,包括 stderr 重定向。

混合模式

MIXED 模式下,处理器直接添加到 Kivy 的 Logger 对象上,并关闭了传播。sys.stderr 不会被重定向。

使用Kivy的``Logger``记录的消息将出现在Kivy日志文件中,并输出到控制台。

然而,使用其他Python日志记录器记录的消息将不会被Kivy处理器处理。客户端需要自行添加相应的处理器。

如果你喜欢Kivy Logger 的功能,但正在编写一个依赖第三方库的Kivy应用,而这些库不使用冒号分隔类别或依赖记录器名称的显示,此模式提供了一个折衷方案。

同样地,kivy.logger 文件包含了可复用的日志功能,这些功能可以用来充分利用两个系统的优点。

配置文件

在``KIVY``和``MIXED``模式下,日志处理器可以通过Kivy配置文件进行控制:

[kivy]
log_level = info
log_enable = 1
log_dir = logs
log_name = kivy_%y-%m-%d_%_.txt
log_maxfiles = 100

关于允许值的更多信息,请参阅 kivy.config 模块中的描述。

此外,环境变量 KIVY_NO_FILELOGKIVY_NO_CONSOLELOG 可用于关闭相应处理程序的安装。

日志记录器历史

即使日志器未启用,你仍然可以访问最近的100条LogRecords。

from kivy.logger import LoggerHistory

print(LoggerHistory.history)
class kivy.logger.ColonSplittingLogRecord(logrecord)[源代码]

基类:LogRecord

克隆现有的logRecord,但如果消息字段包含冒号,则重新格式化该字段。

在 2.2.0 版本加入.

class kivy.logger.ColoredLogRecord(logrecord)[源代码]

基类:LogRecord

克隆现有的logRecord,但重新格式化levelname以添加颜色,并对消息进行加粗处理(根据消息中的$BOLD和$RESET标记)。

在 2.2.0 版本加入.

class kivy.logger.ConsoleHandler(stream=None)[源代码]

基类:StreamHandler

将记录发送到流(默认情况下为stderr)。

然而,如果消息以“stderr:”开头,则不会进行格式化,而是直接写入流中。

在 2.2.0 版本加入.

filter(record)[源代码]

通过咨询所有过滤器来确定一条记录是否可记录。

默认情况下允许记录日志;任何过滤器都可以通过返回假值来否决此操作。如果附加到处理器的过滤器返回一个日志记录实例,则该实例将替代原始日志记录,用于该处理器对事件的后续处理。如果过滤器返回任何其他真值,则原始日志记录将用于该处理器对事件的后续处理。

如果所有过滤器均未返回假值,此方法将返回一条日志记录。如果任一过滤器返回假值,此方法将返回假值。

在 3.2 版本发生变更: 允许过滤器仅为可调用对象。

在 3.12 版本发生变更: 允许过滤器返回一个LogRecord,而不是就地修改它。

class kivy.logger.FileHandler(level=0)[源代码]

基类:Handler

emit(message)[源代码]

尽一切努力实际记录指定的日志记录。

此版本旨在由子类实现,因此会引发NotImplementedError。

purge_logs()[源代码]

清除超过最大日志文件数量的日志,从创建时间戳(在Linux上为编辑时间戳)最早的文件开始。

class kivy.logger.KivyFormatter(*args, use_color=True, **kwargs)[源代码]

基类:Formatter

将消息中以冒号标记的第一个字段拆分出来,并根据情况对记录应用终端颜色代码;若彩色日志不可用,则去除颜色标记。

在 2.2.0 版本加入.

format(record)[源代码]

将指定的记录格式化为文本。

记录的属性字典被用作字符串格式化操作的操作数,该操作生成返回的字符串。在格式化字典之前,会执行几个预备步骤。记录的消息属性通过LogRecord.getMessage()计算得出。如果格式化字符串使用了时间(通过调用usesTime()确定),则会调用formatTime()来格式化事件时间。如果存在异常信息,则使用formatException()进行格式化,并附加到消息中。

class kivy.logger.LoggerHistory(level=0)[源代码]

基类:Handler

emit(message)[源代码]

尽一切努力实际记录指定的日志记录。

此版本旨在由子类实现,因此会引发NotImplementedError。

flush()[源代码]

确保所有日志输出已刷新。

此版本不执行任何操作,旨在由子类实现。

class kivy.logger.ProcessingStream(channel, func)[源代码]

基类:object

类似流(stream-like)的对象,它会接收写入其中的每一行完整内容,为其添加指定前缀,并将给定的函数应用于该行。

在 2.2.0 版本加入.

class kivy.logger.UncoloredLogRecord(logrecord)[源代码]

基类:LogRecord

克隆现有的logRecord,但重新格式化消息以移除$BOLD/$RESET标记。

在 2.2.0 版本加入.

kivy.logger.add_kivy_handlers(logger)[源代码]

为日志记录器添加Kivy专用的处理器。

在 2.2.0 版本加入.

kivy.logger.is_color_terminal()[源代码]

检测环境是否支持在输出中使用颜色代码。

在 2.2.0 版本加入.