UNPKG

@sussudio/platform

Version:

Internal APIs for VS Code's service injection the base services.

138 lines (137 loc) 3.95 kB
/*--------------------------------------------------------------------------------------------- * Copyright (c) Microsoft Corporation. All rights reserved. * Licensed under the MIT License. See License.txt in the project root for license information. *--------------------------------------------------------------------------------------------*/ import { ByteSize } from '../../files/common/files.mjs'; import { AbstractMessageLogger, LogLevel } from '../common/log.mjs'; var SpdLogLevel; (function (SpdLogLevel) { SpdLogLevel[(SpdLogLevel['Trace'] = 0)] = 'Trace'; SpdLogLevel[(SpdLogLevel['Debug'] = 1)] = 'Debug'; SpdLogLevel[(SpdLogLevel['Info'] = 2)] = 'Info'; SpdLogLevel[(SpdLogLevel['Warning'] = 3)] = 'Warning'; SpdLogLevel[(SpdLogLevel['Error'] = 4)] = 'Error'; SpdLogLevel[(SpdLogLevel['Critical'] = 5)] = 'Critical'; SpdLogLevel[(SpdLogLevel['Off'] = 6)] = 'Off'; })(SpdLogLevel || (SpdLogLevel = {})); async function createSpdLogLogger(name, logfilePath, filesize, filecount, donotUseFormatters) { // Do not crash if spdlog cannot be loaded try { const _spdlog = await import('spdlog'); _spdlog.setFlushOn(SpdLogLevel.Trace); const logger = await _spdlog.createAsyncRotatingLogger(name, logfilePath, filesize, filecount); if (donotUseFormatters) { logger.clearFormatters(); } else { logger.setPattern('%Y-%m-%d %H:%M:%S.%e [%l] %v'); } return logger; } catch (e) { console.error(e); } return null; } function log(logger, level, message) { switch (level) { case LogLevel.Trace: logger.trace(message); break; case LogLevel.Debug: logger.debug(message); break; case LogLevel.Info: logger.info(message); break; case LogLevel.Warning: logger.warn(message); break; case LogLevel.Error: logger.error(message); break; case LogLevel.Off: /* do nothing */ break; default: throw new Error(`Invalid log level ${level}`); } } function setLogLevel(logger, level) { switch (level) { case LogLevel.Trace: logger.setLevel(SpdLogLevel.Trace); break; case LogLevel.Debug: logger.setLevel(SpdLogLevel.Debug); break; case LogLevel.Info: logger.setLevel(SpdLogLevel.Info); break; case LogLevel.Warning: logger.setLevel(SpdLogLevel.Warning); break; case LogLevel.Error: logger.setLevel(SpdLogLevel.Error); break; case LogLevel.Off: logger.setLevel(SpdLogLevel.Off); break; default: throw new Error(`Invalid log level ${level}`); } } export class SpdLogLogger extends AbstractMessageLogger { buffer = []; _loggerCreationPromise; _logger; constructor(name, filepath, rotating, donotUseFormatters, level) { super(); this.setLevel(level); this._loggerCreationPromise = this._createSpdLogLogger(name, filepath, rotating, donotUseFormatters); this._register( this.onDidChangeLogLevel((level) => { if (this._logger) { setLogLevel(this._logger, level); } }), ); } async _createSpdLogLogger(name, filepath, rotating, donotUseFormatters) { const filecount = rotating ? 6 : 1; const filesize = (30 / filecount) * ByteSize.MB; const logger = await createSpdLogLogger(name, filepath, filesize, filecount, donotUseFormatters); if (logger) { this._logger = logger; setLogLevel(this._logger, this.getLevel()); for (const { level, message } of this.buffer) { log(this._logger, level, message); } this.buffer = []; } } log(level, message) { if (this._logger) { log(this._logger, level, message); } else if (this.getLevel() <= level) { this.buffer.push({ level, message }); } } flush() { if (this._logger) { this._logger.flush(); } else { this._loggerCreationPromise.then(() => this.flush()); } } dispose() { if (this._logger) { this.disposeLogger(); } else { this._loggerCreationPromise.then(() => this.disposeLogger()); } } disposeLogger() { if (this._logger) { this._logger.drop(); this._logger = undefined; } } }