在 Node.js 中,日志格式的设置取决于你使用的日志库或框架。下面按常见场景给你一个完整说明,从简单到规范。
console.log('[INFO]', new Date().toISOString(), '服务启动')
✅ 简单
❌ 无级别、无结构化、不适合生产
npm install winston
const winston = require('winston')
const logger = winston.createLogger({
level: 'info',
format: winston.format.combine(
winston.format.timestamp(),
winston.format.printf(({ timestamp, level, message }) => {
return `${timestamp} [${level.toUpperCase()}] ${message}`
})
),
transports: [
new winston.transports.Console()
]
})
logger.info('服务启动')
输出示例:
2026-01-21T10:30:00.000Z [INFO] 服务启动
const logger = winston.createLogger({
format: winston.format.combine(
winston.format.timestamp(),
winston.format.json()
),
transports: [new winston.transports.Console()]
})
输出:
{"level":"info","message":"服务启动","timestamp":"2026-01-21T10:30:00.000Z"}
✅ 适合日志系统(Elasticsearch / Loki)
const logger = winston.createLogger({
format: winston.format.combine(
winston.format.timestamp(),
winston.format((info) => {
info.requestId = global.requestId || '-'
return info
})(),
winston.format.json()
),
transports: [new winston.transports.Console()]
})
npm install pino
const pino = require('pino')
const logger = pino({
level: 'info',
timestamp: pino.stdTimeFunctions.isoTime
})
logger.info('服务启动')
输出(JSON):
{"level":30,"time":1700000000000,"msg":"服务启动"}
const logger = pino({
formatters: {
log: (object) => {
return {
...object,
env: process.env.NODE_ENV
}
}
}
})
npm install morgan
const morgan = require('morgan')
const logger = require('./logger')
app.use(morgan('combined', {
stream: {
write: msg => logger.info(msg.trim())
}
}))
{
"timestamp": "2026-01-21T10:30:00.000Z",
"level": "info",
"service": "user-service",
"requestId": "abc-123",
"message": "用户登录成功",
"userId": 1001
}
| 级别 | 说明 |
|---|---|
| error | 错误 |
| warn | 警告 |
| info | 一般信息 |
| debug | 调试 |
| trace | 追踪 |
✅ 开发环境:简单文本
✅ 生产 / 微服务:JSON + requestId
✅ 高并发:pino
✅ 通用:winston
如果你愿意,我可以帮你:
你现在用的是 Express / Koa / NestJS / 纯 Node.js?