From dc73e57ba83d8e84d7a1ef0bbefff15189e174f3 Mon Sep 17 00:00:00 2001 From: Adria Navarro Date: Tue, 11 Jul 2023 13:48:52 +0200 Subject: [PATCH] Respect max values --- packages/backend-core/src/environment.ts | 2 +- packages/backend-core/src/logging/system.ts | 40 +++++++++++- .../src/logging/tests/system.spec.ts | 61 +++++++++++++++++++ 3 files changed, 100 insertions(+), 3 deletions(-) create mode 100644 packages/backend-core/src/logging/tests/system.spec.ts diff --git a/packages/backend-core/src/environment.ts b/packages/backend-core/src/environment.ts index 5a230f6925..a5a231fb27 100644 --- a/packages/backend-core/src/environment.ts +++ b/packages/backend-core/src/environment.ts @@ -168,7 +168,7 @@ const environment = { // @ts-ignore environment[key] = value }, - ROLLING_LOG_MAX_SIZE: process.env.ROLLING_LOG_MAX_SIZE || "100M", + ROLLING_LOG_MAX_SIZE: process.env.ROLLING_LOG_MAX_SIZE || "20M", } // clean up any environment variable edge cases diff --git a/packages/backend-core/src/logging/system.ts b/packages/backend-core/src/logging/system.ts index 76f6ad1098..9a32b69a9f 100644 --- a/packages/backend-core/src/logging/system.ts +++ b/packages/backend-core/src/logging/system.ts @@ -14,11 +14,47 @@ function getFullPath(fileName: string) { return path.join(logsPath, fileName) } +export function getSingleFileMaxSizeInfo(totalMaxSize: string) { + const regex = /(\d+)([A-Za-z])/ + const match = totalMaxSize?.match(regex) + if (!match) { + console.warn(`totalMaxSize does not have a valid value`, { + totalMaxSize, + }) + return undefined + } + + const size = +match[1] + const unit = match[2] + if (size === 1) { + switch (unit) { + case "B": + return { size: `${size}B`, totalHistoryFiles: 1 } + case "K": + return { size: `${(size * 1000) / 2}B`, totalHistoryFiles: 1 } + case "M": + return { size: `${(size * 1000) / 2}K`, totalHistoryFiles: 1 } + case "G": + return { size: `${(size * 1000) / 2}M`, totalHistoryFiles: 1 } + default: + return undefined + } + } + + if (size % 2 === 0) { + return { size: `${size / 2}${unit}`, totalHistoryFiles: 1 } + } + + return { size: `1${unit}`, totalHistoryFiles: size } +} + export function localFileDestination() { + const fileInfo = getSingleFileMaxSizeInfo(env.ROLLING_LOG_MAX_SIZE) const outFile = rfs.createStream(logsFileName, { - size: env.ROLLING_LOG_MAX_SIZE, + // As we have a rolling size, we want to half the max size + size: fileInfo?.size, path: logsPath, - maxFiles: 1, + maxFiles: fileInfo?.totalHistoryFiles || 1, immutable: true, history: budibaseLogsHistoryFileName, initialRotation: false, diff --git a/packages/backend-core/src/logging/tests/system.spec.ts b/packages/backend-core/src/logging/tests/system.spec.ts new file mode 100644 index 0000000000..f756d59e2b --- /dev/null +++ b/packages/backend-core/src/logging/tests/system.spec.ts @@ -0,0 +1,61 @@ +import { getSingleFileMaxSizeInfo } from "../system" + +describe("system", () => { + describe("getSingleFileMaxSizeInfo", () => { + it.each([ + ["100B", "50B"], + ["200K", "100K"], + ["20M", "10M"], + ["4G", "2G"], + ])( + "Halving even number (%s) returns halved size and 1 history file (%s)", + (totalValue, expectedMaxSize) => { + const result = getSingleFileMaxSizeInfo(totalValue) + expect(result).toEqual({ + size: expectedMaxSize, + totalHistoryFiles: 1, + }) + } + ) + + it.each([ + ["5B", "1B", 5], + ["17K", "1K", 17], + ["21M", "1M", 21], + ["3G", "1G", 3], + ])( + "Halving an odd number (%s) returns as many files as size (%s)", + (totalValue, expectedMaxSize, totalHistoryFiles) => { + const result = getSingleFileMaxSizeInfo(totalValue) + expect(result).toEqual({ + size: expectedMaxSize, + totalHistoryFiles, + }) + } + ) + + it.each([ + ["1B", "1B"], + ["1K", "500B"], + ["1M", "500K"], + ["1G", "500M"], + ])( + "Halving '%s' returns halved unit (%s)", + (totalValue, expectedMaxSize) => { + const result = getSingleFileMaxSizeInfo(totalValue) + expect(result).toEqual({ + size: expectedMaxSize, + totalHistoryFiles: 1, + }) + } + ) + + it.each([[undefined], [""], ["50"], ["wrongvalue"]])( + "Halving wrongly formatted value ('%s') returns undefined", + totalValue => { + const result = getSingleFileMaxSizeInfo(totalValue!) + expect(result).toBeUndefined() + } + ) + }) +})