All files / src logger.ts

39.09% Statements 43/110
50% Branches 4/8
23.07% Functions 3/13
39.09% Lines 43/110

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 1391x   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()