ARTICLE DETAIL

资讯详情

深耕网站视觉设计与运营推广的一线实战洞察。

NocoBase RunJS 中 ctx.logger 详解:基于 pino 的结构化 JSON 日志实践

NocoBase RunJS 中 ctx.logger 详解:基于 pino 的结构化 JSON 日志实践 NocoBase RunJS 中 ctx.logger 详解基于 pino 的结构化 JSON 日志实践【免费下载链接】nocobaseNocoBase is an open-source AI no-code platform for building business systems fast. Instead of generating everything from scratch, AI works on top of production-proven infrastructure and a WYSIWYG no-code interface, so you get both speed and reliability.项目地址: https://gitcode.com/GitHub_Trending/no/nocobasectx.logger是 NocoBase RunJS流式引擎 / Flow Engine为脚本执行上下文注入的日志实例它基于 pino 封装提供fatal、error、warn、info、debug、trace六级分级输出与结构化 JSON 日志能力。本文面向在 RunJS 节点中编写调试逻辑的开发者读完即可掌握ctx.logger的类型来源、级别语义、推荐写法、子 logger 用法以及它与console的对应关系从而在调试、错误追踪与性能分析中产出可采集、可检索的高质量日志。ctx.logger 是什么ctx.logger是 RunJS 执行上下文中可直接使用的日志对象类型定义为logger: pino.Logger;它并非独立创建的日志实例而是engine.logger.child({ module: flow-engine })即带module: flow-engine上下文的 pino 子 logger。这意味着所有通过ctx.logger输出的日志都会自动携带module字段便于在采集端按模块维度过滤与聚合。这一实现可以直接在源码中验证在 flowContext.ts 中RunJS 上下文通过defineProperty(logger, ...)定义了该属性其 getter 返回this.engine.logger.child({ module: flow-engine })。也就是说ctx.logger本质上是引擎根 logger 的一个带固定上下文的子实例。底层根 logger 的初始化位于 flowEngine.tsFlowEngine构造函数中直接调用pino({...})创建实例并配置了浏览器端的write回调将各级别日志分别映射到console.trace/console.error/console.warn/console.info/console.debug/console.trace因此在浏览器环境下ctx.logger的输出会以对应 console 方法呈现。适用场景所有 RunJS 场景均可使用ctx.logger典型用途包括调试在脚本执行过程中输出变量值、分支走向、中间计算结果错误追踪捕获异常时输出错误对象与关键上下文便于复现与定位性能分析记录耗时指标如接口调用、区块加载时长辅助定位性能瓶颈。RunJS 上下文中 logger 的元数据定义含info、warn、error、debug等方法及代码补全片段可以在 runjs-context/contexts/base.ts 中找到编辑器提示中的示例写法为ctx.logger.info({ foo: 1 }, message)。日志级别pino 支持从高到低六个级别对应方法及语义如下级别方法说明fatalctx.logger.fatal()致命错误通常导致进程退出errorctx.logger.error()错误表示请求或操作失败warnctx.logger.warn()警告表示潜在风险或异常情况infoctx.logger.info()一般运行时信息debugctx.logger.debug()调试信息用于开发tracectx.logger.trace()详细追踪用于深度诊断关于级别阈值引擎有一个值得注意的实现细节在 flowEngine.ts 中根 logger 的级别由getFlowEngineLoggerLevel()决定——NODE_ENV production时级别为warn否则为trace。也就是说生产环境下debug、trace级别的日志会被 pino 直接过滤掉而不产生输出因此生产排障时应以warn及以上级别作为主要依据而debug/trace更适合在开发期使用。推荐写法推荐使用level(msg, meta)形式消息在前可选元数据对象在后。ctx.logger.info(区块加载完成); ctx.logger.info(操作成功, { recordId: 456 }); ctx.logger.warn(性能警告, { duration: 5000 }); ctx.logger.error(操作失败, { userId: 123, action: create }); ctx.logger.error(请求失败, { err });pino 也支持另外两种形式可按需使用level(meta, msg)对象在前如ctx.logger.info({ userId: 123 }, 操作成功)level({ msg, ...meta })单个对象将消息与元数据合并如ctx.logger.error({ msg: 请求失败, err })。注意err这类 Error 对象直接作为元数据传入时pino 会自动序列化其message、stack等字段是记录异常信息的标准做法。示例基本用法ctx.logger.info(区块加载完成); ctx.logger.warn(请求失败使用缓存, { err }); ctx.logger.debug(正在保存, { recordId: ctx.record?.id });使用 child() 创建子 logger当一段脚本内部有多个步骤时可以用child()派生带额外上下文的子 logger所有子日志都会自动带上该上下文// 为当前逻辑创建带上下文的子 logger const log ctx.logger.child({ scope: myBlock }); log.info(执行步骤 1); log.debug(执行步骤 2, { step: 2 });子 logger 同样推荐level(msg, meta)写法。这在引擎内部也是通用模式——ctx.logger本身就是根 logger 的 child执行器 FlowExecutor.ts 中通过const logger model.context.logger;取用该实例并在事件分发出错时以logger.error({ err }, BaseModel.dispatchEvent: Start hook error ...)的形式记录错误与本文推荐写法完全一致。与 console 的关系推荐直接使用ctx.logger以获得结构化 JSON 日志。若已习惯使用console可按如下方式对应迁移consolectx.loggerconsole.logctx.logger.infoconsole.errorctx.logger.errorconsole.warnctx.logger.warn日志格式pino 输出结构化 JSON每条日志包含以下字段level日志级别数字pino 内部以数值表示time时间戳毫秒msg日志消息module固定为flow-engine由child({ module: flow-engine })注入其他自定义字段通过元数据对象传入的任意键值。结构化 JSON 带来的直接收益是可采集、可检索、可分析日志系统可直接按字段解析按module过滤模块按level分级告警按自定义字段如recordId、userId、duration进行关联查询这是裸console文本输出难以做到的。注意事项日志为结构化 JSON适合对接日志采集与检索系统尽量在脚本中避免输出非结构化的大段文本通过child()创建的子 logger 同样推荐level(msg, meta)写法保持日志风格统一部分运行环境如工作流可能使用不同的日志输出方式具体以运行环境实际表现与日志配置为准生产环境NODE_ENVproduction下默认日志级别为warndebug/trace输出会被过滤依赖它们排查生产问题时需先确认运行环境日志级别配置浏览器端运行 Flow Engine 时pino 的写入会桥接到 console 系列方法因此浏览器控制台仍可直观查看分级日志。相关阅读RunJS 入门与上下文整体说明RunJS 文档索引上下文核心实现flowContext.ts引擎根 logger 初始化与级别逻辑flowEngine.ts执行器中的日志实践FlowExecutor.ts底层日志库pino高性能 Node.js 结构化日志库ctx.logger即其封装【免费下载链接】nocobaseNocoBase is an open-source AI no-code platform for building business systems fast. Instead of generating everything from scratch, AI works on top of production-proven infrastructure and a WYSIWYG no-code interface, so you get both speed and reliability.项目地址: https://gitcode.com/GitHub_Trending/no/nocobase创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
返回列表