日志库 winston 的使用
一个简单的使用示例
ts
import winston, { format } from 'winston'
import { green, gray, italic } from 'chalk'
import 'winston-daily-rotate-file'
import chalk from 'chalk'
const { combine, timestamp, label, printf } = format
let isProdEnv = false
const withChalk = (str: string, chalkFns: chalk.Chalk[]): string => {
return isProdEnv
? str
: chalkFns
.reduce((pV, cV) => {
str = pV(str)
return cV
})(str)
.toString()
}
const logFormat = printf(({ level, message, label, timestamp }) => {
const labelAndPidStr = withChalk(`[${label}] ${process.pid} - `, [green])
const levelStr = withChalk(' ' + level.toUpperCase() + ' ', [green])
const msg = typeof message === 'object' ? JSON.stringify(message) : message
const ts = withChalk(timestamp, [gray, italic])
return labelAndPidStr + ts + levelStr + msg
})
export let logger: winston.Logger
export const initLogger = (serviceName: string, isProd: boolean) => {
console.log('>>> 载入日志组件')
isProdEnv = isProd
logger = winston.createLogger({
format: combine(
timestamp({
format: 'YYYY/MM/DD HH:mm:ss.SSS',
}),
label({ label: serviceName }),
logFormat
),
transports: [
/* new winston.transports.File({
filename: `.logs/${serviceName}/jason.log`,
maxsize: 1024,
}), */
new winston.transports.DailyRotateFile({
dirname: `_logs/${serviceName}`,
filename: isProdEnv ? `%DATE%.log` : `dev-%DATE%.log`,
maxSize: 1024,
datePattern: 'YYYY-MM-DD-HH',
}),
],
})
if (!isProdEnv) {
logger.add(new winston.transports.Console())
}
console.log('>>> 日志组件载入完成')
}