Skip to content

日志库 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('>>> 日志组件载入完成')
}

Released under the MIT License.