From 967ed0e1a3eca8da7916956c7b51df27300039c1 Mon Sep 17 00:00:00 2001 From: Louis Date: Mon, 5 Aug 2024 15:44:54 +0700 Subject: [PATCH] chore: clean logs periodically (#972) --- cortex-js/src/index.ts | 3 +++ cortex-js/src/main.ts | 3 +++ cortex-js/src/utils/log.ts | 55 ++++++++++++++++++++++++++++++++++++++ 3 files changed, 61 insertions(+) create mode 100644 cortex-js/src/utils/log.ts diff --git a/cortex-js/src/index.ts b/cortex-js/src/index.ts index 13a383371..5ba80c22b 100644 --- a/cortex-js/src/index.ts +++ b/cortex-js/src/index.ts @@ -7,6 +7,7 @@ import { import { getApp } from './app'; import chalk from 'chalk'; import { CortexUsecases } from './usecases/cortex/cortex.usecases'; +import { cleanLogs } from './utils/log'; /** * Start the API server @@ -18,6 +19,8 @@ export async function start(host?: string, port?: number) { const sPort = port || process.env.CORTEX_JS_PORT || defaultCortexJsPort; try { + // Clean log periodically + cleanLogs(); await app.listen(sPort, sHost); const cortexUsecases = await app.resolve(CortexUsecases); await cortexUsecases.startCortex(); diff --git a/cortex-js/src/main.ts b/cortex-js/src/main.ts index 1a43ca318..c87b40d31 100644 --- a/cortex-js/src/main.ts +++ b/cortex-js/src/main.ts @@ -4,6 +4,7 @@ import { } from '@/infrastructure/constants/cortex'; import { getApp } from './app'; import chalk from 'chalk'; +import { cleanLogs } from './utils/log'; async function bootstrap() { const app = await getApp(); @@ -12,6 +13,8 @@ async function bootstrap() { const port = process.env.CORTEX_JS_PORT || defaultCortexJsPort; try { + // Clean logs periodically + cleanLogs(); await app.listen(port, host); console.log(chalk.blue(`Started server at http://${host}:${port}`)); console.log( diff --git a/cortex-js/src/utils/log.ts b/cortex-js/src/utils/log.ts new file mode 100644 index 000000000..4b90f2055 --- /dev/null +++ b/cortex-js/src/utils/log.ts @@ -0,0 +1,55 @@ +import { fileManagerService } from "@/infrastructure/services/file-manager/file-manager.service"; +import { existsSync, stat, unlink, writeFileSync } from "fs"; + +const logCleaningInterval: number = 120000 +let timeout: NodeJS.Timeout | undefined; + +export async function cleanLogs( + maxFileSizeBytes?: number | undefined, + daysToKeep?: number | undefined, +): Promise { + // clear existing timeout + // in case we rerun it with different values + if (timeout) clearTimeout(timeout) + timeout = undefined + + + console.log( + 'Validating app logs. Next attempt in ', + logCleaningInterval + ) + + const size = maxFileSizeBytes ?? 1 * 1024 * 1024 // 1 MB + const days = daysToKeep ?? 7 // 7 days + const filePath = await fileManagerService.getLogPath() + // Perform log cleaning + const currentDate = new Date() + if (existsSync(filePath)) + stat(filePath, (err, stats) => { + if (err) { + console.error('Error getting file stats:', err) + return + } + + // Check size + if (stats.size > size) { + writeFileSync(filePath, '', 'utf8') + } else { + // Check age + const creationDate = new Date(stats.ctime) + const daysDifference = Math.floor( + (currentDate.getTime() - creationDate.getTime()) / + (1000 * 3600 * 24) + ) + if (daysDifference > days) { + writeFileSync(filePath, '', 'utf8') + } + } + }) + + // Schedule the next execution with doubled delays + timeout = setTimeout( + () => this.cleanLogs(maxFileSizeBytes, daysToKeep), + logCleaningInterval + ) +}