diff --git a/lib/util/logger.ts b/lib/util/logger.ts index 5abe63603d..0e4b089807 100644 --- a/lib/util/logger.ts +++ b/lib/util/logger.ts @@ -240,7 +240,11 @@ class Logger { for (const dir of directories) { this.debug(`Removing old log directory '${dir.path}'`); - rimrafSync(dir.path); + try { + rimrafSync(dir.path); + } catch (e) { + this.error(`Failed to remove old log directory '${dir.path}': ${e}`); + } } } } diff --git a/test/logger.test.ts b/test/logger.test.ts index 379d53dfef..2a55475973 100644 --- a/test/logger.test.ts +++ b/test/logger.test.ts @@ -12,6 +12,14 @@ import Transport from "winston-transport"; import logger from "../lib/util/logger"; import * as settings from "../lib/util/settings"; +vi.mock("rimraf", async (importOriginal) => { + const actual = await importOriginal(); + return { + ...actual, + rimrafSync: vi.fn(actual.rimrafSync), + }; +}); + describe("Logger", () => { let consoleWriteSpy: MockInstance; const dir = tmp.dirSync(); @@ -59,6 +67,24 @@ describe("Logger", () => { expect(fs.readdirSync(dir.name).length).toBe(10); }); + it("Should handle cleanup error", () => { + 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}`)); + } + + vi.mocked(rimrafSync).mockImplementationOnce(() => { + throw new Error("EACCES: permission denied"); + }); + + const errorSpy = vi.spyOn(logger, "error"); + logger.init(); + expect(errorSpy).toHaveBeenCalledWith(expect.stringMatching(/Failed to remove old log directory '.*': Error: EACCES: permission denied/)); + }); + it("Should cleanup (15 folders setting)", () => { for (const d of fs.readdirSync(dir.name)) { rimrafSync(path.join(dir.name, d));