• 微信:WANCOME
  • 扫码加微信,提供专业咨询
  • 服务热线
  • 13215191218
    13027920428

  • 微信扫码访问本页
desc-2
环企首页

winston

概述

winston 是 Node.js 中功能最全的日志库,支持多目标输出(控制台/文件/数据库/远程服务),日志格式化灵活。相比 pino 更重量但功能更丰富,适合需要复杂日志路由的场景。

核心特点:

  • 多传输(transport)支持:控制台、文件、HTTP、Syslog 等
  • 细粒度日志分级
  • 强大的格式化能力
  • 日志轮转(与 winston-daily-rotate-file 配合)

安装:

npm install winston

核心函数

winston.createLogger(options)

创建 logger 实例。

const winston = require('winston')

const logger = winston.createLogger({
  level: 'info',         // 最低记录级别
  format: winston.format.combine(
    winston.format.timestamp({ format: 'YYYY-MM-DD HH:mm:ss' }),
    winston.format.errors({ stack: true }),
    winston.format.json()
  ),
  transports: [
    // 控制台输出
    new winston.transports.Console({
      format: winston.format.combine(
        winston.format.colorize(),
        winston.format.printf(({ level, message, timestamp, ...meta }) => {
          return `${timestamp} [${level}]: ${message} ${Object.keys(meta).length ? JSON.stringify(meta) : ''}`
        })
      )
    })
  ]
})

logger.info('服务启动')
logger.error('错误', { error: 'something wrong', code: 500 })

日志级别方法

logger.silly('调试信息')     // 0,最详细
logger.debug('调试信息')     // 1
logger.verbose('详细信息')    // 2
logger.info('一般信息')      // 3(默认级别)
logger.http('HTTP 请求')     // 4
logger.warn('警告')         // 5
logger.error('错误')        // 6
logger.emerg('系统崩溃')    // 7

输出到文件

const logger = winston.createLogger({
  level: 'info',
  format: winston.format.json(),
  transports: [
    // 所有日志
    new winston.transports.File({
      filename: 'logs/combined.log',
      maxsize: 5242880,      // 5MB 分割
      maxFiles: 5,           // 保留 5 个文件
      tailable: true         // 始终写入最新文件
    }),
    // 仅错误
    new winston.transports.File({
      filename: 'logs/error.log',
      level: 'error'        // 只记录 error 及以上
    })
  ]
})

格式化

// JSON 格式(生产)
format: winston.format.combine(
  winston.format.timestamp({ format: 'YYYY-MM-DD HH:mm:ss' }),
  winston.format.errors({ stack: true }),
  winston.format.json()
)

// 人类可读格式(开发)
format: winston.format.combine(
  winston.format.timestamp(),
  winston.format.colorize(),
  winston.format.printf(({ level, message, timestamp, ...meta }) => {
    const metaStr = Object.keys(meta).length ? JSON.stringify(meta, null, 2) : ''
    return `${timestamp} ${level}: ${message} ${metaStr}`
  })
)

// 自定义格式
winston.format.combine(
  winston.format.timestamp(),
  winston.format.printf(({ timestamp, level, message }) => {
    return `[${timestamp}] ${level.toUpperCase()}: ${message}`
  })
)

日志轮转(winston-daily-rotate-file)

npm install winston-daily-rotate-file
const DailyRotateFile = require('winston-daily-rotate-file')

const logger = winston.createLogger({
  transports: [
    new DailyRotateFile({
      filename: 'logs/app-%DATE%.log',
      datePattern: 'YYYY-MM-DD',
      zippedArchive: true,   // 自动压缩旧日志
      maxSize: '20m',
      maxFiles: '14d'        // 保留 14 天
    })
  ]
})

常见问题

问题 解决方案
生产日志太大 DailyRotateFilelogrotate 系统工具
想同时输出到控制台和文件 transports 数组中加多个 transport
想在日志中加自定义字段 logger.info('msg', { userId: 123, action: 'login' })
异步日志丢失 winston.createLogger + transports 数组,它会自动管理