演示

日志注解

用 @InjectBuiltinLogger / @InjectLogger 注入平台日志。仅支持属性注入;勿记录敏感数据。

用法

仅支持属性注入 — 切勿把日志装饰器放到构造函数参数上。宿主类必须由 DI 管理(@Service 或已注册到模块的 @Controller)。

  • 记录重要操作与生命周期事件(seed、任务、卸载清理等)
  • 错误日志保留足够上下文(id、插件名)— 不要打印含机密的完整请求体
  • 切勿记录密码、令牌、API Key 等敏感字段
  • 优先使用 @InjectBuiltinLogger,避免自行封装 console
  • 面向用户的管理操作请配合 @AuditLogMiddleware
TSXservice
1import { InjectBuiltinLogger, Service } from "@quan-erp/shared-backend-core"; 2import type { Loggable } from "@quan-erp/shared-backend-core"; 3 4@Service() 5export class OrderService { 6 @InjectBuiltinLogger() 7 logger: Loggable; 8 9 async create() { 10 this.logger.log("Creating order"); 11 // … 12 this.logger.log("Order created"); 13 } 14}
TSXseed feedback
1import { 2 InjectBuiltinLogger, 3 OnInit, 4 Service, 5} from "@quan-erp/shared-backend-core"; 6import type { Loggable } from "@quan-erp/shared-backend-core"; 7 8@Service() 9export class SeedService { 10 @InjectBuiltinLogger() 11 logger: Loggable; 12 13 @OnInit() 14 async init() { 15 if (alreadySeeded) { 16 this.logger.log("Seeding skipped (already initialized)"); 17 return; 18 } 19 // … seed … 20 this.logger.log("Module seeded successfully"); 21 } 22}

内置日志

@InjectBuiltinLogger() 是 @InjectLogger(BuiltinLogger) 的简写。属性类型可声明为 Loggable(或 BuiltinLogger)。可用于服务与控制器。

  • @InjectBuiltinLogger() — 注入平台 BuiltinLogger
  • 从 @quan-erp/shared-backend-core 导入
  • 日志信息保持简短且便于搜索(包含插件名/任务名)
TSXbuiltin
1import { 2 BuiltinLogger, 3 InjectBuiltinLogger, 4 InjectLogger, 5 Service, 6} from "@quan-erp/shared-backend-core"; 7import type { Loggable } from "@quan-erp/shared-backend-core"; 8 9@Service() 10export class OrderService { 11 @InjectBuiltinLogger() 12 logger: Loggable; 13 14 // equivalent 15 @InjectLogger(BuiltinLogger) 16 builtinLogger: BuiltinLogger; 17}

创建自定义日志

实现 Loggable,用 @Service() 标记并加入 @Module providers,再用 @InjectLogger(YourLogger) 注入。

  • 1. 编写实现 Loggable 的 @Service() 类
  • 2. 加入 @Module({ providers: [...] })
  • 3. 用属性 @InjectLogger(MyPluginLogger) 注入
TSXmy-plugin.logger.ts
1import { Service } from "@quan-erp/shared-backend-core"; 2import type { Loggable } from "@quan-erp/shared-backend-core"; 3 4@Service() 5export class MyPluginLogger implements Loggable { 6 private prefix = "[my-plugin]"; 7 8 log(message: string, ...args: unknown[]) { 9 console.log(this.prefix, message, ...args); 10 } 11 12 error(message: string, ...args: unknown[]) { 13 console.error(this.prefix, message, ...args); 14 } 15 16 warn(message: string, ...args: unknown[]) { 17 console.warn(this.prefix, message, ...args); 18 } 19}
TSXmodule providers
1import { Module } from "@quan-erp/shared-backend-core"; 2import { OrderController } from "./order.controller.js"; 3import { OrderService } from "./order.service.js"; 4import { MyPluginLogger } from "./my-plugin.logger.js"; 5 6@Module({ 7 name: "my-plugin", 8 providers: [OrderService, MyPluginLogger], 9 controllers: [OrderController], 10 entities: [], 11}) 12export class MyPluginModule {}
TSXinject & use
1import { InjectLogger, Service } from "@quan-erp/shared-backend-core"; 2import { MyPluginLogger } from "./my-plugin.logger.js"; 3 4@Service() 5export class OrderService { 6 @InjectLogger(MyPluginLogger) 7 logger: MyPluginLogger; 8 9 async create(orderId: string) { 10 this.logger.log(`Creating order ${orderId}`); 11 try { 12 // … 13 this.logger.log(`Order ${orderId} created`); 14 } catch (err) { 15 this.logger.error(`Failed to create order ${orderId}`, err); 16 throw err; 17 } 18 } 19}