@electron-forge/multi-logger

中文文档
8.0.1发布于 2026/09/30MITTypeScriptES Module构建来源已验证近 30 天下载 109.9万

在终端中以标签方式显示多个日志流

中文使用文档
文档目录7 节
  1. 使用量
  2. API 密码
  3. new Logger(options?)
  4. 共享一个数据包
  5. Tab
  6. 交互式用户界面
  7. 普通模式

多调试器

在终端中以标签方式显示多个日志流

本模块收集多个逻辑上分离的日志流 ("tabs") 和 使其进入终端,进程已经进入。 附上时 到交互式终端,它绘制一个全屏制表UI 墨迹; 否则( CI, 有管输出) 返回到带有有色标记的仅附加行前缀。 线条可能包含 ANSI的造型,所以任何在终端能制成的东西都可以被接入.

使用量

import Logger from '@electron-forge/multi-logger';

const logger = new Logger({ title: 'My tool' });

const serverTab = logger.createTab('Server');
const frontEndTab = logger.createTab('Front End');

// Everything logged before start() is buffered and shown once rendering begins.
serverTab.setStatus({ state: 'building' });
serverTab.log('listening on :3000');
serverTab.setStatus({ state: 'success', durationMs: 1200 });

// Pipe a child process's stdout/stderr into a tab of its own.
logger.attachProcess(spawn('node', ['server.js']), 'Server');

await logger.start();

// Later: restore the terminal. Safe to call more than once, and it also runs
// on process exit so a crash never leaves the terminal in the alternate screen.
logger.stop();

API 密码

new Logger(options?)

选项说明
stdout顺流而上 默认为 process.stdout。 。 。 .
stdin流到读取密钥 。 默认为 process.stdin。 。 。 .
interactive是否使用带有标签的 UI 。 默认为 stdout.isTTY && stdin.isTTY && !process.env.CI。 。 。 .
forceMode'ink' 或者说 'plain' 绕过检测.
title在标签栏左侧显示文本 .
keys额外的热门, { key, label, onPress },在页脚上列出.
maxLines每分页保留行(并用于合并视图). 默认为5000.
initialTab首先显示标签的名称,或 'all' 用于合并视图。 第一个标签的默认值 .
errorSwitchDebounceMs自动切换到失败的标签之间的最小间隔 。 默认为 15000.
  • logger.createTab(name) 返回 a Tab。 。 。 .
  • logger.getTab(name) 编号 : logger.getTabs()。 。 。 .
  • logger.attachProcess(child, name = 'App') 给孩子管子 stdout 财务报告和审定财务报表 stderr 输入分行的分页,并在分页结束时标出分页. 同名的标签被再用,所以一个重新启动的进程会保留其标签. 当孩子离开时, Stdin 会被放回原始模式,以防孩子死亡 继承了终端,并在出站途中重新设置(节点嵌入器等) 电能做); logger.reassertRawMode() 按要求做同样的事情.
  • logger.start() 开始渲染 在此之前,一切被缓冲.
  • logger.stop() 卸载 UI并恢复终端。 如果UI从不 将缓冲行作为纯文本写入 无所失也.
  • logger.extendOptions({ keys?, title?, initialTab? }) 添加选项 日志创建方式: extra keys (已绑定的密钥已离开) (b) 单独审议) title 编号 : initialTab 当还没有确定的时候。 它没有影响 一次乌伊 start() 已被调用.

共享一个数据包

一个进程只能明智地绘制一个 UI, 所以一个主机和运行中的插件 内部应该共享一个日志,而不是各自创建自己的日志:

import { ensureSharedLogger } from '@electron-forge/multi-logger';

// The host creates it. The first caller decides how it is set up…
const logger = ensureSharedLogger({ title: 'My tool', initialTab: 'App' });

// …and a plugin, later, just adds a tab to it.
const tab = ensureSharedLogger().createTab('Bundler');
  • ensureSharedLogger(options?) 返回全进程日志,创建它 在第一个呼叫。 以后的电话 options 通过下列方式合并: extendOptions(): 额外 keys 添加, title 编号 : initialTab 被带入 惟有尚未确定,其他一切被忽略.
  • getSharedLogger() 返回,或 undefined 如果没有人创建.
  • resetSharedLogger() 忘记它而不阻止它; 意在测试.

案件登记如下: Symbol.for('@electron-forge/multi-logger') 打开 globalThis,因此,甚至两本这个包在一个 node_modules 树 最终分享它.

Tab

  • tab.log(text) 附加文本,其中可能包含多行和ANSI颜色.
  • tab.setStatus({ state, errors?, warnings?, durationMs?, detail? }) 地点 state 这是其中之一 idle, (中文(简体) ), building, (中文(简体) ), success, (中文(简体) ), warning, (中文(简体) ), error 或者说 exited。状态显示在标签名称旁边.
  • tab.clear() 空出标签的缓冲.

交互式用户界面

Electron Forge · webpack  1 Main Process ✔ 1.2s  2 Renderer (web) ⠹  3 Preload (electron-preload) ✖ 2  4 App ●  a All
────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────
… the active tab's most recent lines, wrapped to the terminal width …
←/→ 1-9 tabs · a all · r restart electron · c clear · f follow · ↑/↓ scroll · q quit
密钥行动
← 编号 : →, (中文(简体) ), Tab 编号 : Shift+Tab通过标签循环
1 改为 9跳转到标签
a按到达顺序合并每个标签的视图, 并用标签标记
↑ 编号 : ↓, (中文(简体) ), PgUp 编号 : PgDn通过缓冲器回滚( 停止在后面)
Home 编号 : End跳到最古老的一行/ 回到尾端
f跟踪尾巴切换
c清除当前标签( 或合并视图中的每个标签)
q, (中文(简体) ), Ctrl+C恢复终端并重新提升 SIGINT
自定义 keys不论东道主注册什么,例如:. r 要重新启动

标签栏总是适合终端:当它被紧紧的长度和 数数先去,然后标题, 最后芯片包装到更多的行. 当标签状态变为 error 视图最多每一次 errorSwitchDebounceMs,因此一系列失败不会与用户对抗.

UI使用终端的可换显示屏,所以无论之前打印过什么 start() 退出时仍在回滚中,并打印出一行 每个标签的状态( 加上以出错结束的任何标签的尾部) 出来.

因为墨水将 stdin 输入到原始模式中, 以行为基础的输入如打字 rs 在 UI 启动时, 主机进程未看到; 主机应当注册 等同的热键通过 keys 换句话说.

普通模式

当stdout或stdin不是TTY,或 CI 设定, 线条按写 到达 :

[Main Process]   asset index.js 1.2 KiB [emitted] (name: main)
[Main Process]   ✔ compiled in 1.2s
[Renderer (web)] ✖ failed with 1 error in 2.1s

版本与发布记录

@electron-forge/multi-logger 共发布 3 个版本,首次发布于 2026/09/29;过去 12 个月发布了 3 个版本。最新版本附带 npm provenance 构建来源证明,可追溯到公开的 CI 构建记录。

版本发布日期距今
8.0.1latest2026/09/301 个月前
8.0.02026/09/301 个月前
0.0.02026/09/291 个月前

关于 @electron-forge/multi-logger 的常见问题

@electron-forge/multi-logger 是什么?

在终端中以标签方式显示多个日志流

如何安装 @electron-forge/multi-logger?

在项目目录运行 npm install @electron-forge/multi-logger,或使用 pnpm add / yarn add / bun add。

@electron-forge/multi-logger 支持 TypeScript 吗?

支持。包内自带 TypeScript 类型声明(package.json 声明了 types 入口),安装后即可获得类型提示,无需再安装 @types 包。

@electron-forge/multi-logger 支持 ESM 还是 CommonJS?

以 ES Module 形式发布,推荐使用 import 引入。在 CommonJS 项目中,Node.js 20.19+ / 22.12+ 可以直接 require() 不含顶层 await 的 ES Module,更早的版本需要改用动态 import()。

@electron-forge/multi-logger 需要什么版本的 Node.js?

package.json 的 engines 字段要求 Node.js >= 22.13.0。版本不符时 npm 默认只给出警告,开启 engine-strict 后会拒绝安装。

@electron-forge/multi-logger 可以商用吗?

@electron-forge/multi-logger 使用 MIT 许可。宽松许可:允许商业使用、修改和再分发,通常只需在分发时保留原版权与许可声明。以上为概括,不构成法律意见,请以许可原文为准。

@electron-forge/multi-logger 的下载量有多少?

根据 npm 官方下载统计,@electron-forge/multi-logger 在 2026/10/14 – 2026/11/12 这 30 天内被下载 1,098,895 次,日均约 36,630 次。下载量会把 CI 构建、镜像同步和作为其他包依赖的安装一并计入,适合横向比较热度,不能直接等同于使用人数。

@electron-forge/multi-logger 还在维护吗?

最新版本 8.0.1 发布于 2026/09/30(1 个月前);至今共发布 3 个版本,其中过去 12 个月发布了 3 个;首次发布于 2026/09/29。发布频率只是参考信号:功能稳定的工具可能很少需要更新,建议结合源码仓库的 issue 和提交记录判断。