Demo

Logger

Service နှင့် controller များတွင် platform logger ကို property decorator ဖြင့် inject လုပ်ရပါသည်။ စံ BuiltinLogger အတွက် @InjectBuiltinLogger ကို ဦးစားပေးရပါသည်။

အသုံးပြုပုံ

Property injection သာ အသုံးပြုရပါသည် — logger decorator များကို constructor parameter ပေါ်တွင် မထားရပါ။ Host class သည် DI က စီမံသော class ဖြစ်ရမည်ဖြစ်ပြီး၊ @Service သို့မဟုတ် module တွင် မှတ်ပုံတင်ထားသော @Controller ဖြစ်ရပါသည်။

  • အရေးကြီးသော လုပ်ဆောင်ချက်များနှင့် lifecycle ဖြစ်ရပ်များကို log ရေးရပါသည် (seed ကျော်ခြင်း/ပြီးစီးခြင်း၊ job စတင်/ပြီးဆုံးခြင်း၊ uninstall ရှင်းလင်းမှု)
  • Debug လုပ်ရန် လုံလောက်သော context (id၊ plugin အမည်) ထည့်ရပါသည် — secret ပါသော request body အပြည့်ကို မရေးရပါ
  • စကားဝှက်၊ token၊ API key နှင့် အခြား ထိခိုက်လွယ်သော အချက်အလက်များကို မ log ရေးရပါ
  • ကိုယ်ပိုင် console wrapper မရေးဘဲ @InjectBuiltinLogger ကို ဦးစားပေးရပါသည်
  • အသုံးပြုသူမြင်ရသော admin လုပ်ဆောင်ချက်များအတွက် @AuditLogMiddleware နှင့် တွဲသုံးရပါသည် — logger သည် လုပ်ငန်းစဉ်/runtime စစ်ဆေးရန် ဖြစ်ပါသည်
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}

Builtin logger

@InjectBuiltinLogger() သည် @InjectLogger(BuiltinLogger) ၏ တိုတောင်းသော ပုံစံဖြစ်ပါသည်။ Property ကို Loggable သို့မဟုတ် BuiltinLogger အဖြစ် ကြေညာရပါသည်။ Service နှင့် controller နှစ်မျိုးလုံးတွင် အလုပ်လုပ်ပါသည်။

  • @InjectBuiltinLogger() — platform BuiltinLogger ကို inject လုပ်ပါသည်
  • @quan-erp/shared-backend-core မှ import လုပ်ရပါသည်
  • Message များကို တိုတောင်း၍ ရှာဖွေရလွယ်ကူအောင် ရေးရပါသည် (plugin/job အမည် ထည့်ပါ)
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}

ကိုယ်ပိုင် logger ဖန်တီးခြင်း

Loggable ကို implement လုပ်ပြီး @Service() တပ်ကာ plugin ၏ @Module providers တွင် စာရင်းသွင်းရပါသည်။ ထို့နောက် @InjectLogger(YourLogger) ဖြင့် inject လုပ်ရပါသည်။ စိတ်ကြိုက် ပုံစံ သို့မဟုတ် sink မလိုအပ်သ၍ BuiltinLogger ကိုသာ ဦးစားပေးရပါသည်။

  • ၁။ Loggable ကို implement လုပ်သော @Service() class ရေးရပါသည် (log / error / …)
  • ၂။ ထို class ကို @Module({ providers: [...] }) ထဲတွင် ထည့်ရပါသည်
  • ၃။ Property @InjectLogger(MyPluginLogger) ဖြင့် inject လုပ်ရပါသည် — constructor injection မသုံးရပါ
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}