在 Node.js 里“修改日志格式”常见于以下几种场景,不同方案略有差异。下面按最常见 → 进阶的方式给你总结。
console.log / console.error(简单场景)console.log('hello');
function log(...args) {
const time = new Date().toISOString();
console.log(`[${time}] [INFO]`, ...args);
}
log('server start');
输出:
2026-01-21T10:30:00.000Z [INFO] server start
✅ 优点:简单
❌ 缺点:不适合大型项目
winston(最推荐生产方案)npm install winston
const winston = require('winston');
const logger = winston.createLogger({
format: winston.format.combine(
winston.format.timestamp({
format: 'YYYY-MM-DD HH:mm:ss'
}),
winston.format.printf(info => {
return `${info.timestamp} [${info.level.toUpperCase()}] ${info.message}`;
})
),
transports: [
new winston.transports.Console()
]
});
logger.info('服务启动');
logger.error('出错了');
输出:
2026-01-21 18:30:00 [INFO] 服务启动
2026-01-21 18:30:01 [ERROR] 出错了
| 格式 | 作用 |
|---|---|
timestamp |
时间 |
printf |
自定义输出 |
json |
JSON 格式 |
colorize |
控制台颜色 |
align |
对齐 |
errors |
打印错误堆栈 |
format: winston.format.combine(
winston.format.timestamp(),
winston.format.json()
)
const isDev = process.env.NODE_ENV === 'development';
const logger = winston.createLogger({
format: isDev
? winston.format.combine(
winston.format.colorize(),
winston.format.simple()
)
: winston.format.combine(
winston.format.timestamp(),
winston.format.json()
),
transports: [new winston.transports.Console()]
});
logger.info('用户登录', {
userId: 1001,
ip: '127.0.0.1'
});
结合 printf:
winston.format.printf(info => {
return `${info.timestamp} [${info.level}] ${info.message} ${JSON.stringify(info.meta || {})}`;
})
npm install morgan
const morgan = require('morgan');
app.use(morgan('[:date[iso]] :method :url :status :response-time ms'));
2026-01-21 18:30:00 [INFO] 服务启动
{
"timestamp": "2026-01-21T10:30:00.000Z",
"level": "info",
"message": "服务启动",
"service": "api"
}
Node.js 修改日志格式 = 使用日志库(推荐 winston) + format 组合
如果你愿意,可以告诉我:
我可以直接帮你写一套完整日志配置模板。