JavaScript后端日志系统:使用Winston构建专业日志

Winston是Node.js生态中最流行的日志库之一,它提供了强大的日志记录功能,支持多种传输方式和格式化选项。

安装Winston

bash 复制代码
pnpm i winston

基础使用示例

javascript 复制代码
const winston = require('winston')
const path = require('path')

// 创建日志格式
const logFormat = winston.format.combine(
  winston.format.timestamp({ format: 'YYYY-MM-DD HH:mm:ss' }),
  winston.format.errors({ stack: true }),
  winston.format.json(),
)

// 创建控制台格式(开发环境使用)
const consoleFormat = winston.format.combine(
  winston.format.colorize(),
  winston.format.timestamp({ format: 'YYYY-MM-DD HH:mm:ss' }),
  winston.format.printf(({ timestamp, level, message, ...meta }) => {
    return `${timestamp} [${level}]: ${message} ${Object.keys(meta).length ? JSON.stringify(meta, null, 2) : ''}`
  }),
)

// 创建logger实例
const logger = winston.createLogger({
  level: process.env.LOG_LEVEL || 'info',
  format: logFormat,
  defaultMeta: { service: 'vue3-big-event-backend' },
  transports: [
    // 错误日志文件
    new winston.transports.File({
      filename: path.join(__dirname, '../../logs/error.log'),
      level: 'error',
      maxsize: 5242880, // 5MB
      maxFiles: 5,
    }),
    // 所有日志文件
    new winston.transports.File({
      filename: path.join(__dirname, '../../logs/combined.log'),
      maxsize: 5242880, // 5MB
      maxFiles: 5,
    }),
  ],
})

// 开发环境添加控制台输出
if (process.env.NODE_ENV !== 'production') {
  logger.add(
    new winston.transports.Console({
      format: consoleFormat,
    }),
  )
}

// 创建日志中间件
const requestLogger = (req, res, next) => {
  const start = Date.now()

  res.on('finish', () => {
    const duration = Date.now() - start
    logger.info('HTTP请求', {
      method: req.method,
      url: req.url,
      statusCode: res.statusCode,
      duration: `${duration}ms`,
      userAgent: req.get('User-Agent'),
      ip: req.ip,
    })
  })

  next()
}

// 错误日志中间件
const errorLogger = (err, req, res, next) => {
  logger.error('服务器错误', {
    message: err.message,
    stack: err.stack,
    url: req.url,
    method: req.method,
    ip: req.ip,
  })
  next(err)
}

module.exports = {
  logger,
  requestLogger,
  errorLogger,
}

如何使用

1. 在Express应用中使用

javascript 复制代码
const { requestLogger, errorLogger } = require('./utils/log/index.js')

app.use(requestLogger) // 请求日志
app.use(errorLogger)   // 错误日志

2. 在代码中记录日志

javascript 复制代码
const { logger } = require('./utils/log')

// 不同级别的日志
logger.info('用户登录成功', { username: 'john', ip: '192.168.1.1' })
logger.warn('API调用频繁', { endpoint: '/api/users' })
logger.error('数据库连接失败', { error: err.message })

3. 环境变量配置

bash 复制代码
# 设置日志级别
LOG_LEVEL=debug

# 生产环境不输出控制台日志
NODE_ENV=production

主要特性

  • 多级别日志:debug、info、warn、error、fatal
  • 多种输出目标:文件、控制台、数据库等
  • 结构化日志:JSON格式便于分析
  • 日志轮转:自动管理日志文件大小和数量
  • 开发环境友好:彩色控制台输出

以上就是本篇全部内容,感兴趣还请三连支持一波!灰常感谢!

相关推荐
乐橙开放平台6 小时前
离岗检测怎么实现?通过客流相机或 AI 摄像头识别岗位区域无人状态,再推送告警消息
人工智能·笔记·后端·数码相机·物联网·自动化·音视频
ZhengEnCi14 小时前
模型训练完整流程:从数据准备到模型上线的 10 个关键步骤(全文可跑)
后端·算法
王中阳Go14 小时前
后端转 Agent 岗面试怎么答:8 个高频问题与应答口径
人工智能·后端·python·大语言模型
程序猿DD14 小时前
OctaFuse Gateway 2.18.0:MCP 接入支持 OAuth,供应商粘性绑定可视化管理
后端
ZhengEnCi16 小时前
Agent 规则管理:让 Memory 做索引、让 Skill 存规则——上下文上限实测与分工方案
后端
nice_lcj52017 小时前
深入理解 Java 反射:从 Class 对象到方法调用(含性能实测 + 迷你 IOC 实战 + 面试考点)
java·开发语言·后端·面试
骑着蜗牛撵大象32717 小时前
2026 后端 AI 工程化:Spring AI 管调用、MCP 管工具、Agent 内嵌管自治
java·人工智能·后端·spring·ai·可观测性·mcp
摸爬滚打的小李18 小时前
Spring XML + WAR + Tomcat 项目启动
后端
IT_陈寒19 小时前
SpringBoot自动配置的坑,这次终于爬出来了
前端·人工智能·后端
RainbowFish19 小时前
# RAG 与智能体记忆:从原理到工程实践 > 一篇给学习者的总结。
后端