日志服务
允许插件提供状态和诊断信息。
注意
日志服务仅在服务器端可用。
关于记录什么以及避免记录什么(敏感数据、嘈杂的 info 消息、实现细节)的编辑指导,请参阅 日志记录指南。
import type { PluginInitializerContext, CoreSetup, Plugin, Logger } from '@kbn/core/server';
export class MyPlugin implements Plugin {
private readonly logger: Logger;
constructor(initializerContext: PluginInitializerContext) {
this.logger = initializerContext.logger.get();
}
public setup(core: CoreSetup) {
try {
this.logger.debug('doing something...');
// …
} catch (e) {
this.logger.error('failed doing something...');
}
}
}
用法非常直观,只需获取特定上下文的记录器(logger),并使用它以不同的日志级别记录消息即可。
const logger = kibana.logger.get('server');
logger.trace('Message with `trace` log level.');
logger.debug('Message with `debug` log level.');
logger.info('Message with `info` log level.');
logger.warn('Message with `warn` log level.');
logger.error('Message with `error` log level.');
logger.fatal('Message with `fatal` log level.');
const loggerWithNestedContext = kibana.logger.get('server', 'http');
loggerWithNestedContext.trace('Message with `trace` log level.');
loggerWithNestedContext.debug('Message with `debug` log level.');
假设使用了名称为 server、使用 console 追加器且级别为 trace 的记录器,控制台输出将如下所示
[2017-07-25T11:54:41.639-07:00][TRACE][server] Message with `trace` log level.
[2017-07-25T11:54:41.639-07:00][DEBUG][server] Message with `debug` log level.
[2017-07-25T11:54:41.639-07:00][INFO ][server] Message with `info` log level.
[2017-07-25T11:54:41.639-07:00][WARN ][server] Message with `warn` log level.
[2017-07-25T11:54:41.639-07:00][ERROR][server] Message with `error` log level.
[2017-07-25T11:54:41.639-07:00][FATAL][server] Message with `fatal` log level.
[2017-07-25T11:54:41.639-07:00][TRACE][server.http] Message with `trace` log level.
[2017-07-25T11:54:41.639-07:00][DEBUG][server.http] Message with `debug` log level.
当 server 记录器使用 warn 级别时,日志将不那么详细
[2017-07-25T11:54:41.639-07:00][WARN ][server] Message with `warn` log level.
[2017-07-25T11:54:41.639-07:00][ERROR][server] Message with `error` log level.
[2017-07-25T11:54:41.639-07:00][FATAL][server] Message with `fatal` log level.
将兼容 ECS 的 LogMeta 作为第二个参数传递,以便运维人员可以通过 kibana.yml 中的 元数据过滤器 为部分流量提高详细级别,而无需为整个记录器启用调试模式。
将稳定的实体标识符放在 labels.* 下。tags 仅保留用于分类标记(事件类),不要用于存放 ID
logger.debug('Rule execution finished', {
labels: {
ruleType: 'esql',
ruleId: rule.id,
spaceId: spaceId,
},
tags: ['rule-run'],
});
运维人员随后即可针对该流量进行定位
logging:
loggers:
- name: plugins.myPlugin
level: warn
filters:
- type: meta
match:
labels.ruleType: esql
level: debug
指南
- 建议使用嵌套的
labels对象({ labels: { ruleType: 'esql' } }),以便labels.ruleType等过滤器路径能够匹配。扁平键({ 'labels.ruleType': 'esql' })也有效,但请选择一种格式并保持一致。 - 匹配采用严格相等原则——请勿在同一字段中混用字符串和数字类型。
- 不要在过滤器可能引用的元数据字段中放入密钥或个人身份信息(PII);因为即使经过过滤,记录仍会携带完整的元数据到达追加器。
logger.isLevelEnabled('debug')会忽略元数据过滤器。如果您需要控制昂贵的消息构造,请传递一个消息函数(logger.debug(() => expensive(), meta)),或者在调用时始终传递元数据,以便过滤器能够进行判断。
关于元数据中应包含什么的编辑指导,请参阅 日志记录指南。