95 lines
2.4 KiB
TypeScript
95 lines
2.4 KiB
TypeScript
import { createColors } from 'colorette'
|
|
import dayjs from 'dayjs'
|
|
import pino, { type BaseLogger } from 'pino'
|
|
import { isProxy, toRaw } from 'vue'
|
|
|
|
const { blue, cyan, green, red } = createColors({ useColor: true })
|
|
|
|
export class LoggingService {
|
|
private _logger: BaseLogger
|
|
|
|
constructor() {
|
|
this._logger = pino({
|
|
browser: {
|
|
asObject: true,
|
|
transmit: {
|
|
level: import.meta.env.VITE_LOG_LEVEL || 'error',
|
|
send: (level, logEvent) => {
|
|
const { ts, messages } = logEvent
|
|
const logStr: string[] = [dayjs(ts).format('HH:mm:ss.SSS')]
|
|
logStr.push(this.colors[level](level.toUpperCase()))
|
|
const firstMessage = messages.shift()
|
|
if (firstMessage.type === 'Error') {
|
|
logStr.push(red(firstMessage.message))
|
|
logStr.push(red(firstMessage.stack || ''))
|
|
} else if (typeof firstMessage === 'string') {
|
|
logStr.push(cyan(firstMessage))
|
|
} else {
|
|
messages.unshift(firstMessage)
|
|
}
|
|
|
|
if (messages.length > 0) {
|
|
console.log(
|
|
`${logStr.join(' ')}:`,
|
|
...messages.filter((m) => m !== undefined && m !== null)
|
|
)
|
|
} else {
|
|
console.log(logStr.join(' '))
|
|
}
|
|
}
|
|
}
|
|
}
|
|
})
|
|
}
|
|
|
|
private get colors(): any {
|
|
return {
|
|
info: green,
|
|
debug: blue,
|
|
error: red
|
|
}
|
|
}
|
|
|
|
debug(message: string, data?: any) {
|
|
this._logger.debug(message, data)
|
|
}
|
|
|
|
info(message: string, data?: any) {
|
|
this._logger.info(this._getMessageWidthObject(message, data))
|
|
}
|
|
|
|
warn(message: string, data?: any) {
|
|
this._logger.warn(this._getMessageWidthObject(message, data))
|
|
}
|
|
|
|
error(error: any, message?: string) {
|
|
this._logger.error(error, message)
|
|
}
|
|
|
|
fatal(message: string, data?: any) {
|
|
this._logger.fatal(this._getMessageWidthObject(message, data))
|
|
}
|
|
|
|
trace(message: string, data?: any) {
|
|
this._logger.trace(this._getMessageWidthObject(message, data))
|
|
}
|
|
|
|
object(message: any) {
|
|
this._logger.info(this._getStringObject(message))
|
|
}
|
|
|
|
_getMessageWidthObject(message: string, data?: any) {
|
|
if (!data) {
|
|
return message
|
|
}
|
|
return `${message}\n${this._getStringObject(data)}`
|
|
}
|
|
|
|
_getStringObject(data: any): any {
|
|
if (isProxy(data)) {
|
|
return this._getStringObject(toRaw(data))
|
|
}
|
|
return JSON.stringify(data, null, 2)
|
|
}
|
|
}
|