vscode-extensions-logging
Version:
<p align="center"> <h1>vscode-extensions-logging</h1> </p>
98 lines (83 loc) • 2.57 kB
text/typescript
import { OutputChannel, window } from 'vscode'
import { EOL } from 'os'
import { isEmpty } from 'lodash'
import { inspect } from 'util'
import { createLogger, Logger, format } from 'winston'
import Transport from 'winston-transport'
export class ExtensionsLogging {
private readonly logger!: Logger
constructor (outputChannel: OutputChannel, loglevel = 'info') {
const { combine, metadata, printf } = format
this.logger = createLogger({
level: loglevel || 'info',
format: combine(
metadata(),
printf(info => {
let result = `${info.level}: `
// tslint:disable-next-line: strict-type-predicates
if (typeof info.message === 'string') {
result += info.message
} else {
result += inspect(info.message, false, 5)
}
if (info.metadata && !isEmpty(info.metadata)) {
result += EOL
if (typeof info.metadata === 'string') {
result += info.metadata
} else {
result += inspect(info.metadata, false, 5)
}
}
return result
}),
),
transports: [new VSCodeExtensionTransport(outputChannel)],
exitOnError: false,
})
}
static register (extensionName: string, loglevel = 'info') {
const outputChannel = window.createOutputChannel(extensionName)
return new ExtensionsLogging(outputChannel, loglevel)
}
public log (log: any, context?: any): void {
this.logger.info(log, context)
}
public error (log: any, context?: any): void {
this.logger.error(log, context)
}
public warn (log: any, context?: any): void {
this.logger.warn(log, context)
}
public info (log: any, context?: any): void {
this.logger.info(log, context)
}
public debug (log: any, context?: any): void {
this.logger.debug(log, context)
}
public notice (log: any, context?: any): void {
this.logger.notice(log, context)
}
public crit (log: any, context?: any): void {
this.logger.crit(log, context)
}
public alert (log: any, context?: any): void {
this.logger.alert(log, context)
}
public emerg (log: any, context?: any): void {
this.logger.emerg(log, context)
}
}
class VSCodeExtensionTransport extends Transport {
constructor (private readonly outputChannel: OutputChannel) {
super()
}
log (info: any, next: () => void) {
setImmediate(() => {
this.emit('logged', info)
})
this.outputChannel.appendLine(info.message)
if (next) {
next()
}
}
}