diff --git a/CHANGELOG.md b/CHANGELOG.md index 59359b89..4278bdb6 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -8,6 +8,7 @@ ### 🎨 Enhancements +- [#799](https://github.com/estruyf/vscode-front-matter/issues/799): Added `frontMatter.logging` setting to define the logging output. Options are `info`, `warn`, `error`, and `verbose`. Default is `info`. - [#800](https://github.com/estruyf/vscode-front-matter/issues/800): Add colors for the Front Matter CMS output ### ⚡️ Optimizations diff --git a/package.json b/package.json index 6789f34f..de3dbd9b 100644 --- a/package.json +++ b/package.json @@ -1988,6 +1988,16 @@ "frontMatter.website.host": { "type": "string", "markdownDescription": "%setting.frontMatter.website.host.markdownDescription%" + }, + "frontMatter.logging": { + "type": "string", + "default": "info", + "enum": [ + "error", + "warn", + "info", + "verbose" + ] } } }, diff --git a/src/commands/Dashboard.ts b/src/commands/Dashboard.ts index 96ee2e16..80d9f9cf 100644 --- a/src/commands/Dashboard.ts +++ b/src/commands/Dashboard.ts @@ -34,6 +34,7 @@ import * as l10n from '@vscode/l10n'; import { LocalizationKey } from '../localization'; import { DashboardMessage } from '../dashboardWebView/DashboardMessage'; import { NavigationType } from '../dashboardWebView/models'; +import { ignoreMsgCommand } from '../utils'; export class Dashboard { private static webview: WebviewPanel | null = null; @@ -222,7 +223,9 @@ export class Dashboard { }); Dashboard.webview.webview.onDidReceiveMessage(async (msg) => { - Logger.info(`Receiving message from dashboard: ${msg.command}`); + if (!ignoreMsgCommand(msg.command)) { + Logger.verbose(`Receiving message from dashboard: ${msg.command}`); + } LocalizationListener.process(msg); DashboardListener.process(msg); diff --git a/src/commands/Folders.ts b/src/commands/Folders.ts index 982d35e1..a4306e7c 100644 --- a/src/commands/Folders.ts +++ b/src/commands/Folders.ts @@ -565,7 +565,7 @@ export class Folders { * Find the content folders */ public static async getContentFolders() { - Logger.info('Folders:getContentFolders:start'); + Logger.verbose('Folders:getContentFolders:start'); // Find folders that contain files const wsFolder = Folders.getWorkspaceFolder(); if (!wsFolder) { @@ -604,7 +604,7 @@ export class Folders { const uniqueFolders = [...new Set(folders)]; - Logger.info('Folders:getContentFolders:end'); + Logger.verbose('Folders:getContentFolders:end'); return uniqueFolders.map((folder) => relative(wsFolder?.path || '', folder)); } diff --git a/src/constants/GeneralCommands.ts b/src/constants/GeneralCommands.ts index efa20688..429f10a5 100644 --- a/src/constants/GeneralCommands.ts +++ b/src/constants/GeneralCommands.ts @@ -27,7 +27,8 @@ export const GeneralCommands = { logging: { info: 'logInfo', warn: 'logWarn', - error: 'logError' + error: 'logError', + verbose: 'logVerbose' }, runCommand: 'runCommand', getLocalization: 'getLocalization', diff --git a/src/constants/settings.ts b/src/constants/settings.ts index f24b7263..a6be1116 100644 --- a/src/constants/settings.ts +++ b/src/constants/settings.ts @@ -114,6 +114,8 @@ export const SETTING_SNIPPETS_WRAPPER = 'snippets.wrapper.enabled'; export const SETTING_WEBSITE_URL = 'website.host'; +export const SETTING_LOGGING = 'logging'; + /** * Sponsors only settings */ diff --git a/src/dashboardWebView/components/App.tsx b/src/dashboardWebView/components/App.tsx index 520b5bed..89bc355f 100644 --- a/src/dashboardWebView/components/App.tsx +++ b/src/dashboardWebView/components/App.tsx @@ -70,7 +70,7 @@ export const App: React.FunctionComponent = ({ } useEffect(() => { - messageHandler.send(GeneralCommands.toVSCode.logging.info, { + messageHandler.send(GeneralCommands.toVSCode.logging.verbose, { message: `Loaded with view ${view}`, location: 'DASHBOARD' }); @@ -85,14 +85,14 @@ export const App: React.FunctionComponent = ({ useEffect(() => { if (settings && Object.keys(settings).length > 0) { - messageHandler.send(GeneralCommands.toVSCode.logging.info, { + messageHandler.send(GeneralCommands.toVSCode.logging.verbose, { message: `Settings loaded`, location: 'DASHBOARD' }); } if (pages) { - messageHandler.send(GeneralCommands.toVSCode.logging.info, { + messageHandler.send(GeneralCommands.toVSCode.logging.verbose, { message: `Pages loaded - ${pages.length} pages`, location: 'DASHBOARD' }); diff --git a/src/dashboardWebView/components/DataView/DataView.tsx b/src/dashboardWebView/components/DataView/DataView.tsx index 34ff0eae..ba752919 100644 --- a/src/dashboardWebView/components/DataView/DataView.tsx +++ b/src/dashboardWebView/components/DataView/DataView.tsx @@ -130,7 +130,7 @@ export const DataView: React.FunctionComponent = ( }); Messenger.send(GeneralCommands.toVSCode.logging.info, { - message: 'DataView loaded', + message: 'Data view loaded', location: 'DASHBOARD' }); diff --git a/src/dashboardWebView/components/SnippetsView/SnippetForm.tsx b/src/dashboardWebView/components/SnippetsView/SnippetForm.tsx index 45047161..efd31fdd 100644 --- a/src/dashboardWebView/components/SnippetsView/SnippetForm.tsx +++ b/src/dashboardWebView/components/SnippetsView/SnippetForm.tsx @@ -159,7 +159,6 @@ ${snippetBody} message: `SnippetForm: ${(e as Error).message}`, location: 'DASHBOARD' }); - console.log('Error', (e as Error).message) } } } diff --git a/src/dashboardWebView/hooks/useMessages.tsx b/src/dashboardWebView/hooks/useMessages.tsx index 37eca687..f62e670f 100644 --- a/src/dashboardWebView/hooks/useMessages.tsx +++ b/src/dashboardWebView/hooks/useMessages.tsx @@ -11,7 +11,7 @@ import { SearchReadyAtom, ModeAtom } from '../state'; -import { Messenger } from '@estruyf/vscode/dist/client'; +import { Messenger, messageHandler } from '@estruyf/vscode/dist/client'; import { EventData } from '@estruyf/vscode/dist/models'; import { NavigationType } from '../models'; import { GeneralCommands } from '../../constants'; @@ -31,6 +31,11 @@ export default function useMessages() { const messageListener = (event: MessageEvent>) => { const message = event.data; + messageHandler.send(GeneralCommands.toVSCode.logging.verbose, { + message: `Message received: ${message.command}`, + location: 'DASHBOARD' + }); + switch (message.command) { case DashboardCommand.loading: setLoading(message.payload); diff --git a/src/helpers/DashboardSettings.ts b/src/helpers/DashboardSettings.ts index 6fe7e208..8fd8cff7 100644 --- a/src/helpers/DashboardSettings.ts +++ b/src/helpers/DashboardSettings.ts @@ -87,7 +87,7 @@ export class DashboardSettings { } public static async getSettings() { - Logger.info('DashboardSettings:getSettings:start'); + Logger.verbose('DashboardSettings:getSettings:start'); try { const ext = Extension.getInstance(); @@ -171,7 +171,7 @@ export class DashboardSettings { lastUpdated: new Date().getTime() } as ISettings; - Logger.info('DashboardSettings:getSettings:end'); + Logger.verbose('DashboardSettings:getSettings:end'); return settings; } catch (error) { @@ -185,7 +185,7 @@ export class DashboardSettings { * @returns */ private static async getDataFiles(): Promise { - Logger.info('DashboardSettings:getDataFiles:start'); + Logger.verbose('DashboardSettings:getDataFiles:start'); const wsPath = parseWinPath(Folders.getWorkspaceFolder()?.fsPath); const files = Settings.get(SETTING_DATA_FILES); const folders = Settings.get(SETTING_DATA_FOLDERS); @@ -231,7 +231,7 @@ export class DashboardSettings { } } - Logger.info('DashboardSettings:getDataFiles:end'); + Logger.verbose('DashboardSettings:getDataFiles:end'); return clonedFiles; } } diff --git a/src/helpers/Logger.ts b/src/helpers/Logger.ts index 333e4c31..f16d65ad 100644 --- a/src/helpers/Logger.ts +++ b/src/helpers/Logger.ts @@ -1,7 +1,8 @@ import { Extension } from './Extension'; import { commands, OutputChannel, window } from 'vscode'; import { format } from 'date-fns'; -import { COMMAND_NAME } from '../constants'; +import { COMMAND_NAME, SETTING_LOGGING } from '../constants'; +import { Settings } from '.'; export type LoggerLocation = 'VSCODE' | 'DASHBOARD' | 'PANEL'; @@ -33,9 +34,19 @@ export class Logger { Logger.getInstance(); } - Logger.channel?.appendLine( - `["${type}" - ${format(new Date(), 'HH:mm:ss')}] ${location} | ${message}` - ); + const loggingLevel = Settings.get(SETTING_LOGGING) || 'info'; + + const logMessage = `["${type}" - ${format(new Date(), 'HH:mm:ss')}] ${location} | ${message}`; + + if (loggingLevel === 'verbose') { + Logger.log(logMessage); + } else if (loggingLevel === 'info' && type !== 'VERBOSE') { + Logger.log(logMessage); + } else if (loggingLevel === 'warning' && (type === 'WARNING' || type === 'ERROR')) { + Logger.log(logMessage); + } else if (loggingLevel === 'error' && type === 'ERROR') { + Logger.log(logMessage); + } } public static warning(message: string, location: LoggerLocation = 'VSCODE'): void { @@ -49,4 +60,8 @@ export class Logger { public static verbose(message: string, location: LoggerLocation = 'VSCODE'): void { Logger.info(message, location, 'VERBOSE'); } + + private static log(message: string) { + Logger.channel?.appendLine(message); + } } diff --git a/src/helpers/TaxonomyHelper.ts b/src/helpers/TaxonomyHelper.ts index d610cd17..da058062 100644 --- a/src/helpers/TaxonomyHelper.ts +++ b/src/helpers/TaxonomyHelper.ts @@ -74,7 +74,7 @@ export class TaxonomyHelper { * @param options */ public static async get(type: TaxonomyType): Promise { - Logger.info(`TaxonomyHelper:get:start:${type}`); + Logger.verbose(`TaxonomyHelper:get:start:${type}`); if (!TaxonomyHelper.db) { Logger.info(`TaxonomyHelper:get:db-not-initialized`); return; @@ -86,7 +86,7 @@ export class TaxonomyHelper { if (await TaxonomyHelper.db.exists(tagType)) { taxonomy = await TaxonomyHelper.db.getObject(tagType); } - Logger.info(`TaxonomyHelper:get:end:${type}`); + Logger.verbose(`TaxonomyHelper:get:end:${type}`); return taxonomy; } diff --git a/src/listeners/dashboard/BaseListener.ts b/src/listeners/dashboard/BaseListener.ts index c583b167..b7b923b3 100644 --- a/src/listeners/dashboard/BaseListener.ts +++ b/src/listeners/dashboard/BaseListener.ts @@ -15,9 +15,9 @@ export abstract class BaseListener { public static sendMsg(command: DashboardCommand, payload: any) { if (command === DashboardCommand.loading) { const loadingType = payload ? `- ${JSON.stringify(payload)}` : '- Turn off'; - Logger.info(`Sending message to dashboard: ${command} ${loadingType}`); + Logger.verbose(`Sending message to dashboard: ${command} ${loadingType}`); } else { - Logger.info(`Sending message to dashboard: ${command}`); + Logger.verbose(`Sending message to dashboard: ${command}`); } Dashboard.postWebviewMessage({ diff --git a/src/listeners/dashboard/SettingsListener.ts b/src/listeners/dashboard/SettingsListener.ts index 17d93ce1..bdb42738 100644 --- a/src/listeners/dashboard/SettingsListener.ts +++ b/src/listeners/dashboard/SettingsListener.ts @@ -199,9 +199,11 @@ export class SettingsListener extends BaseListener { * Retrieve the settings for the dashboard */ public static async getSettings(clear: boolean = false) { - Logger.info(`SettingsListener:getSettings:start - clear: ${clear}`); + Logger.verbose(`SettingsListener:getSettings:start - clear: ${clear}`); const settings = await DashboardSettings.get(clear); - Logger.info(`SettingsListener:getSettings:end - setting keys: ${Object.keys(settings).length}`); + Logger.verbose( + `SettingsListener:getSettings:end - setting keys: ${Object.keys(settings).length}` + ); this.sendMsg(DashboardCommand.settings, settings); } diff --git a/src/listeners/general/BaseListener.ts b/src/listeners/general/BaseListener.ts index 1e60163a..bb8ae884 100644 --- a/src/listeners/general/BaseListener.ts +++ b/src/listeners/general/BaseListener.ts @@ -25,6 +25,9 @@ export abstract class BaseListener { commands.executeCommand(command, args); } break; + case GeneralCommands.toVSCode.logging.verbose: + Logger.verbose(msg.payload.message, msg.payload.location); + break; case GeneralCommands.toVSCode.logging.info: Logger.info(msg.payload.message, msg.payload.location); break; @@ -43,7 +46,7 @@ export abstract class BaseListener { * @param data */ public static sendMsg(command: string, payload: any) { - Logger.info(`Sending message to webview (panel&dashboard): ${command}`); + Logger.verbose(`Sending message to webview (panel&dashboard): ${command}`); const extPath = Extension.getInstance().extensionPath; const panel = PanelProvider.getInstance(extPath); diff --git a/src/listeners/general/GitListener.ts b/src/listeners/general/GitListener.ts index dd427b8b..b3a84e19 100644 --- a/src/listeners/general/GitListener.ts +++ b/src/listeners/general/GitListener.ts @@ -65,10 +65,10 @@ export class GitListener { } | undefined > { - Logger.info('GitListener:getSettings:start'); + Logger.verbose('GitListener:getSettings:start'); const gitActions = Settings.get(SETTING_GIT_ENABLED); if (gitActions) { - Logger.info('GitListener:getSettings:end:enabled'); + Logger.verbose('GitListener:getSettings:end:enabled'); return { isGitRepo: gitActions ? await GitListener.isGitRepository() : false, actions: gitActions || false, @@ -81,7 +81,7 @@ export class GitListener { }; } - Logger.info('GitListener:getSettings:end:disabled'); + Logger.verbose('GitListener:getSettings:end:disabled'); return; } diff --git a/src/panelWebView/PanelProvider.ts b/src/panelWebView/PanelProvider.ts index 8584ecf7..e6cf7986 100644 --- a/src/panelWebView/PanelProvider.ts +++ b/src/panelWebView/PanelProvider.ts @@ -29,6 +29,7 @@ import { Telemetry } from '../helpers/Telemetry'; import { GitListener, ModeListener } from '../listeners/general'; import { Folders } from '../commands'; import { basename } from 'path'; +import { ignoreMsgCommand } from '../utils'; export class PanelProvider implements WebviewViewProvider, Disposable { public static readonly viewType = 'frontMatter.explorer'; @@ -100,7 +101,9 @@ export class PanelProvider implements WebviewViewProvider, Disposable { this.updateCurrentFile(); webviewView.webview.onDidReceiveMessage(async (msg) => { - Logger.info(`Receiving message from panel: ${msg.command}`); + if (!ignoreMsgCommand(msg.command)) { + Logger.info(`Receiving message from panel: ${msg.command}`); + } LocalizationListener.process(msg); FieldsListener.process(msg); diff --git a/src/panelWebView/hooks/useMessages.tsx b/src/panelWebView/hooks/useMessages.tsx index 99b6d93b..39ddcdfd 100644 --- a/src/panelWebView/hooks/useMessages.tsx +++ b/src/panelWebView/hooks/useMessages.tsx @@ -6,7 +6,7 @@ import { FolderInfo } from '../../models/PanelSettings'; import { Command } from '../Command'; import { CommandToCode } from '../CommandToCode'; import { TagType } from '../TagType'; -import { Messenger } from '@estruyf/vscode/dist/client'; +import { Messenger, messageHandler } from '@estruyf/vscode/dist/client'; import { EventData } from '@estruyf/vscode/dist/models'; import { useRecoilState } from 'recoil'; import { PanelSettingsAtom } from '../state'; @@ -23,6 +23,11 @@ export default function useMessages() { const messageListener = (event: MessageEvent>) => { const message = event.data; + messageHandler.send(GeneralCommands.toVSCode.logging.verbose, { + message: `Message received: ${message.command}`, + location: 'PANEL' + }); + switch (message.command) { case Command.metadata: setMetadata(message.payload); diff --git a/src/services/PagesParser.ts b/src/services/PagesParser.ts index d36cc11f..2b770b17 100644 --- a/src/services/PagesParser.ts +++ b/src/services/PagesParser.ts @@ -77,7 +77,7 @@ export class PagesParser { * Parse all pages in the workspace */ public static async parsePages() { - Logger.info('PagesParser:parsePages:start'); + Logger.verbose('PagesParser:parsePages:start'); i18n.clearFiles(); Folders.clearCached(); const ext = Extension.getInstance(); @@ -93,7 +93,7 @@ export class PagesParser { PagesParser.pagesStatusBar.show(); for (const folder of folderInfo) { - Logger.info(`PagesParser::parsePages: Parsing folder ${folder.title} - ${folder.files}`); + Logger.verbose(`PagesParser:parsePages: Parsing folder ${folder.title} - ${folder.files}`); for (const file of folder.lastModified) { if (isValidFile(file.fileName)) { try { @@ -140,7 +140,7 @@ export class PagesParser { PagesParser.pagesStatusBar.hide(); Folders.clearCached(); - Logger.info('PagesParser:parsePages:end'); + Logger.verbose('PagesParser:parsePages:end'); } /** diff --git a/src/utils/ignoreMsgCommand.ts b/src/utils/ignoreMsgCommand.ts new file mode 100644 index 00000000..c4663657 --- /dev/null +++ b/src/utils/ignoreMsgCommand.ts @@ -0,0 +1,12 @@ +import { GeneralCommands } from '../constants'; + +export const ignoreMsgCommand = (command: string) => { + const toIgnore = [ + GeneralCommands.toVSCode.logging.verbose, + GeneralCommands.toVSCode.logging.info, + GeneralCommands.toVSCode.logging.warn, + GeneralCommands.toVSCode.logging.error + ]; + + return toIgnore.includes(command); +}; diff --git a/src/utils/index.ts b/src/utils/index.ts index 83547e0d..97f644e5 100644 --- a/src/utils/index.ts +++ b/src/utils/index.ts @@ -6,11 +6,13 @@ export * from './fetchWithTimeout'; export * from './fieldWhenClause'; export * from './flattenObjectKeys'; export * from './getLocalizationFile'; +export * from './ignoreMsgCommand'; export * from './mkdirAsync'; export * from './readFileAsync'; export * from './readdirAsync'; export * from './renameAsync'; export * from './rmdirAsync'; +export * from './sentryInit'; export * from './sortPages'; export * from './unlinkAsync'; export * from './writeFileAsync';