温馨提示×

Nodejs日志格式如何定义

小樊
37
2026-08-17 17:46:25
栏目: 编程语言

在 Node.js 中,日志格式的定义通常取决于你使用的日志库、业务需求以及运行环境(本地 / 容器 / 云)。下面从通用原则 → 常见格式 → 示例 → 推荐实践来说明。


一、日志格式的核心要素

一个合理的日志格式通常包含:

字段 说明
timestamp 时间戳(ISO 8601 推荐)
level 日志级别(info / warn / error)
message 日志内容
context 业务上下文(userId、requestId、module)
stack 错误堆栈(仅 error)
meta 额外结构化数据

二、常见日志格式类型

1️⃣ 简单文本格式(开发环境)

2026-01-21 10:32:11 [info] 用户登录成功 userId=123

✅ 可读性好
❌ 不利于机器解析


2️⃣ JSON 格式(生产环境 ✅ 推荐)

{
  "timestamp": "2026-01-21T10:32:11.123Z",
  "level": "info",
  "message": "用户登录成功",
  "userId": 123,
  "requestId": "req-abc"
}

✅ 适合 ELK / Loki / Datadog
✅ 易检索、易分析
✅ 云原生标准


3️⃣ 结构化 + 人类可读(折中)

[2026-01-21T10:32:11.123Z] INFO  [req-abc] 用户登录成功 userId=123

三、使用主流日志库定义格式

✅ Winston(最常用)

安装

npm install winston

自定义日志格式(JSON)

const winston = require('winston');

const logger = winston.createLogger({
  level: 'info',
  format: winston.format.combine(
    winston.format.timestamp(),
    winston.format.errors({ stack: true }),
    winston.format.json()
  ),
  transports: [
    new winston.transports.Console()
  ]
});

logger.info('用户登录成功', {
  userId: 123,
  requestId: 'req-abc'
});

输出:

{
  "level": "info",
  "message": "用户登录成功",
  "userId": 123,
  "requestId": "req-abc",
  "timestamp": "2026-01-21T10:32:11.123Z"
}

✅ 自定义文本格式

winston.format.printf(({ timestamp, level, message, ...meta }) => {
  return `${timestamp} [${level.toUpperCase()}] ${message} ${JSON.stringify(meta)}`;
})

✅ Pino(高性能,JSON 默认)

npm install pino
const pino = require('pino');
const logger = pino({
  level: 'info',
  timestamp: pino.stdTimeFunctions.isoTime
});

logger.info({ userId: 123 }, '用户登录成功');

输出:

{"level":30,"time":"2026-01-21T10:32:11.123Z","msg":"用户登录成功","userId":123}

✅ 性能极高
✅ 云环境首选


四、HTTP / 请求日志格式(非常重要)

推荐字段

{
  "timestamp": "...",
  "level": "info",
  "method": "GET",
  "url": "/api/user",
  "status": 200,
  "duration": 34,
  "requestId": "req-abc",
  "ip": "127.0.0.1"
}

Express 示例(Winston)

app.use((req, res, next) => {
  const start = Date.now();
  res.on('finish', () => {
    logger.info('HTTP 请求', {
      method: req.method,
      url: req.url,
      status: res.statusCode,
      duration: Date.now() - start
    });
  });
  next();
});

五、不同环境推荐格式

环境 推荐格式
本地开发 彩色文本
测试环境 JSON
生产环境 JSON + 日志平台
Docker / K8s JSON(stdout)

六、日志格式最佳实践 ✅

  1. 生产环境强制 JSON
  2. 统一时间格式(ISO 8601)
  3. 每个请求一个 requestId
  4. 错误日志必须包含 stack
  5. 避免日志中输出敏感信息
  6. 日志只做记录,不做逻辑判断

七、总结一句话

Node.js 日志格式定义 = 结构化 JSON + 时间戳 + 日志级别 + 业务上下文

如果你愿意,我可以帮你:

  • ✅ 设计一套 企业级日志规范
  • ✅ 封装一个 logger 模块
  • ✅ 对接 ELK / Loki / Datadog
  • ✅ 给你一个 Express / Koa / NestJS 完整示例

你现在的项目是哪种?

0