{"version":3,"sources":["../src/shield.ts","../src/logger.ts","../src/decorator.ts","../src/index.ts"],"names":["ShieldField","str","strArr","Object","assign","l","length","start","end","res","slice","join","num","Math","floor","mo","startNum","endNum","repeat","ShieldLog","splat","fields","keyName","depth","maxDepth","size","Array","isArray","map","item","undefined","isError","message","has","cloneSplat","create","getPrototypeOf","key","keys","combine","timestamp","printf","format","LogLevelObj","defaultLoggerOpt","File","level","filename","handleExceptions","json","datePattern","maxSize","colorize","Console","Logger","logLevel","enableLog","emptyObj","logger","transports","logFilePath","sensFields","Set","baseLogDir","path","resolve","process","cwd","batchConfig","enabled","flushInterval","maxWaitTime","logBuffer","flushTimer","lastFlushTime","Date","now","isDestroyed","opt","env","LOGS_LEVEL","toLowerCase","LOGS_PATH","isTrueEmpty","createLogger","startBatchTimer","enable","b","getLevel","setLevel","getLogFilePath","setLogFilePath","f","safePath","validateLogPath","close","getSensFields","setSensFields","clearSensFields","clear","resetSensFields","destroy","stopBatchTimer","flushBatch","catch","e","console","error","enableBatch","setBatchConfig","config","wasEnabled","getBatchConfig","getBatchStatus","bufferSize","timeSinceLastFlush","logsToFlush","Promise","setImmediate","forEach","entry","writeLogEntry","clearInterval","setInterval","addToBuffer","name","args","logEntry","push","logName","toUpperCase","sanitizedArgs","arg","sanitizeInput","unshift","input","replace","logPath","Error","normalizedPath","normalize","includes","isAbsolute","resolvedPath","startsWith","test","Debug","printLog","debug","Info","info","Warn","warn","Fatal","exit","fatal","Log","log","writeLogAsync","reject","label","params","util","apply","stack","trans","DailyRotateFile","levels","defaultLoggerInstance","getDefaultLogger","LOG_DECORATOR_TYPE","customLoggerCache","WeakMap","getOrCreateCustomLogger","ctor","propertyName","get","Map","set","logPropertyWrapper","_originalDescriptor","target","String","privateKey","value","enumerable","configurable","storedPropertyManager","registerLogDecorator","propertyManager","registerWrapper","unregisterLogDecorator","createDualField","legacyHandler","tc39Handler","options","propertyKey","pm","registerDecorator","wrapperTypes","context","fieldName","addInitializer","proto","DefaultLogger"],"mappings":"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","file":"index.mjs","sourcesContent":["/*\n * @Description: \n * @Usage: \n * @Author: richen\n * @Date: 2021-11-04 20:31:43\n * @LastEditTime: 2023-01-08 14:50:16\n */\nimport * as helper from \"koatty_lib\";\n\n\nexport interface ShieldFieldRes {\n  res: string;\n  start: string;\n  end: string;\n}\n/**\n * ShieldField\n *\n * @export\n * @param {string} str\n * @returns {*}  {ShieldFieldRes}\n */\nexport function ShieldField(str: string): ShieldFieldRes {\n  const strArr = Object.assign([], str);\n  const l = strArr.length;\n  let start, end, res;\n  if (l <= 1) {\n    start = \"*\";\n    end = \"\";\n    res = \"*\";\n  } else if (l == 2) {\n    start = strArr.slice(1).join(\"\");\n    end = \"*\";\n    res = `${start}${end}`;\n  } else {\n    let num = Math.floor(l / 3);\n    const mo = Math.floor(l % 3);\n    let startNum = num;\n    if (mo > 0) {\n      num = num + 1;\n    }\n    if (startNum > 4) {\n      num = num + (startNum - 4);\n      startNum = 4;\n    }\n    const endNum = l - num - startNum;\n    if (endNum > 4) {\n      num = num + (endNum - 4);\n      // endNum = 4;\n    }\n    // console.log(startNum, num, endNum)\n    start = strArr.slice(0, startNum).join(\"\");\n    end = strArr.slice(num + startNum).join(\"\");\n    res = `${start}${\"*\".repeat(num)}${end}`;\n  }\n  return { res, start, end }\n}\n\n/**\n * ShieldLog\n *\n * @export\n * @param {*} splat\n * @param {Set<string>} fields\n * @param {string} [keyName]\n * @param {number} [depth=0] 递归深度\n * @param {number} [maxDepth=10] 最大递归深度\n * @returns {*}  {*}\n */\nexport function ShieldLog(splat: any, fields: Set<string>, keyName?: string, depth: number = 0, maxDepth: number = 10): any {\n  if (fields.size === 0) {\n    return splat;\n  }\n  if (!splat) return splat;\n\n  // 防止过深递归\n  if (depth > maxDepth) {\n    return '[Object: too deep]';\n  }\n\n  if (Array.isArray(splat)) {\n    // 使用map代替for循环，更简洁高效\n    return splat.map(item => ShieldLog(item, fields, undefined, depth + 1, maxDepth));\n  }\n\n  if (helper.isError(splat)) {\n    return splat.message;\n  }\n  if (typeof splat !== \"object\") {\n    if (fields.has(keyName || \"\")) {\n      return ShieldField(splat).res;\n    }\n    return `${splat}`;\n  }\n\n  // 优化对象克隆：使用Object.create保持原型链，避免constructor调用\n  const cloneSplat = Object.create(Object.getPrototypeOf(splat));\n\n  // 使用Object.keys代替for...in，避免原型链属性\n  for (const key of Object.keys(splat)) {\n    // 递归拷贝\n    cloneSplat[key] = ShieldLog(splat[key], fields, key, depth + 1, maxDepth);\n  }\n\n  return cloneSplat;\n}","/*\n * @Author: richen\n * @Date: 2020-11-20 17:40:48\n * @LastEditors: Please set LastEditors\n * @LastEditTime: 2024-10-31 16:30:52\n * @License: BSD (3-Clause)\n * @Copyright (c) - <richenlin(at)gmail.com>\n */\nimport * as helper from \"koatty_lib\";\nimport util from \"util\";\nimport { createLogger, format, transports, Logger as wLogger } from \"winston\";\nimport DailyRotateFile from \"winston-daily-rotate-file\";\nimport { BatchConfig, ILogger, LogEntry, LogLevelType, LogTrans } from \"./interface\";\nimport { ShieldLog } from \"./shield\";\nimport path from \"path\";\nconst { combine, timestamp, printf } = format;\n\nconst LogLevelObj: any = {\n  \"debug\": 7,\n  \"info\": 6,\n  \"warn\": 4,\n  \"error\": 3\n};\nexport interface LoggerOpt {\n  logLevel?: LogLevelType;\n  logFilePath?: string;\n  sensFields?: Set<string>;\n  batchConfig?: BatchConfig;     // 批量写入配置\n}\n\n// defaultLoggerOpt\nconst defaultLoggerOpt = {\n  File: {\n    level: \"info\",\n    filename: \"./logs/log.log\",\n    handleExceptions: true,\n    json: true,\n    datePattern: 'YYYY-MM-DD-HH',\n    // zippedArchive: true,\n    maxSize: '20m',\n    // maxFiles: '7d',\n    colorize: false,\n    timestamp: true\n  },\n  Console: {\n    level: \"debug\",\n    handleExceptions: true,\n    json: true,\n    colorize: true,\n    timestamp: true\n  }\n};\n\n/**\n * Logger\n *\n * @class Logger\n */\nexport class Logger implements ILogger {\n  // 日志级别\n  private logLevel: LogLevelType = \"debug\";\n  // 默认打开日志\n  private enableLog = true;\n  // 日志对象\n  private emptyObj: any = {};\n  private logger: wLogger;\n  private transports: LogTrans = {};\n  // 文件日志\n  private logFilePath = \"\";\n  // 脱敏字段\n  private sensFields: Set<string> = new Set();\n  // 基础日志目录，用于安全验证\n  private readonly baseLogDir = path.resolve(process.cwd(), \"logs\");\n\n  // 批量写入相关属性\n  private batchConfig: BatchConfig = {\n    enabled: false,\n    maxSize: 100,\n    flushInterval: 1000,      // 1秒\n    maxWaitTime: 5000         // 5秒\n  };\n  private logBuffer: LogEntry[] = [];\n  private flushTimer: NodeJS.Timeout | null = null;\n  private lastFlushTime: number = Date.now();\n  private isDestroyed: boolean = false;\n\n  /**\n   * Creates an instance of Logger.\n   * @param {LoggerOpt} [opt]\n   * @memberof Logger\n   */\n  constructor(opt?: LoggerOpt) {\n    const level = (process.env.LOGS_LEVEL || \"\").toLowerCase();\n    if (level && LogLevelObj[level] !== undefined) {\n      this.logLevel = <LogLevelType>level;\n    }\n\n    if (process.env.LOGS_PATH) {\n      this.logFilePath = process.env.LOGS_PATH;\n    }\n    if (!helper.isTrueEmpty(opt) && opt) {\n      this.logLevel = opt.logLevel ?? this.logLevel;\n      this.logFilePath = opt.logFilePath ?? this.logFilePath;\n      this.sensFields = opt.sensFields ?? this.sensFields;\n      \n      // 配置批量写入\n      if (opt.batchConfig) {\n        this.batchConfig = { ...this.batchConfig, ...opt.batchConfig };\n      }\n    }\n\n    this.logger = this.createLogger();\n    \n    // 如果启用批量写入，开始定时器\n    if (this.batchConfig.enabled) {\n      this.startBatchTimer();\n    }\n  }\n\n  /**\n   * enable\n   */\n  public enable(b = true) {\n    this.enableLog = b;\n  }\n\n  /**\n   * getLevel\n   */\n  public getLevel(): LogLevelType {\n    return this.logLevel;\n  }\n\n  /**\n   * setLevel\n   */\n  public setLevel(level: LogLevelType) {\n    this.logLevel = level;\n    if (this.transports.Console) {\n      this.transports.Console.level = level;\n    }\n    if (this.transports.File) {\n      this.transports.File.level = level;\n    }\n  }\n\n  /**\n  * getLogFilePath\n  */\n  public getLogFilePath() {\n    return this.logFilePath;\n  }\n\n  /**\n   * setLogFile\n   */\n  public setLogFilePath(f: string) {\n    // 验证路径安全性\n    const safePath = this.validateLogPath(f);\n    this.logFilePath = safePath;\n    this.logger.close();\n    this.logger = this.createLogger();\n  }\n\n  /**\n   * getSensFields\n   */\n  public getSensFields() {\n    return this.sensFields;\n  }\n\n  /**\n   * setSensFields\n   */\n  public setSensFields(fields: string[]) {\n    this.sensFields = new Set([...this.sensFields, ...fields]);\n  }\n\n  /**\n   * clearSensFields - 清理敏感字段，防止内存泄漏\n   */\n  public clearSensFields() {\n    this.sensFields.clear();\n  }\n\n  /**\n   * resetSensFields - 重置敏感字段为指定列表\n   */\n  public resetSensFields(fields: string[]) {\n    this.sensFields.clear();\n    this.sensFields = new Set(fields);\n  }\n\n  /**\n   * destroy - 销毁Logger实例，释放资源\n   */\n  public destroy() {\n    try {\n      this.isDestroyed = true;\n\n      // 停止批量写入定时器\n      this.stopBatchTimer();\n\n      // 异步刷新缓冲区，但不等待完成（避免阻塞销毁流程）\n      if (this.logBuffer.length > 0) {\n        this.flushBatch().catch(e => {\n          console.error('Error flushing logs during destroy:', e);\n        });\n      }\n\n      // 关闭winston logger\n      if (this.logger) {\n        this.logger.close();\n      }\n\n      // 清理内存引用\n      this.sensFields.clear();\n      this.transports = {};\n      this.enableLog = false;\n      this.logBuffer = [];\n    } catch (e) {\n      console.error('Error destroying logger:', e);\n    }\n  }\n\n  /**\n   * enableBatch - 启用/禁用批量写入\n   */\n  public enableBatch(enabled: boolean = true) {\n    if (enabled && !this.batchConfig.enabled) {\n      this.batchConfig.enabled = true;\n      this.startBatchTimer();\n    } else if (!enabled && this.batchConfig.enabled) {\n      this.batchConfig.enabled = false;\n      this.stopBatchTimer();\n      // 异步刷新剩余的日志\n      this.flushBatch().catch(e => {\n        console.error('Error flushing logs when disabling batch:', e);\n      });\n    }\n  }\n\n  /**\n   * setBatchConfig - 设置批量写入配置\n   */\n  public setBatchConfig(config: Partial<BatchConfig>) {\n    const wasEnabled = this.batchConfig.enabled;\n    this.batchConfig = { ...this.batchConfig, ...config };\n\n    // 如果配置改变，重新启动定时器\n    if (this.batchConfig.enabled && wasEnabled) {\n      this.stopBatchTimer();\n      this.startBatchTimer();\n    } else if (this.batchConfig.enabled && !wasEnabled) {\n      this.startBatchTimer();\n    } else if (!this.batchConfig.enabled && wasEnabled) {\n      this.stopBatchTimer();\n      this.flushBatch().catch(e => {\n        console.error('Error flushing logs when disabling batch via config:', e);\n      });\n    }\n  }\n\n  /**\n   * getBatchConfig - 获取批量写入配置\n   */\n  public getBatchConfig(): BatchConfig {\n    return { ...this.batchConfig };\n  }\n\n  /**\n   * getBatchStatus - 获取批量写入状态\n   */\n  public getBatchStatus() {\n    return {\n      enabled: this.batchConfig.enabled || false,\n      bufferSize: this.logBuffer.length,\n      maxSize: this.batchConfig.maxSize,\n      timeSinceLastFlush: Date.now() - this.lastFlushTime\n    };\n  }\n\n  /**\n   * flushBatch - 立即刷新批量写入缓冲区\n   */\n  public async flushBatch(): Promise<void> {\n    if (this.logBuffer.length === 0 || this.isDestroyed) {\n      return;\n    }\n\n    const logsToFlush = [...this.logBuffer];\n    this.logBuffer = [];\n    this.lastFlushTime = Date.now();\n\n    // 异步批量处理日志 - 避免阻塞主线程\n    return new Promise<void>((resolve) => {\n      setImmediate(() => {\n        try {\n          // 批量写入所有日志\n          logsToFlush.forEach(entry => {\n            this.writeLogEntry(entry);\n          });\n          resolve();\n        } catch (e) {\n          console.error('Error in batch flush:', e);\n          resolve(); // 即使出错也要resolve，避免阻塞\n        }\n      });\n    });\n  }\n\n  /**\n   * startBatchTimer - 启动批量写入定时器\n   */\n  private startBatchTimer() {\n    if (this.flushTimer) {\n      clearInterval(this.flushTimer);\n    }\n\n    this.flushTimer = setInterval(() => {\n      const now = Date.now();\n      const timeSinceLastFlush = now - this.lastFlushTime;\n\n      // 检查是否需要刷新（超时或缓冲区满）\n      if (this.logBuffer.length > 0 &&\n        (timeSinceLastFlush >= this.batchConfig.maxWaitTime! ||\n          this.logBuffer.length >= this.batchConfig.maxSize!)) {\n        // 异步刷新，不阻塞定时器\n        this.flushBatch().catch(e => {\n          console.error('Error in timer flush:', e);\n        });\n      }\n    }, this.batchConfig.flushInterval);\n  }\n\n  /**\n   * stopBatchTimer - 停止批量写入定时器\n   */\n  private stopBatchTimer() {\n    if (this.flushTimer) {\n      clearInterval(this.flushTimer);\n      this.flushTimer = null;\n    }\n  }\n\n  /**\n   * addToBuffer - 添加日志到缓冲区\n   */\n  private addToBuffer(level: LogLevelType, name: string, args: any[]) {\n    if (this.isDestroyed) {\n      return;\n    }\n\n    const logEntry: LogEntry = {\n      level,\n      name,\n      args,\n      timestamp: Date.now()\n    };\n\n    this.logBuffer.push(logEntry);\n\n    // 如果缓冲区达到最大大小，立即异步刷新\n    if (this.logBuffer.length >= this.batchConfig.maxSize!) {\n      this.flushBatch().catch(e => {\n        console.error('Error in immediate flush:', e);\n      });\n    }\n  }\n\n  /**\n   * writeLogEntry - 写入单个日志条目\n   */\n  private writeLogEntry(entry: LogEntry) {\n    try {\n      const { level, name, args } = entry;\n      const logName = name !== '' ? name.toUpperCase() : level.toUpperCase();\n\n      // 对输入参数进行安全过滤\n      const sanitizedArgs = args.map(arg => this.sanitizeInput(arg));\n\n      // format\n      sanitizedArgs.unshift(logName);\n\n      // 批量写入时直接调用winston（在批量刷新时已经是异步的）\n      this.logger[level](sanitizedArgs);\n    } catch (e) {\n      console.error('Error writing log entry:', e);\n    }\n  }\n\n  /**\n   * sanitizeInput - 过滤危险字符，防止日志注入\n   */\n  private sanitizeInput(input: any): any {\n    if (typeof input === 'string') {\n      // 移除控制字符和换行符，防止日志注入\n      return input.replace(/[\\r\\n\\t\\x00-\\x1f\\x7f]/g, ' ');\n    }\n    return input;\n  }\n\n  /**\n   * validateLogPath - 验证日志路径安全性\n   */\n  private validateLogPath(logPath: string): string {\n    if (!logPath) {\n      throw new Error('Log path cannot be empty');\n    }\n\n    const normalizedPath = path.normalize(logPath);\n\n    if (normalizedPath.includes('..')) {\n      throw new Error('Log path must not contain path traversal sequences');\n    }\n\n    if (!path.isAbsolute(normalizedPath)) {\n      const resolvedPath = path.resolve(this.baseLogDir, normalizedPath);\n      if (!resolvedPath.startsWith(this.baseLogDir)) {\n        throw new Error(`Relative log path must be within ${this.baseLogDir}`);\n      }\n      if (/[<>:\"|?*\\x00-\\x1f]/.test(normalizedPath)) {\n        throw new Error('Log path contains invalid characters');\n      }\n      return resolvedPath;\n    }\n\n    if (/[<>|?*\\x00-\\x1f]/.test(normalizedPath)) {\n      throw new Error('Log path contains invalid characters');\n    }\n\n    return normalizedPath;\n  }\n\n  /**\n   * log Debug\n   *\n   * @returns {*} \n   * @memberof Logger\n   */\n  public Debug(...args: any[]) {\n    return this.printLog(\"debug\", \"\", args);\n  }\n\n  /**\n   * debug\n   */\n  public debug(...args: any[]) {\n    return this.printLog(\"debug\", \"\", args);\n  }\n\n  /**\n   * log Info\n   *\n   * @returns {*} \n   * @memberof Logger\n   */\n  public Info(...args: any[]) {\n    return this.printLog(\"info\", \"\", args);\n  }\n\n  /**\n   * info\n   */\n  public info(...args: any[]) {\n    return this.printLog(\"info\", \"\", args);\n  }\n\n  /**\n   * log Warn\n   *\n   * @returns {*} \n   * @memberof Logger\n   */\n  public Warn(...args: any[]) {\n    return this.printLog(\"warn\", \"\", args);\n  }\n\n  /**\n   * warn\n   */\n  public warn(...args: any[]) {\n    return this.printLog(\"warn\", \"\", args);\n  }\n\n  /**\n   * log Error\n   * \n   * @returns {*} \n   * @memberof Logger\n   */\n  public Error(...args: any[]) {\n    return this.printLog(\"error\", \"\", args);\n  }\n  /**\n   * error\n   */\n  public error(...args: any[]) {\n    return this.printLog(\"error\", \"\", args);\n  }\n\n  /**\n   * log Fatal - for critical errors that cause application termination\n   * Automatically exits the process after logging\n   * \n   * @returns {*} \n   * @memberof Logger\n   */\n  public Fatal(...args: any[]) {\n    // Flush any buffered logs first\n    if (this.batchConfig.enabled) {\n      this.flushBatch().catch(() => {}); // Don't wait, just try to flush\n    }\n    // Print to console.error directly to ensure visibility\n    console.error('\\x1b[31m[FATAL]\\x1b[0m', ...args);\n    this.printLog(\"error\", \"FATAL\", args);\n    // Give a tiny delay for logs to be written\n    setImmediate(() => process.exit(1));\n  }\n  /**\n   * fatal\n   */\n  public fatal(...args: any[]) {\n    // Flush any buffered logs first\n    if (this.batchConfig.enabled) {\n      this.flushBatch().catch(() => {}); // Don't wait, just try to flush\n    }\n    // Print to console.error directly to ensure visibility\n    console.error('\\x1b[31m[FATAL]\\x1b[0m', ...args);\n    this.printLog(\"error\", \"FATAL\", args);\n    // Give a tiny delay for logs to be written\n    setImmediate(() => process.exit(1));\n  }\n\n  /**\n   * log Log\n   * \n   * Logger.Log('msg')\n   * \n   * Logger.Log('name', 'msg')\n   * \n   * Logger.Log('name', 'msg1', 'msg2'...)\n   *\n   * @param {...any[]} args\n   * @returns {*} \n   * @memberof Logger\n   */\n  public Log(name: LogLevelType | string, ...args: any[]) {\n    // tslint:disable-next-line: one-variable-per-declaration\n    let level = \"info\";\n    if (LogLevelObj[name] !== undefined) {\n      level = name;\n      name = \"\";\n    }\n    return this.printLog(<LogLevelType>level, name, args);\n  }\n\n  /**\n   * log\n   */\n  public log(name: LogLevelType | string, ...args: any[]) {\n    let level = \"info\";\n    if (LogLevelObj[name] !== undefined) {\n      level = name;\n      name = \"\";\n    }\n    return this.printLog(<LogLevelType>level, name, args);\n  }\n\n  /**\n   * print console\n   *\n   * @private\n   * @param {LogLevelType} level\n   * @param {string} name\n   * @param {any[]|string} args\n   * @memberof Logger\n   */\n  private printLog(level: LogLevelType, name: string, args: any[]) {\n    try {\n      if (!this.enableLog || this.isDestroyed) {\n        return;\n      }\n\n      // 如果启用批量写入，添加到缓冲区\n      if (this.batchConfig.enabled) {\n        this.addToBuffer(level, name, args);\n      } else {\n        // 默认异步写入\n        this.writeLogAsync(level, name, args);\n      }\n    } catch (e) {\n      console.error('Error in printLog:', e);\n    }\n  }\n\n  /**\n   * writeLogAsync - 异步写入单个日志条目\n   */\n  private async writeLogAsync(level: LogLevelType, name: string, args: any[]) {\n    try {\n      const logName = name !== '' ? name.toUpperCase() : level.toUpperCase();\n\n      // 对输入参数进行安全过滤\n      const sanitizedArgs = args.map(arg => this.sanitizeInput(arg));\n\n      // format\n      sanitizedArgs.unshift(logName);\n\n      // Winston的日志方法本身就是异步的，我们使用Promise.resolve确保异步执行\n      return new Promise<void>((resolve, reject) => {\n        try {\n          // 使用setImmediate确保异步执行，避免阻塞主线程\n          setImmediate(() => {\n            try {\n              this.logger[level](sanitizedArgs);\n              resolve();\n            } catch (error) {\n              reject(error);\n            }\n          });\n        } catch (error) {\n          reject(error);\n        }\n      }).catch(e => {\n        console.error('Error in async log write:', e);\n      });\n    } catch (e) {\n      console.error('Error in writeLogAsync:', e);\n    }\n  }\n\n  /**\n   * 格式化\n   *\n   * @private\n   * @param {string} level\n   * @param {string} label\n   * @param {string} timestamp\n   * @param {any[]|string} args\n   * @returns {string} \n   * @memberof Logger\n   */\n  private format(level: string, label: string, timestamp: string, args: any[] | string): string {\n    try {\n      label = label ? `[${label}]` : '';\n      const params = [`[${timestamp}]`, label, ...ShieldLog(args, this.sensFields)];\n      // if (level === \"debug\") {\n      //   Error.captureStackTrace(this.emptyObj);\n      //   const matchResult = (this.emptyObj.stack.slice(this.emptyObj.stack.lastIndexOf(\"koatty_logger\"))).match(/\\(.*?\\)/g) || [];\n      //   params.push(matchResult.join(\"  \"));\n      // }\n\n      return util.format.apply(null, params);\n    } catch (e) {\n      // console.error(e.stack);\n      this.logger.error(e.stack);\n      return \"\";\n    }\n  }\n\n  /**\n   * createLogger\n   * @returns \n   */\n  private createLogger(): wLogger {\n    const trans: any[] = [];\n    if (this.logFilePath != \"\") {\n      defaultLoggerOpt.File.level = this.logLevel;\n      defaultLoggerOpt.File.filename = `${(this.logFilePath || './logs/')}/log-%DATE%.log`;\n      this.transports.File = new DailyRotateFile(defaultLoggerOpt.File);\n      trans.push(this.transports.File);\n    } else {\n      defaultLoggerOpt.Console.level = this.logLevel;\n      this.transports.Console = new transports.Console(defaultLoggerOpt.Console);\n      trans.push(this.transports.Console);\n    }\n\n    return createLogger({\n      levels: LogLevelObj,\n      transports: trans,\n      format: combine(\n        timestamp({\n          format: \"YYYY-MM-DD HH:mm:ss.SSS Z\",\n        }),\n        format.json(),\n        printf(({ level, message, label, timestamp }: any) => {\n          return this.format(level, label, timestamp, message);\n        }),\n      ),\n    });\n  }\n\n}\n\nlet defaultLoggerInstance: Logger | null = null;\n\n/**\n * Get the default logger singleton (used by @Log() decorator to avoid circular dependency).\n * @internal\n */\nexport function getDefaultLogger(): Logger {\n  if (!defaultLoggerInstance) {\n    defaultLoggerInstance = new Logger();\n  }\n  return defaultLoggerInstance;\n}\n\n","/*\n * @Description: Log property decorator integrated with koatty-container\n * @Usage: Use registerLogDecorator(decoratorManager.property) then @Log() or @Log(options)\n * @Author: richen\n * @Date: 2025-02-03\n */\nimport { Logger, LoggerOpt, getDefaultLogger } from \"./logger\";\n\n/**\n * Minimal interface for property decorator manager (avoids depending on koatty_container).\n * Pass decoratorManager.property from koatty_container when calling registerLogDecorator.\n */\nexport interface IPropertyDecoratorManagerLike {\n  registerWrapper(\n    decoratorType: string,\n    wrapperFunction: (\n      originalDescriptor: PropertyDescriptor | undefined,\n      config: any,\n      propertyName: string,\n      target: any\n    ) => PropertyDescriptor\n  ): void;\n  registerDecorator(\n    target: any,\n    propertyKey: string | symbol,\n    metadata: { wrapperTypes: string[]; config?: any },\n    originalDescriptor?: PropertyDescriptor\n  ): PropertyDescriptor;\n}\n\nconst LOG_DECORATOR_TYPE = \"Log\";\n\n/** Cache for custom Logger instances: (constructor, propertyName) -> Logger */\nconst customLoggerCache = new WeakMap<object, Map<string, Logger>>();\n\nfunction getOrCreateCustomLogger(ctor: object, propertyName: string, config: LoggerOpt): Logger {\n  let map = customLoggerCache.get(ctor);\n  if (!map) {\n    map = new Map<string, Logger>();\n    customLoggerCache.set(ctor, map);\n  }\n  let logger = map.get(propertyName);\n  if (!logger) {\n    const opt: LoggerOpt = { ...config };\n    if (opt.sensFields && Array.isArray(opt.sensFields)) {\n      opt.sensFields = new Set(opt.sensFields as unknown as string[]);\n    }\n    logger = new Logger(opt);\n    map.set(propertyName, logger);\n  }\n  return logger;\n}\n\n/**\n * Property wrapper for \"Log\" decorator type.\n * - config undefined/empty: return DefaultLogger\n * - config provided: return a Logger instance per (class, property), cached\n */\nfunction logPropertyWrapper(\n  _originalDescriptor: PropertyDescriptor | undefined,\n  config: LoggerOpt | undefined,\n  propertyName: string,\n  target: any\n): PropertyDescriptor {\n  const key = String(propertyName);\n  const privateKey = `_log_${key}`;\n  return {\n    get(this: any): Logger {\n      if ((this as any)[privateKey] !== undefined) {\n        return (this as any)[privateKey];\n      }\n      if (!config || (typeof config === \"object\" && Object.keys(config).length === 0)) {\n        return getDefaultLogger();\n      }\n      const ctor = this?.constructor ?? target?.constructor;\n      if (!ctor) {\n        return new Logger(config);\n      }\n      return getOrCreateCustomLogger(ctor, key, config);\n    },\n    set(this: any, value: any) {\n      (this as any)[privateKey] = value;\n    },\n    enumerable: true,\n    configurable: true\n  };\n}\n\nlet storedPropertyManager: IPropertyDecoratorManagerLike | null = null;\n\n/**\n * Register the \"Log\" decorator with koatty-container's property manager.\n * Call once at app startup, e.g. registerLogDecorator(decoratorManager.property).\n *\n * @param propertyManager - PropertyDecoratorManager from decoratorManager.property\n */\nexport function registerLogDecorator(propertyManager: IPropertyDecoratorManagerLike): void {\n  if (!propertyManager || typeof propertyManager.registerWrapper !== \"function\") {\n    return;\n  }\n  try {\n    propertyManager.registerWrapper(LOG_DECORATOR_TYPE, logPropertyWrapper);\n    storedPropertyManager = propertyManager;\n  } catch {\n    // Avoid breaking app if container API differs\n  }\n}\n\n/**\n * Unregister the stored property manager (e.g. for tests).\n */\nexport function unregisterLogDecorator(): void {\n  storedPropertyManager = null;\n}\n\n/**\n * Inline dual field decorator helper (avoids koatty_container dependency).\n * Detects TC39 vs legacy calling convention at runtime and routes accordingly.\n */\nfunction createDualField(\n  legacyHandler: (target: object, key: string | symbol) => void | PropertyDescriptor,\n  tc39Handler: (context: any) => ((init: any) => any) | void\n) {\n  return (...args: any[]) => {\n    if (args.length === 2 && args[1] && typeof args[1] === 'object' && 'kind' in args[1]) {\n      return tc39Handler(args[1]);\n    }\n    return legacyHandler(args[0], args[1]);\n  };\n}\n\n/**\n * Property decorator: inject a logger instance.\n * - @Log() uses the global DefaultLogger.\n * - @Log(options) uses a dedicated Logger instance with the given options (cached per class+property).\n *\n * Supports both legacy and TC39 field decorator calling conventions.\n * Requires registerLogDecorator(decoratorManager.property) to be called first;\n * otherwise the decorator is a no-op so existing code is not broken.\n *\n * @param options - Optional LoggerOpt for a custom Logger instance\n * @example\n * ```ts\n * registerLogDecorator(decoratorManager.property);\n *\n * class UserController {\n *   \\@Log()\n *   logger: any;\n *\n *   \\@Log({ logLevel: 'debug' })\n *   debugLogger: any;\n * }\n * ```\n */\nexport function Log(options?: LoggerOpt) {\n  return createDualField(\n    (target: object, propertyKey: string | symbol): void | PropertyDescriptor => {\n      const pm = storedPropertyManager;\n      if (!pm || typeof pm.registerDecorator !== \"function\") {\n        return;\n      }\n      try {\n        return pm.registerDecorator(target, propertyKey, {\n          wrapperTypes: [LOG_DECORATOR_TYPE],\n          config: options\n        });\n      } catch {\n        return;\n      }\n    },\n    (context: any) => {\n      const fieldName = String(context.name);\n      context.addInitializer(function (this: any) {\n        const pm = storedPropertyManager;\n        if (!pm || typeof pm.registerDecorator !== \"function\") {\n          return;\n        }\n        try {\n          const proto = Object.getPrototypeOf(this);\n          pm.registerDecorator(proto, fieldName, {\n            wrapperTypes: [LOG_DECORATOR_TYPE],\n            config: options\n          });\n        } catch {\n          // no-op\n        }\n      });\n    }\n  );\n}\n","/*\n * @Description: \n * @Usage: \n * @Author: richen\n * @Date: 2021-12-18 20:03:31\n * @LastEditTime: 2024-10-31 16:32:08\n */\nimport { Logger, getDefaultLogger } from \"./logger\";\n// export\nexport * from \"./logger\";\nexport * from \"./interface\";\nexport * from \"./decorator\";\n\n//DefaultLogger\nexport const DefaultLogger: Logger = getDefaultLogger();"]}