@masuidrive/procman 0.1.2 → 0.2.0

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.
Files changed (204) hide show
  1. package/dist/src/cli/commands/help.d.ts.map +1 -1
  2. package/dist/src/cli/commands/help.js +3 -1
  3. package/dist/src/cli/commands/help.js.map +1 -1
  4. package/dist/src/cli/index.js +6 -2
  5. package/dist/src/cli/index.js.map +1 -1
  6. package/dist/src/cli/parser.d.ts.map +1 -1
  7. package/dist/src/cli/parser.js +20 -0
  8. package/dist/src/cli/parser.js.map +1 -1
  9. package/dist/src/cli/utils/find-package-json.d.ts +4 -0
  10. package/dist/src/cli/utils/find-package-json.d.ts.map +1 -0
  11. package/dist/src/cli/utils/find-package-json.js +15 -0
  12. package/dist/src/cli/utils/find-package-json.js.map +1 -0
  13. package/dist/src/config/config-loader.d.ts +1 -0
  14. package/dist/src/config/config-loader.d.ts.map +1 -1
  15. package/dist/src/config/config-loader.js +16 -6
  16. package/dist/src/config/config-loader.js.map +1 -1
  17. package/dist/src/config/config-validator.d.ts +18 -49
  18. package/dist/src/config/config-validator.d.ts.map +1 -1
  19. package/dist/src/config/config-validator.js +64 -172
  20. package/dist/src/config/config-validator.js.map +1 -1
  21. package/dist/src/config/path-security-validator.d.ts +39 -0
  22. package/dist/src/config/path-security-validator.d.ts.map +1 -0
  23. package/dist/src/config/path-security-validator.js +134 -0
  24. package/dist/src/config/path-security-validator.js.map +1 -0
  25. package/dist/src/config/secure-config-loader.d.ts.map +1 -1
  26. package/dist/src/config/secure-config-loader.js +10 -2
  27. package/dist/src/config/secure-config-loader.js.map +1 -1
  28. package/dist/src/config/validation-suggestions.d.ts +13 -0
  29. package/dist/src/config/validation-suggestions.d.ts.map +1 -0
  30. package/dist/src/config/validation-suggestions.js +40 -0
  31. package/dist/src/config/validation-suggestions.js.map +1 -0
  32. package/dist/src/config/validation-types.d.ts +38 -0
  33. package/dist/src/config/validation-types.d.ts.map +1 -0
  34. package/dist/src/config/validation-types.js +7 -0
  35. package/dist/src/config/validation-types.js.map +1 -0
  36. package/dist/src/daemon/component-command-wiring.d.ts +19 -0
  37. package/dist/src/daemon/component-command-wiring.d.ts.map +1 -0
  38. package/dist/src/daemon/component-command-wiring.js +27 -0
  39. package/dist/src/daemon/component-command-wiring.js.map +1 -0
  40. package/dist/src/daemon/component-daemon-interface.d.ts +38 -0
  41. package/dist/src/daemon/component-daemon-interface.d.ts.map +1 -0
  42. package/dist/src/daemon/component-daemon-interface.js +72 -0
  43. package/dist/src/daemon/component-daemon-interface.js.map +1 -0
  44. package/dist/src/daemon/component-health.d.ts +38 -0
  45. package/dist/src/daemon/component-health.d.ts.map +1 -0
  46. package/dist/src/daemon/component-health.js +146 -0
  47. package/dist/src/daemon/component-health.js.map +1 -0
  48. package/dist/src/daemon/component-manager-errors.d.ts +20 -0
  49. package/dist/src/daemon/component-manager-errors.d.ts.map +1 -0
  50. package/dist/src/daemon/component-manager-errors.js +30 -0
  51. package/dist/src/daemon/component-manager-errors.js.map +1 -0
  52. package/dist/src/daemon/component-manager-types.d.ts +23 -0
  53. package/dist/src/daemon/component-manager-types.d.ts.map +1 -0
  54. package/dist/src/daemon/component-manager-types.js +5 -0
  55. package/dist/src/daemon/component-manager-types.js.map +1 -0
  56. package/dist/src/daemon/component-manager.d.ts +16 -64
  57. package/dist/src/daemon/component-manager.d.ts.map +1 -1
  58. package/dist/src/daemon/component-manager.js +72 -509
  59. package/dist/src/daemon/component-manager.js.map +1 -1
  60. package/dist/src/daemon/component-registration.d.ts +14 -0
  61. package/dist/src/daemon/component-registration.d.ts.map +1 -0
  62. package/dist/src/daemon/component-registration.js +92 -0
  63. package/dist/src/daemon/component-registration.js.map +1 -0
  64. package/dist/src/daemon/component-streaming.d.ts +36 -0
  65. package/dist/src/daemon/component-streaming.d.ts.map +1 -0
  66. package/dist/src/daemon/component-streaming.js +112 -0
  67. package/dist/src/daemon/component-streaming.js.map +1 -0
  68. package/dist/src/daemon/daemon-lifecycle.d.ts +37 -0
  69. package/dist/src/daemon/daemon-lifecycle.d.ts.map +1 -0
  70. package/dist/src/daemon/daemon-lifecycle.js +362 -0
  71. package/dist/src/daemon/daemon-lifecycle.js.map +1 -0
  72. package/dist/src/daemon/daemon-queries.d.ts +53 -0
  73. package/dist/src/daemon/daemon-queries.d.ts.map +1 -0
  74. package/dist/src/daemon/daemon-queries.js +113 -0
  75. package/dist/src/daemon/daemon-queries.js.map +1 -0
  76. package/dist/src/daemon/daemon-types.d.ts +30 -0
  77. package/dist/src/daemon/daemon-types.d.ts.map +1 -0
  78. package/dist/src/daemon/daemon-types.js +8 -0
  79. package/dist/src/daemon/daemon-types.js.map +1 -0
  80. package/dist/src/daemon/disposable-base.d.ts +49 -0
  81. package/dist/src/daemon/disposable-base.d.ts.map +1 -0
  82. package/dist/src/daemon/disposable-base.js +70 -0
  83. package/dist/src/daemon/disposable-base.js.map +1 -0
  84. package/dist/src/daemon/disposal-guard.d.ts +27 -0
  85. package/dist/src/daemon/disposal-guard.d.ts.map +1 -0
  86. package/dist/src/daemon/disposal-guard.js +58 -0
  87. package/dist/src/daemon/disposal-guard.js.map +1 -0
  88. package/dist/src/daemon/ipc-command-handler.d.ts +8 -34
  89. package/dist/src/daemon/ipc-command-handler.d.ts.map +1 -1
  90. package/dist/src/daemon/ipc-command-handler.js +14 -362
  91. package/dist/src/daemon/ipc-command-handler.js.map +1 -1
  92. package/dist/src/daemon/log-command-handlers.d.ts +19 -0
  93. package/dist/src/daemon/log-command-handlers.d.ts.map +1 -0
  94. package/dist/src/daemon/log-command-handlers.js +114 -0
  95. package/dist/src/daemon/log-command-handlers.js.map +1 -0
  96. package/dist/src/daemon/process-command-handlers.d.ts +32 -0
  97. package/dist/src/daemon/process-command-handlers.d.ts.map +1 -0
  98. package/dist/src/daemon/process-command-handlers.js +223 -0
  99. package/dist/src/daemon/process-command-handlers.js.map +1 -0
  100. package/dist/src/daemon/procman-daemon.d.ts +22 -98
  101. package/dist/src/daemon/procman-daemon.d.ts.map +1 -1
  102. package/dist/src/daemon/procman-daemon.js +107 -604
  103. package/dist/src/daemon/procman-daemon.js.map +1 -1
  104. package/dist/src/daemon/resource-manager.d.ts +6 -124
  105. package/dist/src/daemon/resource-manager.d.ts.map +1 -1
  106. package/dist/src/daemon/resource-manager.js +5 -231
  107. package/dist/src/daemon/resource-manager.js.map +1 -1
  108. package/dist/src/daemon/resource-types.d.ts +23 -0
  109. package/dist/src/daemon/resource-types.d.ts.map +1 -0
  110. package/dist/src/daemon/resource-types.js +7 -0
  111. package/dist/src/daemon/resource-types.js.map +1 -0
  112. package/dist/src/daemon/shutdown-orchestrator.d.ts +32 -0
  113. package/dist/src/daemon/shutdown-orchestrator.d.ts.map +1 -0
  114. package/dist/src/daemon/shutdown-orchestrator.js +123 -0
  115. package/dist/src/daemon/shutdown-orchestrator.js.map +1 -0
  116. package/dist/src/daemon/tracked-resources.d.ts +60 -0
  117. package/dist/src/daemon/tracked-resources.d.ts.map +1 -0
  118. package/dist/src/daemon/tracked-resources.js +124 -0
  119. package/dist/src/daemon/tracked-resources.js.map +1 -0
  120. package/dist/src/process-manager/index.d.ts +5 -1
  121. package/dist/src/process-manager/index.d.ts.map +1 -1
  122. package/dist/src/process-manager/index.js +3 -0
  123. package/dist/src/process-manager/index.js.map +1 -1
  124. package/dist/src/process-manager/interfaces/process-group.d.ts +6 -0
  125. package/dist/src/process-manager/interfaces/process-group.d.ts.map +1 -1
  126. package/dist/src/process-manager/managed-process-events.d.ts +22 -0
  127. package/dist/src/process-manager/managed-process-events.d.ts.map +1 -0
  128. package/dist/src/process-manager/managed-process-events.js +5 -0
  129. package/dist/src/process-manager/managed-process-events.js.map +1 -0
  130. package/dist/src/process-manager/managed-process-info.d.ts +11 -53
  131. package/dist/src/process-manager/managed-process-info.d.ts.map +1 -1
  132. package/dist/src/process-manager/managed-process-info.js +46 -133
  133. package/dist/src/process-manager/managed-process-info.js.map +1 -1
  134. package/dist/src/process-manager/process-batch-operations.d.ts +62 -0
  135. package/dist/src/process-manager/process-batch-operations.d.ts.map +1 -0
  136. package/dist/src/process-manager/process-batch-operations.js +80 -0
  137. package/dist/src/process-manager/process-batch-operations.js.map +1 -0
  138. package/dist/src/process-manager/process-config.d.ts +49 -0
  139. package/dist/src/process-manager/process-config.d.ts.map +1 -0
  140. package/dist/src/process-manager/process-config.js +68 -0
  141. package/dist/src/process-manager/process-config.js.map +1 -0
  142. package/dist/src/process-manager/process-event-forwarding.d.ts +18 -0
  143. package/dist/src/process-manager/process-event-forwarding.d.ts.map +1 -0
  144. package/dist/src/process-manager/process-event-forwarding.js +105 -0
  145. package/dist/src/process-manager/process-event-forwarding.js.map +1 -0
  146. package/dist/src/process-manager/process-group-manager.d.ts.map +1 -1
  147. package/dist/src/process-manager/process-group-manager.js +0 -1
  148. package/dist/src/process-manager/process-group-manager.js.map +1 -1
  149. package/dist/src/process-manager/process-info-queries.d.ts +48 -0
  150. package/dist/src/process-manager/process-info-queries.d.ts.map +1 -0
  151. package/dist/src/process-manager/process-info-queries.js +92 -0
  152. package/dist/src/process-manager/process-info-queries.js.map +1 -0
  153. package/dist/src/process-manager/process-manager.d.ts +5 -174
  154. package/dist/src/process-manager/process-manager.d.ts.map +1 -1
  155. package/dist/src/process-manager/process-manager.js +58 -398
  156. package/dist/src/process-manager/process-manager.js.map +1 -1
  157. package/dist/src/process-manager/process-monitoring.d.ts +80 -0
  158. package/dist/src/process-manager/process-monitoring.d.ts.map +1 -0
  159. package/dist/src/process-manager/process-monitoring.js +142 -0
  160. package/dist/src/process-manager/process-monitoring.js.map +1 -0
  161. package/dist/src/process-manager/process-statistics.d.ts +37 -0
  162. package/dist/src/process-manager/process-statistics.d.ts.map +1 -0
  163. package/dist/src/process-manager/process-statistics.js +24 -0
  164. package/dist/src/process-manager/process-statistics.js.map +1 -0
  165. package/dist/src/process-manager/restart-manager.d.ts +82 -0
  166. package/dist/src/process-manager/restart-manager.d.ts.map +1 -0
  167. package/dist/src/process-manager/restart-manager.js +150 -0
  168. package/dist/src/process-manager/restart-manager.js.map +1 -0
  169. package/dist/src/services/app-logger.d.ts +144 -0
  170. package/dist/src/services/app-logger.d.ts.map +1 -0
  171. package/dist/src/services/app-logger.js +489 -0
  172. package/dist/src/services/app-logger.js.map +1 -0
  173. package/dist/src/services/log-buffer.d.ts +35 -0
  174. package/dist/src/services/log-buffer.d.ts.map +1 -0
  175. package/dist/src/services/log-buffer.js +87 -0
  176. package/dist/src/services/log-buffer.js.map +1 -0
  177. package/dist/src/services/log-event-manager.d.ts +32 -0
  178. package/dist/src/services/log-event-manager.d.ts.map +1 -0
  179. package/dist/src/services/log-event-manager.js +31 -0
  180. package/dist/src/services/log-event-manager.js.map +1 -0
  181. package/dist/src/services/log-file-manager.d.ts +46 -0
  182. package/dist/src/services/log-file-manager.d.ts.map +1 -0
  183. package/dist/src/services/log-file-manager.js +156 -0
  184. package/dist/src/services/log-file-manager.js.map +1 -0
  185. package/dist/src/services/log-level-strategy.d.ts +19 -0
  186. package/dist/src/services/log-level-strategy.d.ts.map +1 -0
  187. package/dist/src/services/log-level-strategy.js +40 -0
  188. package/dist/src/services/log-level-strategy.js.map +1 -0
  189. package/dist/src/services/log-manager-types.d.ts +117 -0
  190. package/dist/src/services/log-manager-types.d.ts.map +1 -0
  191. package/dist/src/services/log-manager-types.js +12 -0
  192. package/dist/src/services/log-manager-types.js.map +1 -0
  193. package/dist/src/services/log-manager.d.ts +8 -35
  194. package/dist/src/services/log-manager.d.ts.map +1 -1
  195. package/dist/src/services/log-manager.js +10 -870
  196. package/dist/src/services/log-manager.js.map +1 -1
  197. package/dist/src/services/log-preprocessor.d.ts +30 -0
  198. package/dist/src/services/log-preprocessor.d.ts.map +1 -0
  199. package/dist/src/services/log-preprocessor.js +65 -0
  200. package/dist/src/services/log-preprocessor.js.map +1 -0
  201. package/dist/src/services/process-log-integration.d.ts +7 -2
  202. package/dist/src/services/process-log-integration.d.ts.map +1 -1
  203. package/dist/src/services/process-log-integration.js.map +1 -1
  204. package/package.json +5 -7
@@ -0,0 +1,144 @@
1
+ /**
2
+ * AppLogger - 個別アプリケーションのログ管理(リファクタリング後)
3
+ */
4
+ import { EventEmitter } from 'events';
5
+ import { LogEntry, LogOptions } from '../shared/logs.js';
6
+ import { LogManagerConfig } from './log-manager-config.js';
7
+ import { IFileManager, ILogPreprocessor, ILogLevelStrategy, IEventManager, AppLogConfig } from './log-manager-types.js';
8
+ export declare class AppLogger {
9
+ private logDir;
10
+ private eventEmitter;
11
+ private managerConfig;
12
+ private logInfo;
13
+ private watchers;
14
+ private logBuffer;
15
+ private partialLines;
16
+ private fileManager;
17
+ private logPreprocessor;
18
+ private logLevelStrategy;
19
+ private eventManager;
20
+ constructor(appName: string, config: AppLogConfig, logDir: string, eventEmitter: EventEmitter, managerConfig?: LogManagerConfig, fileManager?: IFileManager, logPreprocessor?: ILogPreprocessor, logLevelStrategy?: ILogLevelStrategy, eventManager?: IEventManager);
21
+ /**
22
+ * ログ情報の初期化
23
+ */
24
+ private initializeLogInfo;
25
+ /**
26
+ * ログファイルの事前作成(FileManagerに委譲)
27
+ */
28
+ private ensureLogFiles;
29
+ /**
30
+ * プロセス出力のキャプチャとログ記録
31
+ * ProcessLifecycleManagerからの stdout/stderr データを処理
32
+ */
33
+ captureProcessOutput(type: 'stdout' | 'stderr', data: string): void;
34
+ /**
35
+ * ログエントリの前処理を含む書き込み(10行以下に分割)
36
+ */
37
+ writeLogWithPreprocessing(type: 'stdout' | 'stderr', message: string): void;
38
+ /**
39
+ * ログエントリの作成(10行以下)
40
+ */
41
+ private createLogEntry;
42
+ /**
43
+ * バッファ追加とイベント発行(10行以下)
44
+ */
45
+ private addToBufferAndEmitEvent;
46
+ /**
47
+ * バッファバックプレッシャーの処理(10行以下)
48
+ */
49
+ private handleBufferBackpressure;
50
+ /**
51
+ * 書き込み対象ファイルの決定(関数分割)
52
+ */
53
+ private determineTargetFiles;
54
+ /**
55
+ * ログエントリの書き込み(互換性のため維持)
56
+ */
57
+ writeLog(type: 'stdout' | 'stderr', message: string): void;
58
+ /**
59
+ * バッファされたエントリをファイルに書き込み(20行以下に分割)
60
+ */
61
+ private flushBufferedEntries;
62
+ /**
63
+ * エントリをファイル別にグループ化(関数分割)
64
+ */
65
+ private groupEntriesByFile;
66
+ /**
67
+ * 書き込みPromise配列を作成(関数分割)
68
+ */
69
+ private createWritePromises;
70
+ /**
71
+ * 並列書き込みを実行(関数分割)
72
+ */
73
+ private executeParallelWrites;
74
+ /**
75
+ * リトライ機能付きファイル書き込みとエラーハンドリング
76
+ */
77
+ private writeToFileWithRetryAndHandleError;
78
+ /**
79
+ * ディスク容量不足エラーの処理(EventManagerに委譲)
80
+ */
81
+ private handleDiskSpaceError;
82
+ /**
83
+ * ファイル監視の開始
84
+ */
85
+ startWatching(): Promise<void>;
86
+ /**
87
+ * ファイル監視の停止
88
+ */
89
+ stopWatching(): void;
90
+ /**
91
+ * ログの読み込み(20行以下に分割)
92
+ */
93
+ readLogs(options?: LogOptions): Promise<LogEntry[]>;
94
+ /**
95
+ * ログファイルの選択(関数分割)
96
+ */
97
+ private selectLogFile;
98
+ /**
99
+ * ログエントリの読み込みと解析(関数分割)
100
+ */
101
+ private readAndParseLogEntries;
102
+ /**
103
+ * ログ行の解析とフィルタリング(関数分割)
104
+ */
105
+ private parseLogLines;
106
+ /**
107
+ * ログエントリがフィルタ条件に一致するかチェック
108
+ */
109
+ private matchesFilter;
110
+ /**
111
+ * ログのクリア
112
+ */
113
+ clearLogs(): Promise<void>;
114
+ /**
115
+ * 残りの部分的な行を強制フラッシュ
116
+ */
117
+ flushPartialLines(): void;
118
+ /**
119
+ * バッファ統計情報の取得
120
+ */
121
+ getBufferStats(): {
122
+ entryCount: number;
123
+ bufferSize: number;
124
+ isBackpressured: boolean;
125
+ };
126
+ /**
127
+ * バッファを強制フラッシュ
128
+ */
129
+ flushBuffer(): Promise<void>;
130
+ /**
131
+ * リソースのクリーンアップ
132
+ */
133
+ close(): Promise<void>;
134
+ /**
135
+ * ログ統計情報の取得
136
+ */
137
+ getLogStats(): {
138
+ logFileSize?: number;
139
+ outFileSize?: number;
140
+ errorFileSize?: number;
141
+ lastModified?: number;
142
+ };
143
+ }
144
+ //# sourceMappingURL=app-logger.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"app-logger.d.ts","sourceRoot":"","sources":["../../../src/services/app-logger.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,EAAE,YAAY,EAAE,MAAM,QAAQ,CAAC;AAGtC,OAAO,EAAE,QAAQ,EAAE,UAAU,EAAE,MAAM,mBAAmB,CAAC;AACzD,OAAO,EACL,gBAAgB,EAEjB,MAAM,yBAAyB,CAAC;AACjC,OAAO,EACL,YAAY,EACZ,gBAAgB,EAChB,iBAAiB,EACjB,aAAa,EACb,YAAY,EAGb,MAAM,wBAAwB,CAAC;AAOhC,qBAAa,SAAS;IAelB,OAAO,CAAC,MAAM;IACd,OAAO,CAAC,YAAY;IACpB,OAAO,CAAC,aAAa;IAhBvB,OAAO,CAAC,OAAO,CAAa;IAC5B,OAAO,CAAC,QAAQ,CAAsB;IACtC,OAAO,CAAC,SAAS,CAAY;IAC7B,OAAO,CAAC,YAAY,CAA+C;IAGnE,OAAO,CAAC,WAAW,CAAe;IAClC,OAAO,CAAC,eAAe,CAAmB;IAC1C,OAAO,CAAC,gBAAgB,CAAoB;IAC5C,OAAO,CAAC,YAAY,CAAgB;gBAGlC,OAAO,EAAE,MAAM,EACf,MAAM,EAAE,YAAY,EACZ,MAAM,EAAE,MAAM,EACd,YAAY,EAAE,YAAY,EAC1B,aAAa,GAAE,gBAA6C,EAEpE,WAAW,CAAC,EAAE,YAAY,EAC1B,eAAe,CAAC,EAAE,gBAAgB,EAClC,gBAAgB,CAAC,EAAE,iBAAiB,EACpC,YAAY,CAAC,EAAE,aAAa;IAkB9B;;OAEG;IACH,OAAO,CAAC,iBAAiB;IA8BzB;;OAEG;IACH,OAAO,CAAC,cAAc;IAiBtB;;;OAGG;IACI,oBAAoB,CAAC,IAAI,EAAE,QAAQ,GAAG,QAAQ,EAAE,IAAI,EAAE,MAAM,GAAG,IAAI;IAoB1E;;OAEG;IACI,yBAAyB,CAC9B,IAAI,EAAE,QAAQ,GAAG,QAAQ,EACzB,OAAO,EAAE,MAAM,GACd,IAAI;IAQP;;OAEG;IACH,OAAO,CAAC,cAAc;IActB;;OAEG;IACH,OAAO,CAAC,uBAAuB;IAe/B;;OAEG;IACH,OAAO,CAAC,wBAAwB;IAchC;;OAEG;IACH,OAAO,CAAC,oBAAoB;IAgB5B;;OAEG;IACI,QAAQ,CAAC,IAAI,EAAE,QAAQ,GAAG,QAAQ,EAAE,OAAO,EAAE,MAAM,GAAG,IAAI;IAMjE;;OAEG;YACW,oBAAoB;IAalC;;OAEG;IACH,OAAO,CAAC,kBAAkB;IAiB1B;;OAEG;IACH,OAAO,CAAC,mBAAmB;IAoB3B;;OAEG;YACW,qBAAqB;IAanC;;OAEG;YACW,kCAAkC;IAiChD;;OAEG;IACH,OAAO,CAAC,oBAAoB;IAe5B;;OAEG;IACU,aAAa,IAAI,OAAO,CAAC,IAAI,CAAC;IAuC3C;;OAEG;IACI,YAAY,IAAI,IAAI;IAO3B;;OAEG;IACU,QAAQ,CAAC,OAAO,GAAE,UAAe,GAAG,OAAO,CAAC,QAAQ,EAAE,CAAC;IAapE;;OAEG;IACH,OAAO,CAAC,aAAa;IAcrB;;OAEG;YACW,sBAAsB;IAiBpC;;OAEG;IACH,OAAO,CAAC,aAAa;IAmBrB;;OAEG;IACH,OAAO,CAAC,aAAa;IAuBrB;;OAEG;IACU,SAAS,IAAI,OAAO,CAAC,IAAI,CAAC;IAoBvC;;OAEG;IACI,iBAAiB,IAAI,IAAI;IAShC;;OAEG;IACI,cAAc,IAAI;QACvB,UAAU,EAAE,MAAM,CAAC;QACnB,UAAU,EAAE,MAAM,CAAC;QACnB,eAAe,EAAE,OAAO,CAAC;KAC1B;IAID;;OAEG;IACU,WAAW,IAAI,OAAO,CAAC,IAAI,CAAC;IAIzC;;OAEG;IACU,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC;IAcnC;;OAEG;IACI,WAAW,IAAI;QACpB,WAAW,CAAC,EAAE,MAAM,CAAC;QACrB,WAAW,CAAC,EAAE,MAAM,CAAC;QACrB,aAAa,CAAC,EAAE,MAAM,CAAC;QACvB,YAAY,CAAC,EAAE,MAAM,CAAC;KACvB;CAgCF"}
@@ -0,0 +1,489 @@
1
+ /**
2
+ * AppLogger - 個別アプリケーションのログ管理(リファクタリング後)
3
+ */
4
+ import * as fs from 'fs';
5
+ import * as path from 'path';
6
+ import { DEFAULT_LOG_MANAGER_CONFIG, } from './log-manager-config.js';
7
+ import { FileManager } from './log-file-manager.js';
8
+ import { LogPreprocessor } from './log-preprocessor.js';
9
+ import { DefaultLogLevelStrategy } from './log-level-strategy.js';
10
+ import { EventManager } from './log-event-manager.js';
11
+ import { LogBuffer } from './log-buffer.js';
12
+ export class AppLogger {
13
+ logDir;
14
+ eventEmitter;
15
+ managerConfig;
16
+ logInfo;
17
+ watchers = [];
18
+ logBuffer;
19
+ partialLines = new Map();
20
+ // 依存性注入されたサービスクラス
21
+ fileManager;
22
+ logPreprocessor;
23
+ logLevelStrategy;
24
+ eventManager;
25
+ constructor(appName, config, logDir, eventEmitter, managerConfig = DEFAULT_LOG_MANAGER_CONFIG,
26
+ // 依存性注入(テスト時にはモックを注入可能)
27
+ fileManager, logPreprocessor, logLevelStrategy, eventManager) {
28
+ this.logDir = logDir;
29
+ this.eventEmitter = eventEmitter;
30
+ this.managerConfig = managerConfig;
31
+ this.logInfo = this.initializeLogInfo(appName, config);
32
+ // 依存性注入の実装(DI コンテナパターン)
33
+ this.fileManager = fileManager || new FileManager(this.managerConfig);
34
+ this.logPreprocessor =
35
+ logPreprocessor || new LogPreprocessor(this.managerConfig);
36
+ this.logLevelStrategy = logLevelStrategy || new DefaultLogLevelStrategy();
37
+ this.eventManager = eventManager || new EventManager(this.eventEmitter);
38
+ this.ensureLogFiles();
39
+ this.logBuffer = new LogBuffer(async (entries) => await this.flushBufferedEntries(entries), this.managerConfig);
40
+ }
41
+ /**
42
+ * ログ情報の初期化
43
+ */
44
+ initializeLogInfo(appName, config) {
45
+ const namespace = config.namespace || 'default';
46
+ // ログファイルパスの決定(仕様に従った優先順位)
47
+ let logFile = null;
48
+ let outFile = null;
49
+ let errorFile = null;
50
+ if (config.outFile && config.errorFile) {
51
+ // 1. out_file + error_file が指定時 → これらを使用、log_fileは無視
52
+ outFile = config.outFile;
53
+ errorFile = config.errorFile;
54
+ }
55
+ else if (config.logFile) {
56
+ // 2. log_file のみ指定時 → stdout/stderrを同一ファイルに出力
57
+ logFile = config.logFile;
58
+ }
59
+ else {
60
+ // 3. 未指定時 → デフォルトパス
61
+ logFile = path.join(this.logDir, `${appName}.jsonl`);
62
+ }
63
+ return {
64
+ appName,
65
+ namespace,
66
+ logFile,
67
+ outFile,
68
+ errorFile,
69
+ streams: {},
70
+ };
71
+ }
72
+ /**
73
+ * ログファイルの事前作成(FileManagerに委譲)
74
+ */
75
+ ensureLogFiles() {
76
+ // 統合ログファイル
77
+ if (this.logInfo.logFile) {
78
+ this.fileManager.ensureFileExists(this.logInfo.logFile);
79
+ }
80
+ // stdout専用ファイル
81
+ if (this.logInfo.outFile) {
82
+ this.fileManager.ensureFileExists(this.logInfo.outFile);
83
+ }
84
+ // stderr専用ファイル
85
+ if (this.logInfo.errorFile) {
86
+ this.fileManager.ensureFileExists(this.logInfo.errorFile);
87
+ }
88
+ }
89
+ /**
90
+ * プロセス出力のキャプチャとログ記録
91
+ * ProcessLifecycleManagerからの stdout/stderr データを処理
92
+ */
93
+ captureProcessOutput(type, data) {
94
+ // 既存の部分的な行を取得
95
+ const existingPartial = this.partialLines.get(type) || '';
96
+ const fullData = existingPartial + data;
97
+ // 改行で分割
98
+ const lines = fullData.split('\n');
99
+ // 最後の要素は部分的な行か空文字列
100
+ const partialLine = lines.pop() || '';
101
+ this.partialLines.set(type, partialLine);
102
+ // 完全な行を処理
103
+ for (const line of lines) {
104
+ if (line.length > 0) {
105
+ this.writeLogWithPreprocessing(type, line);
106
+ }
107
+ }
108
+ }
109
+ /**
110
+ * ログエントリの前処理を含む書き込み(10行以下に分割)
111
+ */
112
+ writeLogWithPreprocessing(type, message) {
113
+ const processedMessage = this.logPreprocessor.preprocessMessage(message);
114
+ const logEntry = this.createLogEntry(type, processedMessage);
115
+ const targetFiles = this.determineTargetFiles(type);
116
+ this.addToBufferAndEmitEvent(logEntry, targetFiles);
117
+ }
118
+ /**
119
+ * ログエントリの作成(10行以下)
120
+ */
121
+ createLogEntry(type, processedMessage) {
122
+ return {
123
+ timestamp: Date.now(),
124
+ level: this.logLevelStrategy.determineLevel(type, processedMessage),
125
+ message: processedMessage,
126
+ app: this.logInfo.appName,
127
+ namespace: this.logInfo.namespace,
128
+ type,
129
+ };
130
+ }
131
+ /**
132
+ * バッファ追加とイベント発行(10行以下)
133
+ */
134
+ addToBufferAndEmitEvent(logEntry, targetFiles) {
135
+ const bufferedEntry = {
136
+ logEntry,
137
+ targetFiles,
138
+ timestamp: Date.now(),
139
+ };
140
+ const added = this.logBuffer.addEntry(bufferedEntry);
141
+ this.handleBufferBackpressure(added);
142
+ this.eventManager.emitLogEvent(logEntry);
143
+ }
144
+ /**
145
+ * バッファバックプレッシャーの処理(10行以下)
146
+ */
147
+ handleBufferBackpressure(added) {
148
+ if (!added) {
149
+ const warningMessage = `Log buffer backpressure active for app: ${this.logInfo.appName}`;
150
+ console.warn(`[AppLogger] ${warningMessage}`);
151
+ // バックプレッシャーイベントを発行
152
+ this.eventEmitter.emit('bufferWarning', {
153
+ message: warningMessage,
154
+ appName: this.logInfo.appName,
155
+ timestamp: Date.now(),
156
+ });
157
+ }
158
+ }
159
+ /**
160
+ * 書き込み対象ファイルの決定(関数分割)
161
+ */
162
+ determineTargetFiles(type) {
163
+ const targetFiles = [];
164
+ if (this.logInfo.logFile) {
165
+ targetFiles.push(this.logInfo.logFile);
166
+ }
167
+ if (type === 'stdout' && this.logInfo.outFile) {
168
+ targetFiles.push(this.logInfo.outFile);
169
+ }
170
+ else if (type === 'stderr' && this.logInfo.errorFile) {
171
+ targetFiles.push(this.logInfo.errorFile);
172
+ }
173
+ return targetFiles;
174
+ }
175
+ /**
176
+ * ログエントリの書き込み(互換性のため維持)
177
+ */
178
+ writeLog(type, message) {
179
+ this.writeLogWithPreprocessing(type, message);
180
+ }
181
+ // preprocessLogMessage は LogPreprocessor に移動済み
182
+ /**
183
+ * バッファされたエントリをファイルに書き込み(20行以下に分割)
184
+ */
185
+ async flushBufferedEntries(entries) {
186
+ // ファイル別にエントリをグループ化
187
+ const fileEntries = this.groupEntriesByFile(entries);
188
+ // ファイル別に並列書き込み
189
+ const writePromises = this.createWritePromises(fileEntries);
190
+ // 全ての書き込みの完了を待機
191
+ await this.executeParallelWrites(writePromises);
192
+ }
193
+ /**
194
+ * エントリをファイル別にグループ化(関数分割)
195
+ */
196
+ groupEntriesByFile(entries) {
197
+ const fileEntries = new Map();
198
+ for (const bufferedEntry of entries) {
199
+ for (const filePath of bufferedEntry.targetFiles) {
200
+ if (!fileEntries.has(filePath)) {
201
+ fileEntries.set(filePath, []);
202
+ }
203
+ fileEntries.get(filePath).push(bufferedEntry.logEntry);
204
+ }
205
+ }
206
+ return fileEntries;
207
+ }
208
+ /**
209
+ * 書き込みPromise配列を作成(関数分割)
210
+ */
211
+ createWritePromises(fileEntries) {
212
+ const writePromises = [];
213
+ for (const [filePath, logEntries] of fileEntries) {
214
+ const logLines = logEntries
215
+ .map((entry) => JSON.stringify(entry) + '\n')
216
+ .join('');
217
+ const writePromise = this.writeToFileWithRetryAndHandleError(filePath, logLines);
218
+ writePromises.push(writePromise);
219
+ }
220
+ return writePromises;
221
+ }
222
+ /**
223
+ * 並列書き込みを実行(関数分割)
224
+ */
225
+ async executeParallelWrites(writePromises) {
226
+ try {
227
+ await Promise.allSettled(writePromises);
228
+ }
229
+ catch (error) {
230
+ // Promise.allSettledは例外を投げないが、念のため
231
+ console.error(`[AppLogger] Unexpected error during batch write: ${error.message}`);
232
+ }
233
+ }
234
+ /**
235
+ * リトライ機能付きファイル書き込みとエラーハンドリング
236
+ */
237
+ async writeToFileWithRetryAndHandleError(filePath, content) {
238
+ try {
239
+ // FileManager に委譲
240
+ await this.fileManager.writeToFileWithRetry(filePath, content, this.managerConfig.file.maxRetries);
241
+ }
242
+ catch (error) {
243
+ const lastError = error;
244
+ // ディスク容量不足の場合は特別な処理
245
+ if (lastError.message.includes('ENOSPC')) {
246
+ this.handleDiskSpaceError(filePath);
247
+ }
248
+ else {
249
+ // その他のエラー(権限エラーなど)もイベント発行
250
+ this.eventEmitter.emit('error', {
251
+ message: lastError.message,
252
+ filePath,
253
+ appName: this.logInfo.appName,
254
+ timestamp: Date.now(),
255
+ error: lastError,
256
+ });
257
+ }
258
+ // エラーを再スロー(上位でハンドリングできるように)
259
+ // throw lastError;
260
+ }
261
+ }
262
+ /**
263
+ * ディスク容量不足エラーの処理(EventManagerに委譲)
264
+ */
265
+ handleDiskSpaceError(filePath) {
266
+ const errorMessage = `Disk space error detected for ${filePath}. Consider implementing log rotation or cleanup.`;
267
+ console.error(`[AppLogger] ${errorMessage}`);
268
+ // イベントとして通知(EventManagerに委譲)
269
+ this.eventManager.emitDiskSpaceErrorEvent({
270
+ filePath,
271
+ appName: this.logInfo.appName,
272
+ timestamp: Date.now(),
273
+ message: errorMessage,
274
+ });
275
+ }
276
+ // determineLogLevel は LogLevelStrategy に移動済み
277
+ /**
278
+ * ファイル監視の開始
279
+ */
280
+ async startWatching() {
281
+ // 既存の監視を停止
282
+ this.stopWatching();
283
+ const filesToWatch = [];
284
+ if (this.logInfo.logFile) {
285
+ filesToWatch.push({ file: this.logInfo.logFile, type: 'combined' });
286
+ }
287
+ if (this.logInfo.outFile) {
288
+ filesToWatch.push({ file: this.logInfo.outFile, type: 'stdout' });
289
+ }
290
+ if (this.logInfo.errorFile) {
291
+ filesToWatch.push({ file: this.logInfo.errorFile, type: 'stderr' });
292
+ }
293
+ for (const { file, type } of filesToWatch) {
294
+ if (fs.existsSync(file)) {
295
+ try {
296
+ const watcher = fs.watch(file, (eventType) => {
297
+ if (eventType === 'change') {
298
+ // EventManager に委譲
299
+ this.eventManager.emitFileChangeEvent({
300
+ appName: this.logInfo.appName,
301
+ file,
302
+ type,
303
+ });
304
+ }
305
+ });
306
+ this.watchers.push(watcher);
307
+ }
308
+ catch (error) {
309
+ console.warn(`[AppLogger] Failed to watch ${file}: ${error.message}`);
310
+ }
311
+ }
312
+ }
313
+ }
314
+ /**
315
+ * ファイル監視の停止
316
+ */
317
+ stopWatching() {
318
+ for (const watcher of this.watchers) {
319
+ watcher.close();
320
+ }
321
+ this.watchers = [];
322
+ }
323
+ /**
324
+ * ログの読み込み(20行以下に分割)
325
+ */
326
+ async readLogs(options = {}) {
327
+ const { lines = 100 } = options;
328
+ // ログファイルの選択
329
+ const logFile = this.selectLogFile(options.type);
330
+ if (!logFile || !fs.existsSync(logFile)) {
331
+ return [];
332
+ }
333
+ // ファイルからログエントリを読み込み・解析
334
+ return this.readAndParseLogEntries(logFile, lines, options);
335
+ }
336
+ /**
337
+ * ログファイルの選択(関数分割)
338
+ */
339
+ selectLogFile(type) {
340
+ if (type && type.length === 1) {
341
+ switch (type[0]) {
342
+ case 'stdout':
343
+ return this.logInfo.outFile || this.logInfo.logFile;
344
+ case 'stderr':
345
+ return this.logInfo.errorFile || this.logInfo.logFile;
346
+ default:
347
+ return this.logInfo.logFile;
348
+ }
349
+ }
350
+ return this.logInfo.logFile;
351
+ }
352
+ /**
353
+ * ログエントリの読み込みと解析(関数分割)
354
+ */
355
+ async readAndParseLogEntries(logFile, lines, options) {
356
+ try {
357
+ // FileManager に委譲
358
+ const recentLines = await this.fileManager.readTailLines(logFile, lines);
359
+ return this.parseLogLines(recentLines, options);
360
+ }
361
+ catch (error) {
362
+ console.error(`[AppLogger] Failed to read log file ${logFile}: ${error.message}`);
363
+ return [];
364
+ }
365
+ }
366
+ /**
367
+ * ログ行の解析とフィルタリング(関数分割)
368
+ */
369
+ parseLogLines(lines, options) {
370
+ const logEntries = [];
371
+ for (const line of lines) {
372
+ try {
373
+ const entry = JSON.parse(line);
374
+ // フィルタリング適用
375
+ if (this.matchesFilter(entry, options)) {
376
+ logEntries.push(entry);
377
+ }
378
+ }
379
+ catch {
380
+ console.warn(`[AppLogger] Failed to parse log line: ${line}`);
381
+ }
382
+ }
383
+ return logEntries;
384
+ }
385
+ // readTailLines は FileManager に移動済み
386
+ /**
387
+ * ログエントリがフィルタ条件に一致するかチェック
388
+ */
389
+ matchesFilter(entry, options) {
390
+ // レベルフィルタ
391
+ if (options.level && !options.level.includes(entry.level)) {
392
+ return false;
393
+ }
394
+ // タイプフィルタ
395
+ if (options.type && !options.type.includes(entry.type)) {
396
+ return false;
397
+ }
398
+ // 時間範囲フィルタ
399
+ if (options.since && entry.timestamp < options.since) {
400
+ return false;
401
+ }
402
+ if (options.until && entry.timestamp > options.until) {
403
+ return false;
404
+ }
405
+ return true;
406
+ }
407
+ /**
408
+ * ログのクリア
409
+ */
410
+ async clearLogs() {
411
+ const filesToClear = [];
412
+ if (this.logInfo.logFile) {
413
+ filesToClear.push(this.logInfo.logFile);
414
+ }
415
+ if (this.logInfo.outFile) {
416
+ filesToClear.push(this.logInfo.outFile);
417
+ }
418
+ if (this.logInfo.errorFile) {
419
+ filesToClear.push(this.logInfo.errorFile);
420
+ }
421
+ for (const file of filesToClear) {
422
+ if (fs.existsSync(file)) {
423
+ fs.writeFileSync(file, '');
424
+ }
425
+ }
426
+ }
427
+ /**
428
+ * 残りの部分的な行を強制フラッシュ
429
+ */
430
+ flushPartialLines() {
431
+ for (const [type, partialLine] of this.partialLines) {
432
+ if (partialLine.trim().length > 0) {
433
+ this.writeLogWithPreprocessing(type, partialLine);
434
+ }
435
+ }
436
+ this.partialLines.clear();
437
+ }
438
+ /**
439
+ * バッファ統計情報の取得
440
+ */
441
+ getBufferStats() {
442
+ return this.logBuffer.getStats();
443
+ }
444
+ /**
445
+ * バッファを強制フラッシュ
446
+ */
447
+ async flushBuffer() {
448
+ await this.logBuffer.flush();
449
+ }
450
+ /**
451
+ * リソースのクリーンアップ
452
+ */
453
+ async close() {
454
+ // 残りの部分的な行をフラッシュ
455
+ this.flushPartialLines();
456
+ // バッファをクリーンアップ(フラッシュ含む)
457
+ await this.logBuffer.cleanup();
458
+ // ファイル監視停止
459
+ this.stopWatching();
460
+ // ストリーム管理は不要
461
+ this.logInfo.streams = {};
462
+ }
463
+ /**
464
+ * ログ統計情報の取得
465
+ */
466
+ getLogStats() {
467
+ const stats = {};
468
+ try {
469
+ if (this.logInfo.logFile && fs.existsSync(this.logInfo.logFile)) {
470
+ const stat = fs.statSync(this.logInfo.logFile);
471
+ stats.logFileSize = stat.size;
472
+ stats.lastModified = stat.mtime.getTime();
473
+ }
474
+ if (this.logInfo.outFile && fs.existsSync(this.logInfo.outFile)) {
475
+ const stat = fs.statSync(this.logInfo.outFile);
476
+ stats.outFileSize = stat.size;
477
+ }
478
+ if (this.logInfo.errorFile && fs.existsSync(this.logInfo.errorFile)) {
479
+ const stat = fs.statSync(this.logInfo.errorFile);
480
+ stats.errorFileSize = stat.size;
481
+ }
482
+ }
483
+ catch (error) {
484
+ console.warn(`[AppLogger] Failed to get stats: ${error.message}`);
485
+ }
486
+ return stats;
487
+ }
488
+ }
489
+ //# sourceMappingURL=app-logger.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"app-logger.js","sourceRoot":"","sources":["../../../src/services/app-logger.ts"],"names":[],"mappings":"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"}