用法
仅支持属性注入 — 切勿把日志装饰器放到构造函数参数上。宿主类必须由 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}