日志记录是一种跟踪软件运行时所发生事件的方式。在 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 日志记录的信息