Press n or j to go to the next uncovered block, b, p or k for the previous block.
| 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 | 1x 1x 1x 1x 1x 1x 1x 1x 1x 4x 4x 4x 1x 4x 4x 4x 4x 4x 1x 4x 4x 4x 4x 4x 4x 4x 4x 4x 4x 4x 4x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x | import * as vscode from 'vscode'
export enum LogLevel {
ERROR = 0,
WARN = 1,
INFO = 2,
DEBUG = 3,
}
export class Logger {
private static instance: Logger
private outputChannel: vscode.OutputChannel
private logLevel: LogLevel = LogLevel.INFO
private constructor() {
this.outputChannel = vscode.window.createOutputChannel('JSON String Code Editor')
this.updateLogLevel()
}
public static getInstance(): Logger {
if (!Logger.instance) {
Logger.instance = new Logger()
}
return Logger.instance
}
private updateLogLevel(): void {
const config = vscode.workspace.getConfiguration('vscode-json-string-code-editor')
const level = config.get<string>('logLevel', 'info')
switch (level) {
case 'error':
this.logLevel = LogLevel.ERROR
break
case 'warn':
this.logLevel = LogLevel.WARN
break
case 'info':
this.logLevel = LogLevel.INFO
break
case 'debug':
this.logLevel = LogLevel.DEBUG
break
default:
this.logLevel = LogLevel.INFO
}
}
private shouldLog(level: LogLevel): boolean {
return level <= this.logLevel
}
private formatTimestamp(): string {
const now = new Date()
const year = now.getFullYear()
const month = String(now.getMonth() + 1).padStart(2, '0')
const day = String(now.getDate()).padStart(2, '0')
const hours = String(now.getHours()).padStart(2, '0')
const minutes = String(now.getMinutes()).padStart(2, '0')
const seconds = String(now.getSeconds()).padStart(2, '0')
const milliseconds = String(now.getMilliseconds()).padStart(3, '0')
return `${year}-${month}-${day} ${hours}:${minutes}:${seconds}.${milliseconds}`
}
private log(level: LogLevel, message: string): void {
if (!this.shouldLog(level)) {
return
}
const timestamp = this.formatTimestamp()
const levelStr = LogLevel[level]
const logMessage = `[${timestamp}] [${levelStr}] ${message}`
// 1. 输出到 Output Channel
this.outputChannel.appendLine(logMessage)
// 2. 输出到 Console
switch (level) {
case LogLevel.ERROR:
console.error(logMessage)
break
case LogLevel.WARN:
console.warn(logMessage)
break
case LogLevel.INFO:
console.info(logMessage)
break
case LogLevel.DEBUG:
console.debug(logMessage)
break
}
}
public error(message: string, showMessage = false): void {
this.log(LogLevel.ERROR, message)
if (showMessage) {
vscode.window.showErrorMessage(message)
}
}
public warn(message: string, showMessage = false): void {
this.log(LogLevel.WARN, message)
if (showMessage) {
vscode.window.showWarningMessage(message)
}
}
public info(message: string, showMessage = false): void {
this.log(LogLevel.INFO, message)
if (showMessage) {
vscode.window.showInformationMessage(message)
}
}
public debug(message: string, showMessage = true): void {
this.log(LogLevel.DEBUG, message)
if (showMessage) {
vscode.window.showInformationMessage(message)
}
}
public show(): void {
this.outputChannel.show()
}
public dispose(): void {
this.outputChannel.dispose()
}
// 监听配置变化
public onConfigurationChanged(): void {
this.updateLogLevel()
}
}
// 导出单例实例
export const logger = Logger.getInstance()
|