在Node.js中选择合适的日志格式需要综合考虑可读性、结构化需求、分析工具兼容性以及性能等因素。以下是针对不同场景的详细建议:
格式类型 | 优点 | 缺点 | 适用场景 |
---|---|---|---|
纯文本 | 人类可读,简单直接 | 难以机器解析 | 开发环境/简单应用 |
JSON | 结构化,易解析 | 体积稍大 | 生产环境/ELK等日志系统 |
CSV | 表格兼容 | 嵌套数据表现力差 | 报表系统 |
Syslog | 标准化,支持网络传输 | 配置复杂 | 企业级系统 |
GELF | 二进制高效,支持压缩 | 需要专用解析器 | Graylog等专用日志收集器 |
开发环境:
// 使用winston的简单格式
const { createLogger, format, transports } = require('winston');
const logger = createLogger({
format: format.combine(
format.colorize(),
format.timestamp({ format: 'YYYY-MM-DD HH:mm:ss' }),
format.printf(info => `${info.timestamp} [${info.level}] ${info.message}`)
),
transports: [new transports.Console()]
});
生产环境:
// 结构化JSON日志
const logger = createLogger({
format: format.combine(
format.timestamp(),
format.json({
space: 2, // 开发时可读性优化
replacer: (key, value) => {
if (value instanceof Error) {
return {
message: value.message,
stack: value.stack,
...value
};
}
return value;
}
})
),
transports: [
new transports.File({ filename: 'app.log' }),
new transports.Console() // 保持控制台输出
]
});
错误处理增强:
logger.on('error', (err) => {
console.error('Logger failed:', err);
// 可添加fallback处理(如发送到Sentry)
});
日志切割:
# 使用logrotate(Linux系统)
/var/log/node-app/*.log {
daily
rotate 7
compress
missingok
notifempty
}
性能敏感场景:
// 使用pino(性能比winston高约5倍)
const pino = require('pino');
const logger = pino({
level: 'info',
formatters: {
level: (label) => ({ level: label.toUpperCase() })
},
transport: {
target: 'pino-pretty',
options: { colorize: true }
}
});
建议包含以下核心字段:
{
"timestamp": "ISO8601格式",
"level": "INFO/WARN/ERROR等",
"service": "服务名称",
"requestId": "请求追踪ID",
"userId": "可选用户标识",
"durationMs": 123,
"error": {
"message": "",
"stack": "",
"code": ""
}
}
避免记录:
敏感信息处理:
format.redact({
paths: ['password', 'creditCard', '*.token'],
censor: '**REDACTED**'
})
级别 | 使用场景 |
---|---|
FATAL | 导致服务完全不可用的错误(如数据库连接永久丢失) |
ERROR | 需要立即处理但不影响系统运行的错误(如API验证失败) |
WARN | 异常情况但可自动恢复(如重试操作成功) |
INFO | 关键业务流程节点(如用户注册成功) |
DEBUG | 调试信息(如SQL查询语句) |
TRACE | 详细跟踪信息(如函数调用参数) |
根据实际需求选择合适的日志库组合(如winston+pino),并确保与现有监控系统(如Prometheus+Grafana)集成。在Kubernetes环境中建议使用Fluentd+ELK方案收集日志。