aboutsummaryrefslogtreecommitdiff
path: root/services/docker/mail-server/relay/logger.ts
diff options
context:
space:
mode:
Diffstat (limited to 'services/docker/mail-server/relay/logger.ts')
-rw-r--r--services/docker/mail-server/relay/logger.ts56
1 files changed, 56 insertions, 0 deletions
diff --git a/services/docker/mail-server/relay/logger.ts b/services/docker/mail-server/relay/logger.ts
new file mode 100644
index 0000000..1082332
--- /dev/null
+++ b/services/docker/mail-server/relay/logger.ts
@@ -0,0 +1,56 @@
+import * as path from "@std/path";
+
+import { createSingleton, generateTimeStringForFileName } from "./util.ts";
+
+export class Logger {
+ constructor(public readonly path: string) {
+ Deno.mkdirSync(path, { recursive: true });
+ }
+
+ log(...args: unknown[]) {
+ console.log(...args);
+ }
+
+ warn(...args: unknown[]) {
+ console.warn(...args);
+ }
+
+ generateLogFilePath(
+ prefix: string = "",
+ suffix: string = "",
+ instant?: Temporal.Instant | Date,
+ ): string {
+ return path.join(
+ this.path,
+ `${prefix}-${generateTimeStringForFileName(instant)}-${suffix}`,
+ );
+ }
+
+ openLogFile(
+ prefix: string = "",
+ suffix: string = "",
+ instant?: Temporal.Instant | Date,
+ ): Promise<Deno.FsFile> {
+ const logPath = this.generateLogFilePath(prefix, suffix, instant);
+ return Deno.open(logPath, {
+ read: false,
+ write: true,
+ append: true,
+ create: true,
+ });
+ }
+
+ async logProgramOutput(
+ process: Deno.ChildProcess,
+ program: string,
+ instant?: Temporal.Instant | Date,
+ ): Promise<void> {
+ const stdoutFile = await this.openLogFile(program, "stdout", instant);
+ const stderrFile = await this.openLogFile(program, "stderr", instant);
+
+ process.stdout.pipeTo(stdoutFile.writable);
+ process.stderr.pipeTo(stderrFile.writable);
+ }
+}
+
+export const [getLogger, setLogger] = createSingleton<Logger>("Logger");