Path: blob/main/src/vs/code/electron-utility/sharedProcess/contrib/logsDataCleaner.ts
3296 views
/*---------------------------------------------------------------------------------------------1* Copyright (c) Microsoft Corporation. All rights reserved.2* Licensed under the MIT License. See License.txt in the project root for license information.3*--------------------------------------------------------------------------------------------*/45import { RunOnceScheduler } from '../../../../base/common/async.js';6import { onUnexpectedError } from '../../../../base/common/errors.js';7import { Disposable } from '../../../../base/common/lifecycle.js';8import { Schemas } from '../../../../base/common/network.js';9import { join } from '../../../../base/common/path.js';10import { basename, dirname } from '../../../../base/common/resources.js';11import { Promises } from '../../../../base/node/pfs.js';12import { IEnvironmentService } from '../../../../platform/environment/common/environment.js';13import { ILogService } from '../../../../platform/log/common/log.js';1415export class LogsDataCleaner extends Disposable {1617constructor(18@IEnvironmentService private readonly environmentService: IEnvironmentService,19@ILogService private readonly logService: ILogService20) {21super();2223const scheduler = this._register(new RunOnceScheduler(() => {24this.cleanUpOldLogs();25}, 10 * 1000 /* after 10s */));26scheduler.schedule();27}2829private async cleanUpOldLogs(): Promise<void> {30this.logService.trace('[logs cleanup]: Starting to clean up old logs.');3132try {33const currentLog = basename(this.environmentService.logsHome);34const logsRoot = dirname(this.environmentService.logsHome.with({ scheme: Schemas.file })).fsPath;35const logFiles = await Promises.readdir(logsRoot);3637const allSessions = logFiles.filter(logFile => /^\d{8}T\d{6}$/.test(logFile));38const oldSessions = allSessions.sort().filter(session => session !== currentLog);39const sessionsToDelete = oldSessions.slice(0, Math.max(0, oldSessions.length - 9));4041if (sessionsToDelete.length > 0) {42this.logService.trace(`[logs cleanup]: Removing log folders '${sessionsToDelete.join(', ')}'`);4344await Promise.all(sessionsToDelete.map(sessionToDelete => Promises.rm(join(logsRoot, sessionToDelete))));45}46} catch (error) {47onUnexpectedError(error);48}49}50}515253