@spfn/core 0.1.0-alpha.82 → 0.1.0-alpha.83

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -19,76 +19,132 @@
19
19
  * debug < info < warn < error < fatal
20
20
  */
21
21
  type LogLevel = 'debug' | 'info' | 'warn' | 'error' | 'fatal';
22
+ /**
23
+ * 로그 메타데이터
24
+ */
25
+ interface LogMetadata {
26
+ timestamp: Date;
27
+ level: LogLevel;
28
+ message: string;
29
+ module?: string;
30
+ error?: Error;
31
+ context?: Record<string, unknown>;
32
+ }
33
+ /**
34
+ * Transport 인터페이스
35
+ * 모든 Transport는 이 인터페이스를 구현해야 함
36
+ */
37
+ interface Transport {
38
+ /**
39
+ * Transport 이름
40
+ */
41
+ name: string;
42
+ /**
43
+ * 최소 로그 레벨 (이 레벨 이상만 처리)
44
+ */
45
+ level: LogLevel;
46
+ /**
47
+ * 활성화 여부
48
+ */
49
+ enabled: boolean;
50
+ /**
51
+ * 로그 처리 함수
52
+ */
53
+ log(metadata: LogMetadata): Promise<void>;
54
+ /**
55
+ * Transport 종료 (리소스 정리)
56
+ */
57
+ close?(): Promise<void>;
58
+ }
59
+ /**
60
+ * Logger 설정
61
+ */
62
+ interface LoggerConfig {
63
+ /**
64
+ * 기본 로그 레벨
65
+ */
66
+ level: LogLevel;
67
+ /**
68
+ * 모듈명 (context)
69
+ */
70
+ module?: string;
71
+ /**
72
+ * Transport 리스트
73
+ */
74
+ transports: Transport[];
75
+ }
22
76
 
23
77
  /**
24
- * Logger Adapter Interface
78
+ * Logger Class
25
79
  *
26
- * Logger 구현을 추상화하는 Adapter 인터페이스
27
- * Pino, Winston, Custom 등 다양한 구현체로 교체 가능
28
- *
29
- * ✅ 구현 완료:
30
- * - LoggerAdapter 인터페이스 정의
31
- * - Child logger 지원
32
- * - Error + Context 지원
33
- *
34
- * 💡 향후 고려사항:
35
- * - Winston Adapter
36
- * - Bunyan Adapter
37
- *
38
- * 🔗 관련 파일:
39
- * - src/logger/adapters/pino.ts (Pino 구현)
40
- * - src/logger/adapters/custom.ts (Custom 구현)
41
- * - src/logger/index.ts (Adapter 선택)
80
+ * Central logging class with multiple transports, child loggers, and sensitive data masking.
42
81
  */
43
82
 
44
83
  /**
45
- * Logger Adapter 인터페이스
46
- *
47
- * 모든 Logger 구현체는 이 인터페이스를 구현해야 함
84
+ * Logger class
48
85
  */
49
- interface LoggerAdapter {
86
+ declare class Logger {
87
+ private readonly config;
88
+ private readonly module?;
89
+ constructor(config: LoggerConfig);
90
+ /**
91
+ * Get current log level
92
+ */
93
+ get level(): LogLevel;
50
94
  /**
51
- * Child logger 생성
95
+ * Create child logger (per module)
52
96
  */
53
- child(module: string): LoggerAdapter;
97
+ child(module: string): Logger;
54
98
  /**
55
- * Debug 로그
99
+ * Debug log
56
100
  */
57
101
  debug(message: string, context?: Record<string, unknown>): void;
58
102
  /**
59
- * Info 로그
103
+ * Info log
60
104
  */
61
105
  info(message: string, context?: Record<string, unknown>): void;
62
106
  /**
63
- * Warn 로그
107
+ * Warn log
64
108
  */
65
109
  warn(message: string, context?: Record<string, unknown>): void;
66
110
  warn(message: string, error: Error, context?: Record<string, unknown>): void;
67
111
  /**
68
- * Error 로그
112
+ * Error log
69
113
  */
70
114
  error(message: string, context?: Record<string, unknown>): void;
71
115
  error(message: string, error: Error, context?: Record<string, unknown>): void;
72
116
  /**
73
- * Fatal 로그
117
+ * Fatal log
74
118
  */
75
119
  fatal(message: string, context?: Record<string, unknown>): void;
76
120
  fatal(message: string, error: Error, context?: Record<string, unknown>): void;
77
121
  /**
78
- * 리소스 정리
122
+ * Log processing (internal)
79
123
  */
80
- close?(): Promise<void>;
124
+ private log;
125
+ /**
126
+ * Process Transports
127
+ */
128
+ private processTransports;
129
+ /**
130
+ * Transport log (error-safe)
131
+ */
132
+ private safeTransportLog;
133
+ /**
134
+ * Close all Transports
135
+ */
136
+ close(): Promise<void>;
81
137
  }
82
138
 
83
139
  /**
84
- * Logger Adapter Factory
140
+ * Logger Factory
85
141
  *
86
- * Adapter creation and initialization logic
142
+ * Creates and initializes the logger instance with configured transports
87
143
  */
88
144
 
89
145
  /**
90
146
  * Singleton Logger instance
91
147
  */
92
- declare const logger: LoggerAdapter;
148
+ declare const logger: Logger;
93
149
 
94
- export { type LogLevel, type LoggerAdapter, logger };
150
+ export { type LogLevel, Logger, type Transport, logger };
@@ -1,74 +1,6 @@
1
- import pino from 'pino';
2
- import { existsSync, mkdirSync, accessSync, constants, writeFileSync, unlinkSync, createWriteStream, statSync, readdirSync, renameSync } from 'fs';
1
+ import { existsSync, mkdirSync, createWriteStream, statSync, readdirSync, renameSync, unlinkSync, accessSync, constants, writeFileSync } from 'fs';
3
2
  import { join } from 'path';
4
3
 
5
- // src/logger/adapters/pino.ts
6
- var PinoAdapter = class _PinoAdapter {
7
- logger;
8
- constructor(config) {
9
- const isDevelopment = process.env.NODE_ENV === "development";
10
- const transport = isDevelopment ? {
11
- target: "pino-pretty",
12
- options: {
13
- colorize: true,
14
- translateTime: "HH:MM:ss.l",
15
- ignore: "pid,hostname",
16
- singleLine: false,
17
- messageFormat: "{module} {msg}",
18
- errorLikeObjectKeys: ["err", "error"]
19
- }
20
- } : void 0;
21
- try {
22
- this.logger = pino({
23
- level: config.level,
24
- // 기본 필드
25
- base: config.module ? { module: config.module } : void 0,
26
- // Transport (pretty print in development if available)
27
- transport
28
- });
29
- } catch (error) {
30
- this.logger = pino({
31
- level: config.level,
32
- base: config.module ? { module: config.module } : void 0
33
- });
34
- }
35
- }
36
- child(module) {
37
- const childLogger = new _PinoAdapter({ level: this.logger.level, module });
38
- childLogger.logger = this.logger.child({ module });
39
- return childLogger;
40
- }
41
- debug(message, context) {
42
- this.logger.debug(context || {}, message);
43
- }
44
- info(message, context) {
45
- this.logger.info(context || {}, message);
46
- }
47
- warn(message, errorOrContext, context) {
48
- if (errorOrContext instanceof Error) {
49
- this.logger.warn({ err: errorOrContext, ...context }, message);
50
- } else {
51
- this.logger.warn(errorOrContext || {}, message);
52
- }
53
- }
54
- error(message, errorOrContext, context) {
55
- if (errorOrContext instanceof Error) {
56
- this.logger.error({ err: errorOrContext, ...context }, message);
57
- } else {
58
- this.logger.error(errorOrContext || {}, message);
59
- }
60
- }
61
- fatal(message, errorOrContext, context) {
62
- if (errorOrContext instanceof Error) {
63
- this.logger.fatal({ err: errorOrContext, ...context }, message);
64
- } else {
65
- this.logger.fatal(errorOrContext || {}, message);
66
- }
67
- }
68
- async close() {
69
- }
70
- };
71
-
72
4
  // src/logger/types.ts
73
5
  var LOG_LEVEL_PRIORITY = {
74
6
  debug: 0,
@@ -708,7 +640,7 @@ function validateConfig() {
708
640
  }
709
641
  }
710
642
 
711
- // src/logger/adapters/custom.ts
643
+ // src/logger/factory.ts
712
644
  function initializeTransports() {
713
645
  const transports = [];
714
646
  const consoleConfig = getConsoleConfig();
@@ -719,77 +651,15 @@ function initializeTransports() {
719
651
  }
720
652
  return transports;
721
653
  }
722
- var CustomAdapter = class _CustomAdapter {
723
- logger;
724
- constructor(config) {
725
- this.logger = new Logger({
726
- level: config.level,
727
- module: config.module,
728
- transports: initializeTransports()
729
- });
730
- }
731
- child(module) {
732
- const adapter = new _CustomAdapter({ level: this.logger.level, module });
733
- adapter.logger = this.logger.child(module);
734
- return adapter;
735
- }
736
- debug(message, context) {
737
- this.logger.debug(message, context);
738
- }
739
- info(message, context) {
740
- this.logger.info(message, context);
741
- }
742
- warn(message, errorOrContext, context) {
743
- if (errorOrContext instanceof Error) {
744
- this.logger.warn(message, errorOrContext, context);
745
- } else {
746
- this.logger.warn(message, errorOrContext);
747
- }
748
- }
749
- error(message, errorOrContext, context) {
750
- if (errorOrContext instanceof Error) {
751
- this.logger.error(message, errorOrContext, context);
752
- } else {
753
- this.logger.error(message, errorOrContext);
754
- }
755
- }
756
- fatal(message, errorOrContext, context) {
757
- if (errorOrContext instanceof Error) {
758
- this.logger.fatal(message, errorOrContext, context);
759
- } else {
760
- this.logger.fatal(message, errorOrContext);
761
- }
762
- }
763
- async close() {
764
- await this.logger.close();
765
- }
766
- };
767
-
768
- // src/logger/adapter-factory.ts
769
- function createAdapter(type) {
770
- const level = getDefaultLogLevel();
771
- switch (type) {
772
- case "pino":
773
- return new PinoAdapter({ level });
774
- case "custom":
775
- return new CustomAdapter({ level });
776
- default:
777
- return new PinoAdapter({ level });
778
- }
779
- }
780
- function getAdapterType() {
781
- const adapterEnv = process.env.LOGGER_ADAPTER;
782
- if (adapterEnv === "custom" || adapterEnv === "pino") {
783
- return adapterEnv;
784
- }
785
- return "pino";
786
- }
787
654
  function initializeLogger() {
788
655
  validateConfig();
789
- return createAdapter(getAdapterType());
656
+ return new Logger({
657
+ level: getDefaultLogLevel(),
658
+ transports: initializeTransports()
659
+ });
790
660
  }
791
661
  var logger = initializeLogger();
792
662
 
793
- export { logger };
663
+ export { Logger, logger };
794
664
  //# sourceMappingURL=index.js.map
795
665
  //# sourceMappingURL=index.js.map