CMS后端前端【免费下载链接】webiny-jsOpen-source, self-hosted CMS platform on AWS serverless (Lambda, DynamoDB, S3). TypeScript framework with multi-tenancy, lifecycle hooks, GraphQL API, and AI-assisted development via MCP server. Built for developers at large organizations.项目地址https://gitcode.com/gh_mirrors/we/webiny-js点击查看免费下载本篇技术指南聚焦 Webiny 开源仓库中的一条核心编码规范——后端api-*代码严禁使用console.log/console.warn/console.error必须通过依赖注入DI获取Logger并输出结构化日志。这条规范源自仓库 no-console-in-backend.md适用于所有基于api-*系列包构建的 GraphQL API、事件处理器与后台任务。读完本文你将掌握 DI Logger 的注入方式、pino 结构化日志的调用约定、日志级别与环境变量控制并能直接在业务代码中替换掉所有console.*调用。一、规范原文为什么后端禁止console.*仓库 no-console-in-backend.md 给出的规则非常明确Never useconsole.log/console.warn/console.errorin backend (api-*) code. Use the DI logger.即在任何api-*包如api-core、api-headless-cms、api-website-builder、api-aco、api-file-manager等的后端代码中一律不得使用console.log/console.warn/console.error取而代之的是通过依赖注入获得的Logger。该规则文件给出的正反示例是// Good —— 结构化上下文作为第一个参数 logger.warn({ error }, message); // Bad —— console 混入非结构化输出 console.warn(message, error);需要说明的是该规范约束的对象是后端api-*代码这与仓库中另一条 no-console-in-backend 相关代码风格体系 所强调的“分层职责”一致后端日志需要进入统一的日志管道AWS Lambda CloudWatch而不是直接打印到进程标准输出。二、DI Logger 从哪来webiny/api-core/features/logger的结构规范指定的注入来源是webiny/api-core/features/logger。从源码看该模块位于 packages/api-core/src/features/logger由四个文件组成构成“抽象 实现 特性注册”的标准 DI 结构abstractions.ts定义ILogger接口并导出抽象Logger通过createAbstraction创建。LoggerService.tsLoggerImpl实现类底层封装 pino。feature.tsLoggerFeature负责把Logger注册进 DI 容器。index.ts对外导出Logger抽象。因此规范中写的Inject Logger (from webiny/api-core/features/logger)指的正是导入 index.ts 导出的Logger抽象并在构造函数参数中声明该依赖。2.1 接口提供的完整日志级别abstractions.ts 中ILogger接口定义了完整的日志方法每个方法签名统一为(objOrMsg: object | string, ...args: any[])trace(objOrMsg, ...args); // 最细粒度用于追踪 debug(objOrMsg, ...args); // 调试信息 info(objOrMsg, ...args); // 常规信息 warn(objOrMsg, ...args); // 警告 error(objOrMsg, ...args); // 错误 fatal(objOrMsg, ...args); // 致命错误 log(objOrMsg, ...args); // 通用日志内部默认映射到 info规范中强调的logger.info/warn/error(...)均在此列且统一遵循“第一个参数可传结构化对象后续参数为辅助信息”的 pino 约定。2.2 注入方式构造器依赖 DI 容器注册Logger通过createImplementation与createFeature接入 Webiny 的 DI 体系见 LoggerService.ts 与 feature.ts// LoggerService.ts export const Logger createImplementation({ abstraction: LoggerAbstraction, implementation: LoggerImpl, dependencies: [] });// feature.ts export const LoggerFeature createFeature({ name: LoggerFeature, register(container) { container.register(Logger); } });因此在后端代码如某个 Resolver、Service 或 Presenter 中使用时只需要在构造函数参数里声明Logger依赖即可import { Logger } from webiny/api-core/features/logger; class MyService { constructor(private readonly logger: Logger) {} // 业务方法中直接调用 this.logger.info(...) / this.logger.warn(...) }仓库中可找到真实的消费示例例如 ApiKeyAuthenticator.ts 中即以依赖注入方式使用logger输出认证相关日志印证了“通过构造器拿到 logger再调用logger.info/warn/error”这一标准用法。三、底层实现pino 驱动的结构化日志规范中提到It is pino-backed这一点在 LoggerService.ts 中得到完整印证import { type Logger as PinoLogger, pino } from pino; import { pinoLambdaDestination, StructuredLogFormatter } from pino-lambda; export class LoggerImpl implements LoggerAbstraction.Interface { private pinoLogger: PinoLogger; constructor() { const level this.getLogLevel(); const destination pinoLambdaDestination({ formatter: new StructuredLogFormatter() }); this.pinoLogger pino({ level }, destination); } // trace / debug / info / warn / error / fatal / log 均委托给 pinoLogger 对应方法 }要点拆解pino 核心所有日志方法trace到fatal最终都委托给内部的 pino logger因此天然支持 JSON 结构化输出、多级过滤与低开销。pino-lambda 目标日志目的地使用pino-lambda的pinoLambdaDestinationStructuredLogFormatter这是为 AWS Lambda 运行环境设计的日志管道源码注释也说明pino-lambda目前是硬编码选择原因是其初始化依赖 Lambda 函数上下文后续若有更好的基础设施会重构。日志级别可配置getLogLevel()读取环境变量WEBINY_API_LOG_LEVEL缺省时回落到infoconst DEFAULT_LOG_LEVEL info; private getLogLevel() { return process.env.WEBINY_API_LOG_LEVEL || DEFAULT_LOG_LEVEL; }这解释了“为什么默认看不到debug/trace日志”默认级别是info。若需要更详细的后端日志可通过部署环境变量WEBINY_API_LOG_LEVEL设置为debug或trace可接受 pino 标准的级别值而不必修改任何业务代码。四、正确写法结构化上下文作为第一个参数规范给出的“Good / Bad”对比本质上是 pino 的两种调用形式// Good第一个参数传结构化对象 { error }pino 会将其序列化为 JSON 字段 logger.warn({ error }, message); // Badconsole 把对象塞进第二个位置输出既非结构化也绕过了日志管道 console.warn(message, error);在实际业务中推荐把错误对象、请求 ID、租户 ID、资源 ID 等上下文放进第一个对象参数人可读的说明文字放第二个字符串参数// 常规信息 logger.info({ tenant, entryId }, Content entry published); // 错误场景同时携带错误对象与说明 logger.error({ error, entryId }, Failed to publish content entry); // 调试需要时通过 WEBINY_API_LOG_LEVELdebug 打开 logger.debug({ userId }, Resolving user permissions);这样每行日志都能被 CloudWatch / 日志平台按字段检索而不是靠正则去抠字符串。五、何时不受此规范约束需要澄清边界本规范针对的是后端api-*代码。前端/管理端应用app-*系列包或浏览器端代码并不在此规则管辖范围内它们可以使用各自的日志机制。另外仓库中与日志相关的其他基础设施如packages/logger包也面向不同场景不应与本规范中的api-coreDI Logger 混为一谈。判断标准很简单只要代码位于api-*包内就用webiny/api-core/features/logger的Logger。六、落地检查清单在后端代码提交前可对照以下清单自查代码中是否残留console.log/console.warn/console.error—— 应全部替换。是否通过构造器注入了Logger来自webiny/api-core/features/logger—— 应通过 DI 获取而非new LoggerImpl()。日志调用是否遵循(objOrMsg, ...args)签名把结构化上下文放第一个参数是否需要输出debug/trace级别—— 不修改代码直接通过环境变量WEBINY_API_LOG_LEVEL控制。遵循这条规范后端日志将统一进入 pino pino-lambda 的结构化管道级别可控、字段可查也更利于在 AWS Lambda 环境下观测与排障——这正是 no-console-in-backend.md 想要达成的目标。赞分享CMS后端前端【免费下载链接】webiny-jsOpen-source, self-hosted CMS platform on AWS serverless (Lambda, DynamoDB, S3). TypeScript framework with multi-tenancy, lifecycle hooks, GraphQL API, and AI-assisted development via MCP server. Built for developers at large organizations.项目地址https://gitcode.com/gh_mirrors/we/webiny-js点击查看免费下载相关推荐Webiny api-core 与后端特性参考手册基于 core-features-reference 的导入路径、抽象类型与实战用法全解析Webiny api core 与后端特性参考手册基于 core features reference 的导入路径、抽象类型与实战用法全解析 WebinywCMS后端前端CocoaLumberjack 按 Logger 独立设置日志级别Per-Logger Log Levels实战指南CocoaLumberjack 按 Logger 独立设置日志级别Per Logger Log Levels实战指南 导读 CocoaLumberjack开发工具Webiny 后端开发指南基于 Feature 的 Clean Architecture 与类型安全 DI 实践Webiny 后端开发指南基于 Feature 的 Clean Architecture 与类型安全 DI 实践 导读 本指南是 Webiny开源、可自托管CMS后端前端创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考