@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.
- package/dist/src/cli/commands/help.d.ts.map +1 -1
- package/dist/src/cli/commands/help.js +3 -1
- package/dist/src/cli/commands/help.js.map +1 -1
- package/dist/src/cli/index.js +6 -2
- package/dist/src/cli/index.js.map +1 -1
- package/dist/src/cli/parser.d.ts.map +1 -1
- package/dist/src/cli/parser.js +20 -0
- package/dist/src/cli/parser.js.map +1 -1
- package/dist/src/cli/utils/find-package-json.d.ts +4 -0
- package/dist/src/cli/utils/find-package-json.d.ts.map +1 -0
- package/dist/src/cli/utils/find-package-json.js +15 -0
- package/dist/src/cli/utils/find-package-json.js.map +1 -0
- package/dist/src/config/config-loader.d.ts +1 -0
- package/dist/src/config/config-loader.d.ts.map +1 -1
- package/dist/src/config/config-loader.js +16 -6
- package/dist/src/config/config-loader.js.map +1 -1
- package/dist/src/config/config-validator.d.ts +18 -49
- package/dist/src/config/config-validator.d.ts.map +1 -1
- package/dist/src/config/config-validator.js +64 -172
- package/dist/src/config/config-validator.js.map +1 -1
- package/dist/src/config/path-security-validator.d.ts +39 -0
- package/dist/src/config/path-security-validator.d.ts.map +1 -0
- package/dist/src/config/path-security-validator.js +134 -0
- package/dist/src/config/path-security-validator.js.map +1 -0
- package/dist/src/config/secure-config-loader.d.ts.map +1 -1
- package/dist/src/config/secure-config-loader.js +10 -2
- package/dist/src/config/secure-config-loader.js.map +1 -1
- package/dist/src/config/validation-suggestions.d.ts +13 -0
- package/dist/src/config/validation-suggestions.d.ts.map +1 -0
- package/dist/src/config/validation-suggestions.js +40 -0
- package/dist/src/config/validation-suggestions.js.map +1 -0
- package/dist/src/config/validation-types.d.ts +38 -0
- package/dist/src/config/validation-types.d.ts.map +1 -0
- package/dist/src/config/validation-types.js +7 -0
- package/dist/src/config/validation-types.js.map +1 -0
- package/dist/src/daemon/component-command-wiring.d.ts +19 -0
- package/dist/src/daemon/component-command-wiring.d.ts.map +1 -0
- package/dist/src/daemon/component-command-wiring.js +27 -0
- package/dist/src/daemon/component-command-wiring.js.map +1 -0
- package/dist/src/daemon/component-daemon-interface.d.ts +38 -0
- package/dist/src/daemon/component-daemon-interface.d.ts.map +1 -0
- package/dist/src/daemon/component-daemon-interface.js +72 -0
- package/dist/src/daemon/component-daemon-interface.js.map +1 -0
- package/dist/src/daemon/component-health.d.ts +38 -0
- package/dist/src/daemon/component-health.d.ts.map +1 -0
- package/dist/src/daemon/component-health.js +146 -0
- package/dist/src/daemon/component-health.js.map +1 -0
- package/dist/src/daemon/component-manager-errors.d.ts +20 -0
- package/dist/src/daemon/component-manager-errors.d.ts.map +1 -0
- package/dist/src/daemon/component-manager-errors.js +30 -0
- package/dist/src/daemon/component-manager-errors.js.map +1 -0
- package/dist/src/daemon/component-manager-types.d.ts +23 -0
- package/dist/src/daemon/component-manager-types.d.ts.map +1 -0
- package/dist/src/daemon/component-manager-types.js +5 -0
- package/dist/src/daemon/component-manager-types.js.map +1 -0
- package/dist/src/daemon/component-manager.d.ts +16 -64
- package/dist/src/daemon/component-manager.d.ts.map +1 -1
- package/dist/src/daemon/component-manager.js +72 -509
- package/dist/src/daemon/component-manager.js.map +1 -1
- package/dist/src/daemon/component-registration.d.ts +14 -0
- package/dist/src/daemon/component-registration.d.ts.map +1 -0
- package/dist/src/daemon/component-registration.js +92 -0
- package/dist/src/daemon/component-registration.js.map +1 -0
- package/dist/src/daemon/component-streaming.d.ts +36 -0
- package/dist/src/daemon/component-streaming.d.ts.map +1 -0
- package/dist/src/daemon/component-streaming.js +112 -0
- package/dist/src/daemon/component-streaming.js.map +1 -0
- package/dist/src/daemon/daemon-lifecycle.d.ts +37 -0
- package/dist/src/daemon/daemon-lifecycle.d.ts.map +1 -0
- package/dist/src/daemon/daemon-lifecycle.js +362 -0
- package/dist/src/daemon/daemon-lifecycle.js.map +1 -0
- package/dist/src/daemon/daemon-queries.d.ts +53 -0
- package/dist/src/daemon/daemon-queries.d.ts.map +1 -0
- package/dist/src/daemon/daemon-queries.js +113 -0
- package/dist/src/daemon/daemon-queries.js.map +1 -0
- package/dist/src/daemon/daemon-types.d.ts +30 -0
- package/dist/src/daemon/daemon-types.d.ts.map +1 -0
- package/dist/src/daemon/daemon-types.js +8 -0
- package/dist/src/daemon/daemon-types.js.map +1 -0
- package/dist/src/daemon/disposable-base.d.ts +49 -0
- package/dist/src/daemon/disposable-base.d.ts.map +1 -0
- package/dist/src/daemon/disposable-base.js +70 -0
- package/dist/src/daemon/disposable-base.js.map +1 -0
- package/dist/src/daemon/disposal-guard.d.ts +27 -0
- package/dist/src/daemon/disposal-guard.d.ts.map +1 -0
- package/dist/src/daemon/disposal-guard.js +58 -0
- package/dist/src/daemon/disposal-guard.js.map +1 -0
- package/dist/src/daemon/ipc-command-handler.d.ts +8 -34
- package/dist/src/daemon/ipc-command-handler.d.ts.map +1 -1
- package/dist/src/daemon/ipc-command-handler.js +14 -362
- package/dist/src/daemon/ipc-command-handler.js.map +1 -1
- package/dist/src/daemon/log-command-handlers.d.ts +19 -0
- package/dist/src/daemon/log-command-handlers.d.ts.map +1 -0
- package/dist/src/daemon/log-command-handlers.js +114 -0
- package/dist/src/daemon/log-command-handlers.js.map +1 -0
- package/dist/src/daemon/process-command-handlers.d.ts +32 -0
- package/dist/src/daemon/process-command-handlers.d.ts.map +1 -0
- package/dist/src/daemon/process-command-handlers.js +223 -0
- package/dist/src/daemon/process-command-handlers.js.map +1 -0
- package/dist/src/daemon/procman-daemon.d.ts +22 -98
- package/dist/src/daemon/procman-daemon.d.ts.map +1 -1
- package/dist/src/daemon/procman-daemon.js +107 -604
- package/dist/src/daemon/procman-daemon.js.map +1 -1
- package/dist/src/daemon/resource-manager.d.ts +6 -124
- package/dist/src/daemon/resource-manager.d.ts.map +1 -1
- package/dist/src/daemon/resource-manager.js +5 -231
- package/dist/src/daemon/resource-manager.js.map +1 -1
- package/dist/src/daemon/resource-types.d.ts +23 -0
- package/dist/src/daemon/resource-types.d.ts.map +1 -0
- package/dist/src/daemon/resource-types.js +7 -0
- package/dist/src/daemon/resource-types.js.map +1 -0
- package/dist/src/daemon/shutdown-orchestrator.d.ts +32 -0
- package/dist/src/daemon/shutdown-orchestrator.d.ts.map +1 -0
- package/dist/src/daemon/shutdown-orchestrator.js +123 -0
- package/dist/src/daemon/shutdown-orchestrator.js.map +1 -0
- package/dist/src/daemon/tracked-resources.d.ts +60 -0
- package/dist/src/daemon/tracked-resources.d.ts.map +1 -0
- package/dist/src/daemon/tracked-resources.js +124 -0
- package/dist/src/daemon/tracked-resources.js.map +1 -0
- package/dist/src/process-manager/index.d.ts +5 -1
- package/dist/src/process-manager/index.d.ts.map +1 -1
- package/dist/src/process-manager/index.js +3 -0
- package/dist/src/process-manager/index.js.map +1 -1
- package/dist/src/process-manager/interfaces/process-group.d.ts +6 -0
- package/dist/src/process-manager/interfaces/process-group.d.ts.map +1 -1
- package/dist/src/process-manager/managed-process-events.d.ts +22 -0
- package/dist/src/process-manager/managed-process-events.d.ts.map +1 -0
- package/dist/src/process-manager/managed-process-events.js +5 -0
- package/dist/src/process-manager/managed-process-events.js.map +1 -0
- package/dist/src/process-manager/managed-process-info.d.ts +11 -53
- package/dist/src/process-manager/managed-process-info.d.ts.map +1 -1
- package/dist/src/process-manager/managed-process-info.js +46 -133
- package/dist/src/process-manager/managed-process-info.js.map +1 -1
- package/dist/src/process-manager/process-batch-operations.d.ts +62 -0
- package/dist/src/process-manager/process-batch-operations.d.ts.map +1 -0
- package/dist/src/process-manager/process-batch-operations.js +80 -0
- package/dist/src/process-manager/process-batch-operations.js.map +1 -0
- package/dist/src/process-manager/process-config.d.ts +49 -0
- package/dist/src/process-manager/process-config.d.ts.map +1 -0
- package/dist/src/process-manager/process-config.js +68 -0
- package/dist/src/process-manager/process-config.js.map +1 -0
- package/dist/src/process-manager/process-event-forwarding.d.ts +18 -0
- package/dist/src/process-manager/process-event-forwarding.d.ts.map +1 -0
- package/dist/src/process-manager/process-event-forwarding.js +105 -0
- package/dist/src/process-manager/process-event-forwarding.js.map +1 -0
- package/dist/src/process-manager/process-group-manager.d.ts.map +1 -1
- package/dist/src/process-manager/process-group-manager.js +0 -1
- package/dist/src/process-manager/process-group-manager.js.map +1 -1
- package/dist/src/process-manager/process-info-queries.d.ts +48 -0
- package/dist/src/process-manager/process-info-queries.d.ts.map +1 -0
- package/dist/src/process-manager/process-info-queries.js +92 -0
- package/dist/src/process-manager/process-info-queries.js.map +1 -0
- package/dist/src/process-manager/process-manager.d.ts +5 -174
- package/dist/src/process-manager/process-manager.d.ts.map +1 -1
- package/dist/src/process-manager/process-manager.js +58 -398
- package/dist/src/process-manager/process-manager.js.map +1 -1
- package/dist/src/process-manager/process-monitoring.d.ts +80 -0
- package/dist/src/process-manager/process-monitoring.d.ts.map +1 -0
- package/dist/src/process-manager/process-monitoring.js +142 -0
- package/dist/src/process-manager/process-monitoring.js.map +1 -0
- package/dist/src/process-manager/process-statistics.d.ts +37 -0
- package/dist/src/process-manager/process-statistics.d.ts.map +1 -0
- package/dist/src/process-manager/process-statistics.js +24 -0
- package/dist/src/process-manager/process-statistics.js.map +1 -0
- package/dist/src/process-manager/restart-manager.d.ts +82 -0
- package/dist/src/process-manager/restart-manager.d.ts.map +1 -0
- package/dist/src/process-manager/restart-manager.js +150 -0
- package/dist/src/process-manager/restart-manager.js.map +1 -0
- package/dist/src/services/app-logger.d.ts +144 -0
- package/dist/src/services/app-logger.d.ts.map +1 -0
- package/dist/src/services/app-logger.js +489 -0
- package/dist/src/services/app-logger.js.map +1 -0
- package/dist/src/services/log-buffer.d.ts +35 -0
- package/dist/src/services/log-buffer.d.ts.map +1 -0
- package/dist/src/services/log-buffer.js +87 -0
- package/dist/src/services/log-buffer.js.map +1 -0
- package/dist/src/services/log-event-manager.d.ts +32 -0
- package/dist/src/services/log-event-manager.d.ts.map +1 -0
- package/dist/src/services/log-event-manager.js +31 -0
- package/dist/src/services/log-event-manager.js.map +1 -0
- package/dist/src/services/log-file-manager.d.ts +46 -0
- package/dist/src/services/log-file-manager.d.ts.map +1 -0
- package/dist/src/services/log-file-manager.js +156 -0
- package/dist/src/services/log-file-manager.js.map +1 -0
- package/dist/src/services/log-level-strategy.d.ts +19 -0
- package/dist/src/services/log-level-strategy.d.ts.map +1 -0
- package/dist/src/services/log-level-strategy.js +40 -0
- package/dist/src/services/log-level-strategy.js.map +1 -0
- package/dist/src/services/log-manager-types.d.ts +117 -0
- package/dist/src/services/log-manager-types.d.ts.map +1 -0
- package/dist/src/services/log-manager-types.js +12 -0
- package/dist/src/services/log-manager-types.js.map +1 -0
- package/dist/src/services/log-manager.d.ts +8 -35
- package/dist/src/services/log-manager.d.ts.map +1 -1
- package/dist/src/services/log-manager.js +10 -870
- package/dist/src/services/log-manager.js.map +1 -1
- package/dist/src/services/log-preprocessor.d.ts +30 -0
- package/dist/src/services/log-preprocessor.d.ts.map +1 -0
- package/dist/src/services/log-preprocessor.js +65 -0
- package/dist/src/services/log-preprocessor.js.map +1 -0
- package/dist/src/services/process-log-integration.d.ts +7 -2
- package/dist/src/services/process-log-integration.d.ts.map +1 -1
- package/dist/src/services/process-log-integration.js.map +1 -1
- package/package.json +5 -7
|
@@ -0,0 +1,35 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* LogBuffer - 高頻度書き込み時のバッファリング管理
|
|
3
|
+
*/
|
|
4
|
+
import { LogManagerConfig } from './log-manager-config.js';
|
|
5
|
+
import { BufferedLogEntry } from './log-manager-types.js';
|
|
6
|
+
export declare class LogBuffer {
|
|
7
|
+
private onFlush;
|
|
8
|
+
private config;
|
|
9
|
+
private buffer;
|
|
10
|
+
private bufferSize;
|
|
11
|
+
private flushTimer;
|
|
12
|
+
private isBackpressured;
|
|
13
|
+
constructor(onFlush: (entries: BufferedLogEntry[]) => Promise<void>, config?: LogManagerConfig);
|
|
14
|
+
/**
|
|
15
|
+
* ログエントリをバッファに追加
|
|
16
|
+
*/
|
|
17
|
+
addEntry(entry: BufferedLogEntry): boolean;
|
|
18
|
+
/**
|
|
19
|
+
* バッファを強制フラッシュ
|
|
20
|
+
*/
|
|
21
|
+
flush(): Promise<void>;
|
|
22
|
+
/**
|
|
23
|
+
* バッファクリーンアップ
|
|
24
|
+
*/
|
|
25
|
+
cleanup(): Promise<void>;
|
|
26
|
+
/**
|
|
27
|
+
* バッファ統計情報
|
|
28
|
+
*/
|
|
29
|
+
getStats(): {
|
|
30
|
+
entryCount: number;
|
|
31
|
+
bufferSize: number;
|
|
32
|
+
isBackpressured: boolean;
|
|
33
|
+
};
|
|
34
|
+
}
|
|
35
|
+
//# sourceMappingURL=log-buffer.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"log-buffer.d.ts","sourceRoot":"","sources":["../../../src/services/log-buffer.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,EACL,gBAAgB,EAEjB,MAAM,yBAAyB,CAAC;AACjC,OAAO,EAAE,gBAAgB,EAAE,MAAM,wBAAwB,CAAC;AAE1D,qBAAa,SAAS;IAOlB,OAAO,CAAC,OAAO;IACf,OAAO,CAAC,MAAM;IAPhB,OAAO,CAAC,MAAM,CAA0B;IACxC,OAAO,CAAC,UAAU,CAAK;IACvB,OAAO,CAAC,UAAU,CAA8C;IAChE,OAAO,CAAC,eAAe,CAAS;gBAGtB,OAAO,EAAE,CAAC,OAAO,EAAE,gBAAgB,EAAE,KAAK,OAAO,CAAC,IAAI,CAAC,EACvD,MAAM,GAAE,gBAA6C;IAG/D;;OAEG;IACI,QAAQ,CAAC,KAAK,EAAE,gBAAgB,GAAG,OAAO;IA+BjD;;OAEG;IACU,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC;IAyBnC;;OAEG;IACU,OAAO,IAAI,OAAO,CAAC,IAAI,CAAC;IAQrC;;OAEG;IACI,QAAQ,IAAI;QACjB,UAAU,EAAE,MAAM,CAAC;QACnB,UAAU,EAAE,MAAM,CAAC;QACnB,eAAe,EAAE,OAAO,CAAC;KAC1B;CAOF"}
|
|
@@ -0,0 +1,87 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* LogBuffer - 高頻度書き込み時のバッファリング管理
|
|
3
|
+
*/
|
|
4
|
+
import { DEFAULT_LOG_MANAGER_CONFIG, } from './log-manager-config.js';
|
|
5
|
+
export class LogBuffer {
|
|
6
|
+
onFlush;
|
|
7
|
+
config;
|
|
8
|
+
buffer = [];
|
|
9
|
+
bufferSize = 0;
|
|
10
|
+
flushTimer = null;
|
|
11
|
+
isBackpressured = false;
|
|
12
|
+
constructor(onFlush, config = DEFAULT_LOG_MANAGER_CONFIG) {
|
|
13
|
+
this.onFlush = onFlush;
|
|
14
|
+
this.config = config;
|
|
15
|
+
}
|
|
16
|
+
/**
|
|
17
|
+
* ログエントリをバッファに追加
|
|
18
|
+
*/
|
|
19
|
+
addEntry(entry) {
|
|
20
|
+
// バックプレッシャー制御
|
|
21
|
+
if (this.isBackpressured) {
|
|
22
|
+
return false;
|
|
23
|
+
}
|
|
24
|
+
const entrySize = JSON.stringify(entry.logEntry).length;
|
|
25
|
+
// バッファサイズ制限チェック
|
|
26
|
+
if (this.bufferSize + entrySize > this.config.buffer.maxSize) {
|
|
27
|
+
this.flush();
|
|
28
|
+
}
|
|
29
|
+
this.buffer.push(entry);
|
|
30
|
+
this.bufferSize += entrySize;
|
|
31
|
+
// バックプレッシャー制御
|
|
32
|
+
if (this.bufferSize > this.config.buffer.backpressureThreshold) {
|
|
33
|
+
this.isBackpressured = true;
|
|
34
|
+
}
|
|
35
|
+
// 定期フラッシュタイマー設定
|
|
36
|
+
if (!this.flushTimer) {
|
|
37
|
+
this.flushTimer = setTimeout(async () => {
|
|
38
|
+
await this.flush();
|
|
39
|
+
}, this.config.buffer.flushInterval);
|
|
40
|
+
}
|
|
41
|
+
return true;
|
|
42
|
+
}
|
|
43
|
+
/**
|
|
44
|
+
* バッファを強制フラッシュ
|
|
45
|
+
*/
|
|
46
|
+
async flush() {
|
|
47
|
+
if (this.buffer.length === 0) {
|
|
48
|
+
return;
|
|
49
|
+
}
|
|
50
|
+
const entriesToFlush = [...this.buffer];
|
|
51
|
+
this.buffer = [];
|
|
52
|
+
this.bufferSize = 0;
|
|
53
|
+
this.isBackpressured = false;
|
|
54
|
+
if (this.flushTimer) {
|
|
55
|
+
clearTimeout(this.flushTimer);
|
|
56
|
+
this.flushTimer = null;
|
|
57
|
+
}
|
|
58
|
+
try {
|
|
59
|
+
await this.onFlush(entriesToFlush);
|
|
60
|
+
}
|
|
61
|
+
catch (error) {
|
|
62
|
+
console.error(`[LogBuffer] Failed to flush entries: ${error.message}`);
|
|
63
|
+
// 重要:失敗したエントリは失われるが、バッファが詰まるのを防ぐ
|
|
64
|
+
}
|
|
65
|
+
}
|
|
66
|
+
/**
|
|
67
|
+
* バッファクリーンアップ
|
|
68
|
+
*/
|
|
69
|
+
async cleanup() {
|
|
70
|
+
await this.flush();
|
|
71
|
+
if (this.flushTimer) {
|
|
72
|
+
clearTimeout(this.flushTimer);
|
|
73
|
+
this.flushTimer = null;
|
|
74
|
+
}
|
|
75
|
+
}
|
|
76
|
+
/**
|
|
77
|
+
* バッファ統計情報
|
|
78
|
+
*/
|
|
79
|
+
getStats() {
|
|
80
|
+
return {
|
|
81
|
+
entryCount: this.buffer.length,
|
|
82
|
+
bufferSize: this.bufferSize,
|
|
83
|
+
isBackpressured: this.isBackpressured,
|
|
84
|
+
};
|
|
85
|
+
}
|
|
86
|
+
}
|
|
87
|
+
//# sourceMappingURL=log-buffer.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"log-buffer.js","sourceRoot":"","sources":["../../../src/services/log-buffer.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,32 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* EventManager - イベント発行の専門クラス(単一責任原則)
|
|
3
|
+
*/
|
|
4
|
+
import { EventEmitter } from 'events';
|
|
5
|
+
import { LogEntry } from '../shared/logs.js';
|
|
6
|
+
import { IEventManager } from './log-manager-types.js';
|
|
7
|
+
export declare class EventManager implements IEventManager {
|
|
8
|
+
private eventEmitter;
|
|
9
|
+
constructor(eventEmitter: EventEmitter);
|
|
10
|
+
/**
|
|
11
|
+
* ログイベントの発行
|
|
12
|
+
*/
|
|
13
|
+
emitLogEvent(logEntry: LogEntry): void;
|
|
14
|
+
/**
|
|
15
|
+
* ファイル変更イベントの発行
|
|
16
|
+
*/
|
|
17
|
+
emitFileChangeEvent(data: {
|
|
18
|
+
appName: string;
|
|
19
|
+
file: string;
|
|
20
|
+
type: string;
|
|
21
|
+
}): void;
|
|
22
|
+
/**
|
|
23
|
+
* ディスク容量エラーイベントの発行
|
|
24
|
+
*/
|
|
25
|
+
emitDiskSpaceErrorEvent(data: {
|
|
26
|
+
filePath: string;
|
|
27
|
+
appName: string;
|
|
28
|
+
timestamp: number;
|
|
29
|
+
message: string;
|
|
30
|
+
}): void;
|
|
31
|
+
}
|
|
32
|
+
//# sourceMappingURL=log-event-manager.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"log-event-manager.d.ts","sourceRoot":"","sources":["../../../src/services/log-event-manager.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,EAAE,YAAY,EAAE,MAAM,QAAQ,CAAC;AACtC,OAAO,EAAE,QAAQ,EAAE,MAAM,mBAAmB,CAAC;AAE7C,OAAO,EAAE,aAAa,EAAE,MAAM,wBAAwB,CAAC;AAEvD,qBAAa,YAAa,YAAW,aAAa;IACpC,OAAO,CAAC,YAAY;gBAAZ,YAAY,EAAE,YAAY;IAE9C;;OAEG;IACI,YAAY,CAAC,QAAQ,EAAE,QAAQ,GAAG,IAAI;IAM7C;;OAEG;IACI,mBAAmB,CAAC,IAAI,EAAE;QAC/B,OAAO,EAAE,MAAM,CAAC;QAChB,IAAI,EAAE,MAAM,CAAC;QACb,IAAI,EAAE,MAAM,CAAC;KACd,GAAG,IAAI;IAIR;;OAEG;IACI,uBAAuB,CAAC,IAAI,EAAE;QACnC,QAAQ,EAAE,MAAM,CAAC;QACjB,OAAO,EAAE,MAAM,CAAC;QAChB,SAAS,EAAE,MAAM,CAAC;QAClB,OAAO,EAAE,MAAM,CAAC;KACjB,GAAG,IAAI;CAGT"}
|
|
@@ -0,0 +1,31 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* EventManager - イベント発行の専門クラス(単一責任原則)
|
|
3
|
+
*/
|
|
4
|
+
import { LOG_STREAM_EVENTS } from '../shared/constants-streaming.js';
|
|
5
|
+
export class EventManager {
|
|
6
|
+
eventEmitter;
|
|
7
|
+
constructor(eventEmitter) {
|
|
8
|
+
this.eventEmitter = eventEmitter;
|
|
9
|
+
}
|
|
10
|
+
/**
|
|
11
|
+
* ログイベントの発行
|
|
12
|
+
*/
|
|
13
|
+
emitLogEvent(logEntry) {
|
|
14
|
+
this.eventEmitter.emit('log', logEntry);
|
|
15
|
+
// ストリーミング用の新しいログイベントも発行
|
|
16
|
+
this.eventEmitter.emit(LOG_STREAM_EVENTS.NEW_LOG, logEntry);
|
|
17
|
+
}
|
|
18
|
+
/**
|
|
19
|
+
* ファイル変更イベントの発行
|
|
20
|
+
*/
|
|
21
|
+
emitFileChangeEvent(data) {
|
|
22
|
+
this.eventEmitter.emit('fileChange', data);
|
|
23
|
+
}
|
|
24
|
+
/**
|
|
25
|
+
* ディスク容量エラーイベントの発行
|
|
26
|
+
*/
|
|
27
|
+
emitDiskSpaceErrorEvent(data) {
|
|
28
|
+
this.eventEmitter.emit('diskSpaceError', data);
|
|
29
|
+
}
|
|
30
|
+
}
|
|
31
|
+
//# sourceMappingURL=log-event-manager.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"log-event-manager.js","sourceRoot":"","sources":["../../../src/services/log-event-manager.ts"],"names":[],"mappings":"AAAA;;GAEG;AAIH,OAAO,EAAE,iBAAiB,EAAE,MAAM,kCAAkC,CAAC;AAGrE,MAAM,OAAO,YAAY;IACH;IAApB,YAAoB,YAA0B;QAA1B,iBAAY,GAAZ,YAAY,CAAc;IAAG,CAAC;IAElD;;OAEG;IACI,YAAY,CAAC,QAAkB;QACpC,IAAI,CAAC,YAAY,CAAC,IAAI,CAAC,KAAK,EAAE,QAAQ,CAAC,CAAC;QACxC,wBAAwB;QACxB,IAAI,CAAC,YAAY,CAAC,IAAI,CAAC,iBAAiB,CAAC,OAAO,EAAE,QAAQ,CAAC,CAAC;IAC9D,CAAC;IAED;;OAEG;IACI,mBAAmB,CAAC,IAI1B;QACC,IAAI,CAAC,YAAY,CAAC,IAAI,CAAC,YAAY,EAAE,IAAI,CAAC,CAAC;IAC7C,CAAC;IAED;;OAEG;IACI,uBAAuB,CAAC,IAK9B;QACC,IAAI,CAAC,YAAY,CAAC,IAAI,CAAC,gBAAgB,EAAE,IAAI,CAAC,CAAC;IACjD,CAAC;CACF"}
|
|
@@ -0,0 +1,46 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* FileManager - ファイル操作の専門クラス(単一責任原則)
|
|
3
|
+
*/
|
|
4
|
+
import { LogManagerConfig } from './log-manager-config.js';
|
|
5
|
+
import { IFileManager } from './log-manager-types.js';
|
|
6
|
+
export declare class FileManager implements IFileManager {
|
|
7
|
+
private config;
|
|
8
|
+
constructor(config?: LogManagerConfig);
|
|
9
|
+
/**
|
|
10
|
+
* ファイルの存在確認・作成
|
|
11
|
+
*/
|
|
12
|
+
ensureFileExists(filePath: string): void;
|
|
13
|
+
/**
|
|
14
|
+
* ログディレクトリの確認・作成
|
|
15
|
+
*/
|
|
16
|
+
ensureLogDirectory(logDir: string): void;
|
|
17
|
+
/**
|
|
18
|
+
* ファイルの末尾から指定行数を効率的に読み込み
|
|
19
|
+
*/
|
|
20
|
+
readTailLines(filePath: string, maxLines: number): Promise<string[]>;
|
|
21
|
+
/**
|
|
22
|
+
* 大きなファイルから末尾行数を読み込み(関数分割)
|
|
23
|
+
*/
|
|
24
|
+
private readTailLinesFromLargeFile;
|
|
25
|
+
/**
|
|
26
|
+
* ファイルを後方から読み込んで行を取得(10行以下に分割)
|
|
27
|
+
*/
|
|
28
|
+
private readLinesBackward;
|
|
29
|
+
/**
|
|
30
|
+
* 後方からチャンクを読み込み(10行以下)
|
|
31
|
+
*/
|
|
32
|
+
private readChunkBackward;
|
|
33
|
+
/**
|
|
34
|
+
* バッファの行を処理(10行以下)
|
|
35
|
+
*/
|
|
36
|
+
private processBufferLines;
|
|
37
|
+
/**
|
|
38
|
+
* 部分的な行を抽出(10行以下)
|
|
39
|
+
*/
|
|
40
|
+
private extractPartialLine;
|
|
41
|
+
/**
|
|
42
|
+
* リトライ機能付きファイル書き込み
|
|
43
|
+
*/
|
|
44
|
+
writeToFileWithRetry(filePath: string, content: string, maxRetries: number): Promise<void>;
|
|
45
|
+
}
|
|
46
|
+
//# sourceMappingURL=log-file-manager.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"log-file-manager.d.ts","sourceRoot":"","sources":["../../../src/services/log-file-manager.ts"],"names":[],"mappings":"AAAA;;GAEG;AAKH,OAAO,EACL,gBAAgB,EAEjB,MAAM,yBAAyB,CAAC;AACjC,OAAO,EAAE,YAAY,EAAE,MAAM,wBAAwB,CAAC;AAEtD,qBAAa,WAAY,YAAW,YAAY;IAClC,OAAO,CAAC,MAAM;gBAAN,MAAM,GAAE,gBAA6C;IACzE;;OAEG;IACI,gBAAgB,CAAC,QAAQ,EAAE,MAAM,GAAG,IAAI;IAsB/C;;OAEG;IACI,kBAAkB,CAAC,MAAM,EAAE,MAAM,GAAG,IAAI;IAS/C;;OAEG;IACU,aAAa,CACxB,QAAQ,EAAE,MAAM,EAChB,QAAQ,EAAE,MAAM,GACf,OAAO,CAAC,MAAM,EAAE,CAAC;IAqBpB;;OAEG;IACH,OAAO,CAAC,0BAA0B;IAalC;;OAEG;IACH,OAAO,CAAC,iBAAiB;IAqBzB;;OAEG;IACH,OAAO,CAAC,iBAAiB;IAiBzB;;OAEG;IACH,OAAO,CAAC,kBAAkB;IAmB1B;;OAEG;IACH,OAAO,CAAC,kBAAkB;IAK1B;;OAEG;IACU,oBAAoB,CAC/B,QAAQ,EAAE,MAAM,EAChB,OAAO,EAAE,MAAM,EACf,UAAU,EAAE,MAAM,GACjB,OAAO,CAAC,IAAI,CAAC;CA2BjB"}
|
|
@@ -0,0 +1,156 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* FileManager - ファイル操作の専門クラス(単一責任原則)
|
|
3
|
+
*/
|
|
4
|
+
import * as fs from 'fs';
|
|
5
|
+
import { promises as fsPromises } from 'fs';
|
|
6
|
+
import * as path from 'path';
|
|
7
|
+
import { DEFAULT_LOG_MANAGER_CONFIG, } from './log-manager-config.js';
|
|
8
|
+
export class FileManager {
|
|
9
|
+
config;
|
|
10
|
+
constructor(config = DEFAULT_LOG_MANAGER_CONFIG) {
|
|
11
|
+
this.config = config;
|
|
12
|
+
}
|
|
13
|
+
/**
|
|
14
|
+
* ファイルの存在確認・作成
|
|
15
|
+
*/
|
|
16
|
+
ensureFileExists(filePath) {
|
|
17
|
+
try {
|
|
18
|
+
// ディレクトリの確認・作成
|
|
19
|
+
const dir = path.dirname(filePath);
|
|
20
|
+
if (!fs.existsSync(dir)) {
|
|
21
|
+
fs.mkdirSync(dir, {
|
|
22
|
+
recursive: true,
|
|
23
|
+
mode: this.config.file.directoryMode,
|
|
24
|
+
});
|
|
25
|
+
}
|
|
26
|
+
// ファイルが存在しない場合は空ファイルを作成
|
|
27
|
+
if (!fs.existsSync(filePath)) {
|
|
28
|
+
fs.writeFileSync(filePath, '', { mode: this.config.file.fileMode });
|
|
29
|
+
}
|
|
30
|
+
}
|
|
31
|
+
catch (error) {
|
|
32
|
+
console.warn(`[FileManager] Failed to ensure file exists ${filePath}: ${error.message}`);
|
|
33
|
+
}
|
|
34
|
+
}
|
|
35
|
+
/**
|
|
36
|
+
* ログディレクトリの確認・作成
|
|
37
|
+
*/
|
|
38
|
+
ensureLogDirectory(logDir) {
|
|
39
|
+
if (!fs.existsSync(logDir)) {
|
|
40
|
+
fs.mkdirSync(logDir, {
|
|
41
|
+
recursive: true,
|
|
42
|
+
mode: this.config.file.directoryMode,
|
|
43
|
+
});
|
|
44
|
+
}
|
|
45
|
+
}
|
|
46
|
+
/**
|
|
47
|
+
* ファイルの末尾から指定行数を効率的に読み込み
|
|
48
|
+
*/
|
|
49
|
+
async readTailLines(filePath, maxLines) {
|
|
50
|
+
const stat = fs.statSync(filePath);
|
|
51
|
+
const fileSize = stat.size;
|
|
52
|
+
if (fileSize === 0) {
|
|
53
|
+
return [];
|
|
54
|
+
}
|
|
55
|
+
// 小さなファイルの場合は全体を読み込み
|
|
56
|
+
if (fileSize < this.config.performance.smallFileThreshold) {
|
|
57
|
+
const content = fs.readFileSync(filePath, 'utf8');
|
|
58
|
+
return content
|
|
59
|
+
.split('\n')
|
|
60
|
+
.filter((line) => line.trim())
|
|
61
|
+
.slice(-maxLines);
|
|
62
|
+
}
|
|
63
|
+
// 大きなファイルの場合は末尾から効率的に読み込み
|
|
64
|
+
return this.readTailLinesFromLargeFile(filePath, maxLines, fileSize);
|
|
65
|
+
}
|
|
66
|
+
/**
|
|
67
|
+
* 大きなファイルから末尾行数を読み込み(関数分割)
|
|
68
|
+
*/
|
|
69
|
+
readTailLinesFromLargeFile(filePath, maxLines, fileSize) {
|
|
70
|
+
const fd = fs.openSync(filePath, 'r');
|
|
71
|
+
try {
|
|
72
|
+
return this.readLinesBackward(fd, fileSize, maxLines);
|
|
73
|
+
}
|
|
74
|
+
finally {
|
|
75
|
+
fs.closeSync(fd);
|
|
76
|
+
}
|
|
77
|
+
}
|
|
78
|
+
/**
|
|
79
|
+
* ファイルを後方から読み込んで行を取得(10行以下に分割)
|
|
80
|
+
*/
|
|
81
|
+
readLinesBackward(fd, fileSize, maxLines) {
|
|
82
|
+
let position = fileSize;
|
|
83
|
+
let lines = [];
|
|
84
|
+
let buffer = '';
|
|
85
|
+
while (position > 0 && lines.length < maxLines) {
|
|
86
|
+
const chunkResult = this.readChunkBackward(fd, position);
|
|
87
|
+
position = chunkResult.newPosition;
|
|
88
|
+
buffer = chunkResult.chunk + buffer;
|
|
89
|
+
lines = this.processBufferLines(buffer, lines, maxLines);
|
|
90
|
+
buffer = this.extractPartialLine(buffer);
|
|
91
|
+
}
|
|
92
|
+
return lines.slice(-maxLines);
|
|
93
|
+
}
|
|
94
|
+
/**
|
|
95
|
+
* 後方からチャンクを読み込み(10行以下)
|
|
96
|
+
*/
|
|
97
|
+
readChunkBackward(fd, position) {
|
|
98
|
+
const chunkSize = this.config.file.chunkSize;
|
|
99
|
+
const readSize = Math.min(chunkSize, position);
|
|
100
|
+
const newPosition = position - readSize;
|
|
101
|
+
const chunk = Buffer.alloc(readSize);
|
|
102
|
+
fs.readSync(fd, chunk, 0, readSize, newPosition);
|
|
103
|
+
return {
|
|
104
|
+
chunk: chunk.toString('utf8'),
|
|
105
|
+
newPosition,
|
|
106
|
+
};
|
|
107
|
+
}
|
|
108
|
+
/**
|
|
109
|
+
* バッファの行を処理(10行以下)
|
|
110
|
+
*/
|
|
111
|
+
processBufferLines(buffer, currentLines, maxLines) {
|
|
112
|
+
const lineArray = buffer.split('\n');
|
|
113
|
+
const lines = [...currentLines];
|
|
114
|
+
// 完全な行を先頭に追加(逆順)
|
|
115
|
+
for (let i = lineArray.length - 2; i >= 0; i--) {
|
|
116
|
+
const line = lineArray[i].trim();
|
|
117
|
+
if (line && lines.length < maxLines) {
|
|
118
|
+
lines.unshift(line);
|
|
119
|
+
}
|
|
120
|
+
}
|
|
121
|
+
return lines;
|
|
122
|
+
}
|
|
123
|
+
/**
|
|
124
|
+
* 部分的な行を抽出(10行以下)
|
|
125
|
+
*/
|
|
126
|
+
extractPartialLine(buffer) {
|
|
127
|
+
const lineArray = buffer.split('\n');
|
|
128
|
+
return lineArray.shift() || '';
|
|
129
|
+
}
|
|
130
|
+
/**
|
|
131
|
+
* リトライ機能付きファイル書き込み
|
|
132
|
+
*/
|
|
133
|
+
async writeToFileWithRetry(filePath, content, maxRetries) {
|
|
134
|
+
let lastError = null;
|
|
135
|
+
for (let attempt = 1; attempt <= maxRetries; attempt++) {
|
|
136
|
+
try {
|
|
137
|
+
await fsPromises.appendFile(filePath, content, { encoding: 'utf8' });
|
|
138
|
+
return; // 成功した場合はリターン
|
|
139
|
+
}
|
|
140
|
+
catch (error) {
|
|
141
|
+
lastError = error;
|
|
142
|
+
if (attempt === maxRetries) {
|
|
143
|
+
// 最後の試行で失敗した場合はエラーログを出力
|
|
144
|
+
console.error(`[FileManager] Failed to write to log file ${filePath} after ${maxRetries} attempts: ${lastError.message}`);
|
|
145
|
+
// エラーを伝播(上位でハンドリング可能にする)
|
|
146
|
+
throw lastError;
|
|
147
|
+
}
|
|
148
|
+
else {
|
|
149
|
+
// リトライ前の短い待機(設定値 * 試行回数)
|
|
150
|
+
await new Promise((resolve) => setTimeout(resolve, this.config.file.retryBaseDelay * attempt));
|
|
151
|
+
}
|
|
152
|
+
}
|
|
153
|
+
}
|
|
154
|
+
}
|
|
155
|
+
}
|
|
156
|
+
//# sourceMappingURL=log-file-manager.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"log-file-manager.js","sourceRoot":"","sources":["../../../src/services/log-file-manager.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* DefaultLogLevelStrategy - デフォルトのログレベル判定戦略(Strategy パターン)
|
|
3
|
+
*/
|
|
4
|
+
import { ILogLevelStrategy } from './log-manager-types.js';
|
|
5
|
+
export declare class DefaultLogLevelStrategy implements ILogLevelStrategy {
|
|
6
|
+
/**
|
|
7
|
+
* ログレベルの判定
|
|
8
|
+
*/
|
|
9
|
+
determineLevel(type: 'stdout' | 'stderr', message: string): 'info' | 'warn' | 'error';
|
|
10
|
+
/**
|
|
11
|
+
* stderr のログレベル判定
|
|
12
|
+
*/
|
|
13
|
+
private determineStderrLevel;
|
|
14
|
+
/**
|
|
15
|
+
* stdout のログレベル判定
|
|
16
|
+
*/
|
|
17
|
+
private determineStdoutLevel;
|
|
18
|
+
}
|
|
19
|
+
//# sourceMappingURL=log-level-strategy.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"log-level-strategy.d.ts","sourceRoot":"","sources":["../../../src/services/log-level-strategy.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,EAAE,iBAAiB,EAAE,MAAM,wBAAwB,CAAC;AAE3D,qBAAa,uBAAwB,YAAW,iBAAiB;IAC/D;;OAEG;IACI,cAAc,CACnB,IAAI,EAAE,QAAQ,GAAG,QAAQ,EACzB,OAAO,EAAE,MAAM,GACd,MAAM,GAAG,MAAM,GAAG,OAAO;IAU5B;;OAEG;IACH,OAAO,CAAC,oBAAoB;IAQ5B;;OAEG;IACH,OAAO,CAAC,oBAAoB;CAU7B"}
|
|
@@ -0,0 +1,40 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* DefaultLogLevelStrategy - デフォルトのログレベル判定戦略(Strategy パターン)
|
|
3
|
+
*/
|
|
4
|
+
export class DefaultLogLevelStrategy {
|
|
5
|
+
/**
|
|
6
|
+
* ログレベルの判定
|
|
7
|
+
*/
|
|
8
|
+
determineLevel(type, message) {
|
|
9
|
+
// stderr は基本的に warn 以上
|
|
10
|
+
if (type === 'stderr') {
|
|
11
|
+
return this.determineStderrLevel(message);
|
|
12
|
+
}
|
|
13
|
+
// stdout でもエラー関連のキーワードがあればエラー扱い
|
|
14
|
+
return this.determineStdoutLevel(message);
|
|
15
|
+
}
|
|
16
|
+
/**
|
|
17
|
+
* stderr のログレベル判定
|
|
18
|
+
*/
|
|
19
|
+
determineStderrLevel(message) {
|
|
20
|
+
const lowerMessage = message.toLowerCase();
|
|
21
|
+
if (lowerMessage.includes('error') || lowerMessage.includes('fatal')) {
|
|
22
|
+
return 'error';
|
|
23
|
+
}
|
|
24
|
+
return 'warn';
|
|
25
|
+
}
|
|
26
|
+
/**
|
|
27
|
+
* stdout のログレベル判定
|
|
28
|
+
*/
|
|
29
|
+
determineStdoutLevel(message) {
|
|
30
|
+
const lowerMessage = message.toLowerCase();
|
|
31
|
+
if (lowerMessage.includes('error') || lowerMessage.includes('fatal')) {
|
|
32
|
+
return 'error';
|
|
33
|
+
}
|
|
34
|
+
if (lowerMessage.includes('warn') || lowerMessage.includes('warning')) {
|
|
35
|
+
return 'warn';
|
|
36
|
+
}
|
|
37
|
+
return 'info';
|
|
38
|
+
}
|
|
39
|
+
}
|
|
40
|
+
//# sourceMappingURL=log-level-strategy.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"log-level-strategy.js","sourceRoot":"","sources":["../../../src/services/log-level-strategy.ts"],"names":[],"mappings":"AAAA;;GAEG;AAIH,MAAM,OAAO,uBAAuB;IAClC;;OAEG;IACI,cAAc,CACnB,IAAyB,EACzB,OAAe;QAEf,uBAAuB;QACvB,IAAI,IAAI,KAAK,QAAQ,EAAE,CAAC;YACtB,OAAO,IAAI,CAAC,oBAAoB,CAAC,OAAO,CAAC,CAAC;QAC5C,CAAC;QAED,gCAAgC;QAChC,OAAO,IAAI,CAAC,oBAAoB,CAAC,OAAO,CAAC,CAAC;IAC5C,CAAC;IAED;;OAEG;IACK,oBAAoB,CAAC,OAAe;QAC1C,MAAM,YAAY,GAAG,OAAO,CAAC,WAAW,EAAE,CAAC;QAC3C,IAAI,YAAY,CAAC,QAAQ,CAAC,OAAO,CAAC,IAAI,YAAY,CAAC,QAAQ,CAAC,OAAO,CAAC,EAAE,CAAC;YACrE,OAAO,OAAO,CAAC;QACjB,CAAC;QACD,OAAO,MAAM,CAAC;IAChB,CAAC;IAED;;OAEG;IACK,oBAAoB,CAAC,OAAe;QAC1C,MAAM,YAAY,GAAG,OAAO,CAAC,WAAW,EAAE,CAAC;QAC3C,IAAI,YAAY,CAAC,QAAQ,CAAC,OAAO,CAAC,IAAI,YAAY,CAAC,QAAQ,CAAC,OAAO,CAAC,EAAE,CAAC;YACrE,OAAO,OAAO,CAAC;QACjB,CAAC;QACD,IAAI,YAAY,CAAC,QAAQ,CAAC,MAAM,CAAC,IAAI,YAAY,CAAC,QAAQ,CAAC,SAAS,CAAC,EAAE,CAAC;YACtE,OAAO,MAAM,CAAC;QAChB,CAAC;QACD,OAAO,MAAM,CAAC;IAChB,CAAC;CACF"}
|
|
@@ -0,0 +1,117 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Log Manager Types - ログ管理システムの型定義
|
|
3
|
+
*
|
|
4
|
+
* インターフェース、型、定数の定義
|
|
5
|
+
*/
|
|
6
|
+
import * as fs from 'fs';
|
|
7
|
+
import { LogEntry } from '../shared/logs.js';
|
|
8
|
+
/** 特殊文字のエスケープ対象 */
|
|
9
|
+
export declare const ESCAPE_CHARS: RegExp;
|
|
10
|
+
/**
|
|
11
|
+
* ファイル管理のインターフェース(依存性逆転原則)
|
|
12
|
+
*/
|
|
13
|
+
export interface IFileManager {
|
|
14
|
+
/**
|
|
15
|
+
* ファイルの存在確認・作成
|
|
16
|
+
*/
|
|
17
|
+
ensureFileExists(filePath: string): void;
|
|
18
|
+
/**
|
|
19
|
+
* ログディレクトリの確認・作成
|
|
20
|
+
*/
|
|
21
|
+
ensureLogDirectory(logDir: string): void;
|
|
22
|
+
/**
|
|
23
|
+
* ファイルの末尾から指定行数を効率的に読み込み
|
|
24
|
+
*/
|
|
25
|
+
readTailLines(filePath: string, maxLines: number): Promise<string[]>;
|
|
26
|
+
/**
|
|
27
|
+
* ファイルへのリトライ機能付き書き込み
|
|
28
|
+
*/
|
|
29
|
+
writeToFileWithRetry(filePath: string, content: string, maxRetries: number): Promise<void>;
|
|
30
|
+
}
|
|
31
|
+
/**
|
|
32
|
+
* ログ前処理のインターフェース(依存性逆転原則)
|
|
33
|
+
*/
|
|
34
|
+
export interface ILogPreprocessor {
|
|
35
|
+
/**
|
|
36
|
+
* ログメッセージの前処理
|
|
37
|
+
*/
|
|
38
|
+
preprocessMessage(message: string): string;
|
|
39
|
+
}
|
|
40
|
+
/**
|
|
41
|
+
* ログレベル判定のインターフェース(Strategy パターン)
|
|
42
|
+
*/
|
|
43
|
+
export interface ILogLevelStrategy {
|
|
44
|
+
/**
|
|
45
|
+
* ログレベルの判定
|
|
46
|
+
*/
|
|
47
|
+
determineLevel(type: 'stdout' | 'stderr', message: string): 'info' | 'warn' | 'error';
|
|
48
|
+
}
|
|
49
|
+
/**
|
|
50
|
+
* イベント管理のインターフェース(依存性逆転原則)
|
|
51
|
+
*/
|
|
52
|
+
export interface IEventManager {
|
|
53
|
+
/**
|
|
54
|
+
* ログイベントの発行
|
|
55
|
+
*/
|
|
56
|
+
emitLogEvent(logEntry: LogEntry): void;
|
|
57
|
+
/**
|
|
58
|
+
* ファイル変更イベントの発行
|
|
59
|
+
*/
|
|
60
|
+
emitFileChangeEvent(data: {
|
|
61
|
+
appName: string;
|
|
62
|
+
file: string;
|
|
63
|
+
type: string;
|
|
64
|
+
}): void;
|
|
65
|
+
/**
|
|
66
|
+
* ディスク容量エラーイベントの発行
|
|
67
|
+
*/
|
|
68
|
+
emitDiskSpaceErrorEvent(data: {
|
|
69
|
+
filePath: string;
|
|
70
|
+
appName: string;
|
|
71
|
+
timestamp: number;
|
|
72
|
+
message: string;
|
|
73
|
+
}): void;
|
|
74
|
+
}
|
|
75
|
+
/**
|
|
76
|
+
* アプリケーション固有のログ設定
|
|
77
|
+
*/
|
|
78
|
+
export interface AppLogConfig {
|
|
79
|
+
/** 統合ログファイルパス */
|
|
80
|
+
logFile?: string | null;
|
|
81
|
+
/** stdout専用ログファイルパス */
|
|
82
|
+
outFile?: string | null;
|
|
83
|
+
/** stderr専用ログファイルパス */
|
|
84
|
+
errorFile?: string | null;
|
|
85
|
+
/** ネームスペース */
|
|
86
|
+
namespace?: string;
|
|
87
|
+
}
|
|
88
|
+
/**
|
|
89
|
+
* 内部ログ情報管理
|
|
90
|
+
*/
|
|
91
|
+
export interface AppLogInfo {
|
|
92
|
+
/** アプリケーション名 */
|
|
93
|
+
appName: string;
|
|
94
|
+
/** ネームスペース */
|
|
95
|
+
namespace: string;
|
|
96
|
+
/** 統合ログファイルパス */
|
|
97
|
+
logFile: string | null;
|
|
98
|
+
/** stdout専用ログファイルパス */
|
|
99
|
+
outFile: string | null;
|
|
100
|
+
/** stderr専用ログファイルパス */
|
|
101
|
+
errorFile: string | null;
|
|
102
|
+
/** 書き込みストリーム(現在は未使用だが互換性のため保持) */
|
|
103
|
+
streams: {
|
|
104
|
+
combined?: fs.WriteStream;
|
|
105
|
+
stdout?: fs.WriteStream;
|
|
106
|
+
stderr?: fs.WriteStream;
|
|
107
|
+
};
|
|
108
|
+
}
|
|
109
|
+
/**
|
|
110
|
+
* ログバッファエントリ
|
|
111
|
+
*/
|
|
112
|
+
export interface BufferedLogEntry {
|
|
113
|
+
logEntry: LogEntry;
|
|
114
|
+
targetFiles: string[];
|
|
115
|
+
timestamp: number;
|
|
116
|
+
}
|
|
117
|
+
//# sourceMappingURL=log-manager-types.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"log-manager-types.d.ts","sourceRoot":"","sources":["../../../src/services/log-manager-types.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,KAAK,EAAE,MAAM,IAAI,CAAC;AACzB,OAAO,EAAE,QAAQ,EAAE,MAAM,mBAAmB,CAAC;AAM7C,mBAAmB;AAEnB,eAAO,MAAM,YAAY,QAAsC,CAAC;AAMhE;;GAEG;AACH,MAAM,WAAW,YAAY;IAC3B;;OAEG;IACH,gBAAgB,CAAC,QAAQ,EAAE,MAAM,GAAG,IAAI,CAAC;IAEzC;;OAEG;IACH,kBAAkB,CAAC,MAAM,EAAE,MAAM,GAAG,IAAI,CAAC;IAEzC;;OAEG;IACH,aAAa,CAAC,QAAQ,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,EAAE,CAAC,CAAC;IAErE;;OAEG;IACH,oBAAoB,CAClB,QAAQ,EAAE,MAAM,EAChB,OAAO,EAAE,MAAM,EACf,UAAU,EAAE,MAAM,GACjB,OAAO,CAAC,IAAI,CAAC,CAAC;CAClB;AAED;;GAEG;AACH,MAAM,WAAW,gBAAgB;IAC/B;;OAEG;IACH,iBAAiB,CAAC,OAAO,EAAE,MAAM,GAAG,MAAM,CAAC;CAC5C;AAED;;GAEG;AACH,MAAM,WAAW,iBAAiB;IAChC;;OAEG;IACH,cAAc,CACZ,IAAI,EAAE,QAAQ,GAAG,QAAQ,EACzB,OAAO,EAAE,MAAM,GACd,MAAM,GAAG,MAAM,GAAG,OAAO,CAAC;CAC9B;AAED;;GAEG;AACH,MAAM,WAAW,aAAa;IAC5B;;OAEG;IACH,YAAY,CAAC,QAAQ,EAAE,QAAQ,GAAG,IAAI,CAAC;IAEvC;;OAEG;IACH,mBAAmB,CAAC,IAAI,EAAE;QACxB,OAAO,EAAE,MAAM,CAAC;QAChB,IAAI,EAAE,MAAM,CAAC;QACb,IAAI,EAAE,MAAM,CAAC;KACd,GAAG,IAAI,CAAC;IAET;;OAEG;IACH,uBAAuB,CAAC,IAAI,EAAE;QAC5B,QAAQ,EAAE,MAAM,CAAC;QACjB,OAAO,EAAE,MAAM,CAAC;QAChB,SAAS,EAAE,MAAM,CAAC;QAClB,OAAO,EAAE,MAAM,CAAC;KACjB,GAAG,IAAI,CAAC;CACV;AAED;;GAEG;AACH,MAAM,WAAW,YAAY;IAC3B,iBAAiB;IACjB,OAAO,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IACxB,uBAAuB;IACvB,OAAO,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IACxB,uBAAuB;IACvB,SAAS,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IAC1B,cAAc;IACd,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB;AAED;;GAEG;AACH,MAAM,WAAW,UAAU;IACzB,gBAAgB;IAChB,OAAO,EAAE,MAAM,CAAC;IAChB,cAAc;IACd,SAAS,EAAE,MAAM,CAAC;IAClB,iBAAiB;IACjB,OAAO,EAAE,MAAM,GAAG,IAAI,CAAC;IACvB,uBAAuB;IACvB,OAAO,EAAE,MAAM,GAAG,IAAI,CAAC;IACvB,uBAAuB;IACvB,SAAS,EAAE,MAAM,GAAG,IAAI,CAAC;IACzB,kCAAkC;IAClC,OAAO,EAAE;QACP,QAAQ,CAAC,EAAE,EAAE,CAAC,WAAW,CAAC;QAC1B,MAAM,CAAC,EAAE,EAAE,CAAC,WAAW,CAAC;QACxB,MAAM,CAAC,EAAE,EAAE,CAAC,WAAW,CAAC;KACzB,CAAC;CACH;AAED;;GAEG;AACH,MAAM,WAAW,gBAAgB;IAC/B,QAAQ,EAAE,QAAQ,CAAC;IACnB,WAAW,EAAE,MAAM,EAAE,CAAC;IACtB,SAAS,EAAE,MAAM,CAAC;CACnB"}
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Log Manager Types - ログ管理システムの型定義
|
|
3
|
+
*
|
|
4
|
+
* インターフェース、型、定数の定義
|
|
5
|
+
*/
|
|
6
|
+
// =============================================================================
|
|
7
|
+
// Constants
|
|
8
|
+
// =============================================================================
|
|
9
|
+
/** 特殊文字のエスケープ対象 */
|
|
10
|
+
// eslint-disable-next-line no-control-regex
|
|
11
|
+
export const ESCAPE_CHARS = /[\x00-\x08\x0B\x0C\x0E-\x1F\x7F]/g;
|
|
12
|
+
//# sourceMappingURL=log-manager-types.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"log-manager-types.js","sourceRoot":"","sources":["../../../src/services/log-manager-types.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAKH,gFAAgF;AAChF,YAAY;AACZ,gFAAgF;AAEhF,mBAAmB;AACnB,4CAA4C;AAC5C,MAAM,CAAC,MAAM,YAAY,GAAG,mCAAmC,CAAC"}
|