跳转到内容

核心概念

三个想法几乎能解释 Logaria 的全部行为:两种过滤模式、谁拥有作用域,以及为什么运行时——而不是打包工具——才是唯一真理来源。本页就是各个操作指南默认你已经掌握的模型。

级别模式与规则模式

Logaria 在两种模式之一下过滤,而判断你处于哪种模式的规则很简单:

如果解析后的配置有条规则,你处于 级别模式;如果有一条或更多,你处于规则模式

ts
// 级别模式——`levels` 就是允许列表。
setLoggerConfig({ levels: ['warn', 'error'] });

// 规则模式——一条规则就把配置变成聚焦的允许列表。
setLoggerConfig({
  levels: ['warn', 'error'],
  rules: {
    'build-flow': { group: 'build.pipeline', levels: ['info', 'warn'] },
  },
});

两种模式在每个关键点上都不同:

级别模式(无规则)规则模式(≥ 1 条规则)
过滤依据全局 levels 允许列表规则匹配(main / group / message该规则的有效级别
未命中的日志不适用丢弃——没有回退到 levels
levels 的角色允许列表本身规则中 levels: 'inherit' 的默认值
logger.debug()仅当 debug: true 时显示始终被屏蔽
debug: true 额外做显示 debug() + 附加耗时仅给非 debug 日志加 [label] 前缀 + 耗时

INFO

空的 rules 对象,或全部设为 'off' 的规则,会被规范化为没有规则——因此配置仍处于级别模式。

一条日志如何被决定

当你调用一个日志器方法时,Logaria 按固定顺序决定可见性:

  1. 解析配置。 plugins 注册规则模板 → extends 启用具名预设配置 → rules 作为最后一层覆盖。
  2. 检查是否有规则。 解析后没有规则就走级别模式,否则走规则模式。
  3. 级别模式——日志的级别在 levels 里就显示,否则屏蔽。
  4. 规则模式——保留作用域命中该日志的规则(main 精确;group / message 精确或 glob)。其中,有贡献的规则是那些有效级别包含此日志级别的规则。只要存在至少一条有贡献的规则,日志就显示。
  5. 有效级别:规则若设了 rule.levels 就用它,否则用配置的 levels,再否则用内置默认(['info', 'success', 'warn', 'error'])。

debug 模式下显示的标签只来自有贡献的规则——一条命中作用域但级别不符的规则,既不显示日志也不贡献标签。

匹配

main 精确匹配——即便取值含 * 也按字面处理。groupmessage 也默认精确匹配,除非它们含有 glob 字符(*?[]{}),此时升级为 glob 匹配。

两种模式下的 Debug

debug 是唯一一个含义随模式而变的开关:

  • 级别模式——debug: true 显示 logger.debug() 输出,并给传入耗时选项的可见非 debug 日志附加耗时。
  • 规则模式——logger.debug() 始终被屏蔽,即便 debug: true 也一样。该标志只给规则放行的非 debug 日志加上命中的 [label] 前缀与耗时;永远不会显示 debug()

因此只要解析出任意规则,logger.debug() 就会沉默。如果你需要在规则下输出诊断信息,把它提升到 info,或加一条专门针对它的规则。见 运行时配置 — Debug 模式 了解级别模式开关,以及 规则与预设 了解规则模式。

归属与作用域

每个日志器都从一个作用域读取配置。只有一个默认作用域,外加任意数量的显式作用域,而默认作用域的归属是排他的。

状态所有者入口行为
默认作用域,应用拥有应用logariasetLoggerConfig / resetLoggerConfig 设置配置
默认作用域,插件受控构建插件logaria + logaria/plugin配置以构建期常量注入;运行时改写函数抛错
显式作用域宿主集成logaria/core创建作用域日志器前先用 setScopedLoggerConfig 注册

插件控制下,调用运行时改写函数会抛出(原文):

logaria is controlled by loggerPlugin.vite({ config }). setLoggerConfig(...) and resetLoggerConfig() cannot be used in this runtime; update the loggerPlugin.vite({ config }) option in your bundler config instead.

显式作用域永不触碰默认作用域。createScopedLogger() 要求其作用域先被注册,缺失时抛错——Logaria 拒绝悄悄回退到默认作用域。

同一时间只有一个所有者

默认作用域同一时间只有一个所有者。传递依赖绝不应调用 setLoggerConfig——它应当注册显式作用域,这样就无法悄悄改向或静音应用的日志。

原因见 为什么是 Logaria — 为什么强调显式归属;用法见 作用域集成

运行时始终是唯一真理

运行时过滤是“什么会输出”的唯一真理来源。构建插件是叠加在其上的优化:它在构建期执行与运行时相同的屏蔽判断,只删除它能证明已经是死代码的调用。

由此得到两条性质:

  • 关掉插件,哪些日志会输出不会改变。 裁剪移除的本就是永远过不了过滤的调用。
  • 两者不会漂移。 插件控制下运行时改写函数会抛错,因此“插件裁掉的”与“运行时允许的”出自同一份配置。

裁剪是保守的

只有当每条静态事实都成立时才移除调用:命名且无别名的 createLogger 导入、字面量 main / group / message、从未被重新赋值的绑定、独立语句,以及开启了 treeshake: true 的构建上下文。任何动态写法都会留在打包产物中并回退到运行时过滤。见 构建插件 — 裁剪覆盖范围

下一步阅读

根据 MIT 许可证发布。 (0463eff)