aboutsummaryrefslogtreecommitdiff
path: root/services/docker/mail-server/aws-sendmail/logger.ts
diff options
context:
space:
mode:
authorYuqian Yang <crupest@crupest.life>2025-04-10 15:12:46 +0800
committerYuqian Yang <crupest@crupest.life>2025-04-29 01:38:30 +0800
commit6aeff979ada4a1775bddb87a0ccad354faaa8093 (patch)
treef21bf38bea4d48c21df6209f65ef4726d577ece8 /services/docker/mail-server/aws-sendmail/logger.ts
parent1238ea1cba60316a641b8755b8c6c12e42badfbd (diff)
downloadcrupest-6aeff979ada4a1775bddb87a0ccad354faaa8093.tar.gz
crupest-6aeff979ada4a1775bddb87a0ccad354faaa8093.tar.bz2
crupest-6aeff979ada4a1775bddb87a0ccad354faaa8093.zip
HALF WORK!
Diffstat (limited to 'services/docker/mail-server/aws-sendmail/logger.ts')
-rw-r--r--services/docker/mail-server/aws-sendmail/logger.ts55
1 files changed, 55 insertions, 0 deletions
diff --git a/services/docker/mail-server/aws-sendmail/logger.ts b/services/docker/mail-server/aws-sendmail/logger.ts
new file mode 100644
index 0000000..12dbc80
--- /dev/null
+++ b/services/docker/mail-server/aws-sendmail/logger.ts
@@ -0,0 +1,55 @@
+import * as path from "@std/path";
+
+function generateTimeStringForFileName(
+ instant?: Temporal.Instant | Date,
+): string {
+ if (instant == null) {
+ instant = Temporal.Now.instant();
+ } else if (instant instanceof Date) {
+ instant = instant.toTemporalInstant();
+ }
+
+ return instant.toString().replaceAll(/:|\./g, "-");
+}
+
+export class Logger {
+ constructor(public readonly path: string) {
+ }
+
+ 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);
+ }
+}