日志记录

日志记录是一种跟踪软件运行时所发生事件的方式。在 bench 架构下,由于多租户的存在,快速追踪和消除各种不确定性可能会变得非常复杂。您可能希望将事件连同相关的、可变的上下文数据一起记录下来。

Frappe 实现了 Python 的日志模块,以维护 bench 和站点级别的日志。Version 13 使用日志轮转来保留最近的 20 个日志文件,以及当前正在运行的每个 100kB 大小的 开箱即用 日志文件。

frappe.log_level

维护 Frappe 进程的日志级别。要了解更多关于日志级别的信息,您可以查看 Python 的文档。

frappe.utils.logger.set_log_level

frappe.utils.logger.set_log_level(level) 可用于设置日志级别并动态重新生成日志记录器。

frappe.loggers

frappe.loggers 维护您进程中活动日志记录器的 dict。键是日志记录器的名称,通常是“{模块}-{站点}”,值则保存着 Logger 实例。

如果 docs.erpnext.com 和 frappeframework.com 是 bench 上的站点,那么一个 Web 工作进程可能拥有类似以下的 frappe.loggers

{
    "frappe.web-docs.erpnext.com": <logger frappe.web-docs.erpnext.com="">,
    "frappe.web-frappeframework.com": <logger frappe.web-frappeframework.com="">
}
</logger></logger>

frappe.logger

frappe.logger(module, with_more_info, allow_site, filter, max_size, file_count)

返回一个具有站点和 Bench 级别日志记录功能的 logging.Logger 对象。如果日志记录器不存在,则会创建并更新 frappe.loggers

参数:

  • module:您的日志记录器及其对应日志文件的名称。
  • with_more_info:将把 Form Dict 作为附加信息记录下来,通常对请求很有用。
  • allow_site:传递站点名称以明确记录在其日志下。如果为 True 且未指定,则会猜测日志应保存在哪个站点下。
  • filter:为您的日志记录器添加一个过滤函数。
  • max_size:每个日志文件的最大大小(以字节为单位)。
  • file_count:通过日志轮转保留的最大日志文件数量。

用法

frappe.logger("frappe.web").debug({
    "site": "frappeframework.com",
    "remote_addr": "192.148.1.7",
    "base_url": "https://frappeframework.com/docs/v14/user/en/api/logging",
    "full_path": "/docs/v14/user/en/api/logging",
    "method": "POST",
    "scheme": "https",
    "http_status_code": 200
})
2020-07-31 16:06:55,067 DEBUG frappe.web {'site': 'frappeframework.com', 'remote_addr': '192.148.1.7', 'base_url': 'https://frappeframework.com/docs/v14/user/en/api/logging', 'full_path': '/docs/v14/user/en/api/logging', 'method': 'POST', 'scheme': 'https', 'http_status_code': 200}

上述条目将记录在 ./logs/frappe.web.log./sites/frappeframework.com/logs/frappe.web.log 文件中。

用法如 app.py#L102-L110 中所实现。

示例

考虑一个场景:您编写了一个 API,用于更新用户发送的值所对应的计数器,并返回更新后的值。现在,您希望在该 API 中记录信息,以确保其按预期工作。因此,您创建了一个日志记录器 api 来跟踪相关事件。

frappe.utils.logger.set_log_level("DEBUG")
logger = frappe.logger("api", allow_site=True, file_count=50)

@frappe.whitelist()
def update(value):
    user = frappe.session.user
    logger.info(f"{user} accessed counter_app.update with value={value}")

    current_value = frappe.get_single_value("Value", "counter")
    updated_value = current_value + value
    logger.debug(f"{current_value} + {value} = {updated_value}")
    frappe.db.set_value("Value", "Value", "counter", updated_value)
    logger.info(f"{user} updated value to {value}")

    return updated_value

现在,对该端点的 API 调用将开始记录在您的 api.log 中,如下所示:

2020-07-31 16:06:55,067 INFO api [email protected] accessed counter_app.update with value 100
2020-07-31 16:06:55,067 DEBUG api 1000 + 100 = 1100
2020-07-31 16:06:55,068 INFO api [email protected] updated value to 1100

在此处了解更多关于 Frappe 日志记录的信息