From 845e03e48acf1367feadeaae986f3c987bbc164d Mon Sep 17 00:00:00 2001 From: Filip Date: Mon, 17 Feb 2025 14:04:39 +0100 Subject: [PATCH] fix: Allow configuring number of folders of old logs to keep (#26398) Co-authored-by: Filip Vilicic --- lib/types/types.d.ts | 1 + lib/util/logger.ts | 2 +- lib/util/settings.schema.json | 8 ++++++++ lib/util/settings.ts | 1 + test/extensions/bridge.test.ts | 1 + test/logger.test.ts | 17 ++++++++++++++++- 6 files changed, 28 insertions(+), 2 deletions(-) diff --git a/lib/types/types.d.ts b/lib/types/types.d.ts index b3158b435..b9bfe2441 100644 --- a/lib/types/types.d.ts +++ b/lib/types/types.d.ts @@ -178,6 +178,7 @@ declare global { log_syslog: KeyValue; log_debug_to_mqtt_frontend: boolean; log_debug_namespace_ignore: string; + log_directories_to_keep: number; pan_id: number | 'GENERATE'; ext_pan_id: number[] | 'GENERATE'; channel: number; diff --git a/lib/util/logger.ts b/lib/util/logger.ts index dbcc6df11..7d0e7f377 100644 --- a/lib/util/logger.ts +++ b/lib/util/logger.ts @@ -232,7 +232,7 @@ class Logger { }); directories.sort((a: KeyValue, b: KeyValue) => b.birth - a.birth); - directories = directories.slice(10, directories.length); + directories = directories.slice(settings.get().advanced.log_directories_to_keep, directories.length); directories.forEach((dir) => { this.debug(`Removing old log directory '${dir.path}'`); rimrafSync(dir.path); diff --git a/lib/util/settings.schema.json b/lib/util/settings.schema.json index 3a73e5e72..566fd652b 100644 --- a/lib/util/settings.schema.json +++ b/lib/util/settings.schema.json @@ -525,6 +525,14 @@ "default": "", "examples": ["^zhc:legacy:fz:(tuya|moes)", "^zhc:legacy:fz:(tuya|moes)|^zh:ember:uart:|^zh:controller"] }, + "log_directories_to_keep": { + "type": "number", + "title": "Number of past log folders to keep", + "description": "Number of log directories to keep before deleting the oldest one", + "default": 10, + "minimum": 5, + "maximum": 1000 + }, "log_syslog": { "requiresRestart": true, "oneOf": [ diff --git a/lib/util/settings.ts b/lib/util/settings.ts index db53afc26..13f0d0a45 100644 --- a/lib/util/settings.ts +++ b/lib/util/settings.ts @@ -96,6 +96,7 @@ export const defaults: RecursivePartial = { log_syslog: {}, log_debug_to_mqtt_frontend: false, log_debug_namespace_ignore: '', + log_directories_to_keep: 10, pan_id: 0x1a62, ext_pan_id: [0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd], channel: 11, diff --git a/test/extensions/bridge.test.ts b/test/extensions/bridge.test.ts index 714f564fb..747d48252 100644 --- a/test/extensions/bridge.test.ts +++ b/test/extensions/bridge.test.ts @@ -122,6 +122,7 @@ describe('Extension: Bridge', () => { log_rotation: true, log_symlink_current: false, log_syslog: {}, + log_directories_to_keep: 10, output: 'json', pan_id: 6754, timestamp_format: 'YYYY-MM-DD HH:mm:ss', diff --git a/test/logger.test.ts b/test/logger.test.ts index a193ab783..74bb2e63c 100644 --- a/test/logger.test.ts +++ b/test/logger.test.ts @@ -46,7 +46,7 @@ describe('Logger', () => { expect(dirs.length).toBe(1); }); - it('Should cleanup', () => { + it('Should cleanup (default setting)', () => { for (const d of fs.readdirSync(dir.name)) { rimrafSync(path.join(dir.name, d)); } @@ -60,6 +60,21 @@ describe('Logger', () => { expect(fs.readdirSync(dir.name).length).toBe(10); }); + it('Should cleanup (15 folders setting)', () => { + for (const d of fs.readdirSync(dir.name)) { + rimrafSync(path.join(dir.name, d)); + } + + for (let i = 0; i < 20; i++) { + fs.mkdirSync(path.join(dir.name, `log_${i}`)); + } + + settings.set(['advanced', 'log_directories_to_keep'], 15); + expect(fs.readdirSync(dir.name).length).toBe(20); + logger.init(); + expect(fs.readdirSync(dir.name).length).toBe(15); + }); + it('Should not cleanup when there is no timestamp set', () => { for (const d of fs.readdirSync(dir.name)) { rimrafSync(path.join(dir.name, d));