From b040ed1a13fe18a0e2a69e7d2f95c7e074ddafd8 Mon Sep 17 00:00:00 2001 From: Louis Date: Mon, 5 Aug 2024 14:26:17 +0700 Subject: [PATCH] chore: clean logs periodically --- cortex-js/src/index.ts | 3 ++ cortex-js/src/main.ts | 3 ++ cortex-js/src/utils/log.ts | 69 ++++++++++++++++++++++++++++++++++++++ 3 files changed, 75 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..e8bf72ffa --- /dev/null +++ b/cortex-js/src/utils/log.ts @@ -0,0 +1,69 @@ +import { fileManagerService } from "@/infrastructure/services/file-manager/file-manager.service"; +import { existsSync, stat, unlink } 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) { + unlink(filePath, (err) => { + if (err) { + console.error('Error deleting log file:', err) + return + } + console.debug( + `Deleted log file due to exceeding size limit: ${filePath}` + ) + }) + } else { + // Check age + const creationDate = new Date(stats.ctime) + const daysDifference = Math.floor( + (currentDate.getTime() - creationDate.getTime()) / + (1000 * 3600 * 24) + ) + if (daysDifference > days) { + unlink(filePath, (err) => { + if (err) { + console.error('Error deleting log file:', err) + return + } + console.debug(`Deleted old log file: ${filePath}`) + }) + } + } + }) + + // Schedule the next execution with doubled delays + timeout = setTimeout( + () => this.cleanLogs(maxFileSizeBytes, daysToKeep), + logCleaningInterval + ) +}