在 Node.js 里“改日志格式”要看你用的是什么日志方案。下面按常见场景给你一套从简单到规范的改法。
console(最简单,不推荐生产)默认格式是普通字符串,不好解析。
console.log('user login');
const log = (msg, meta = {}) => {
console.log(JSON.stringify({
time: new Date().toISOString(),
level: 'info',
msg,
...meta,
}));
};
log('user login', { userId: 1 });
输出:
{"time":"2026-01-21T10:00:00.000Z","level":"info","msg":"user login","userId":1}
✅ 适合:调试、小脚本
❌ 不适合:大型项目
winston(最常用)npm i winston
const winston = require('winston');
const logger = winston.createLogger({
format: winston.format.combine(
winston.format.timestamp(),
winston.format.errors({ stack: true }),
winston.format.json()
),
transports: [
new winston.transports.Console()
]
});
logger.info('user login', { userId: 1 });
输出:
{"level":"info","message":"user login","userId":1,"timestamp":"2026-01-21T10:00:00.000Z"}
winston.format.printf(({ level, message, timestamp }) => {
return `${timestamp} [${level.toUpperCase()}] ${message}`;
})
完整示例:
const logger = winston.createLogger({
format: winston.format.combine(
winston.format.timestamp({ format: 'YYYY-MM-DD HH:mm:ss' }),
winston.format.printf(info =>
`${info.timestamp} [${info.level}] ${info.message}`
)
),
transports: [new winston.transports.Console()]
});
输出:
2026-01-21 10:00:00 [info] user login
pino(高性能,推荐生产)npm i pino
const pino = require('pino');
const logger = pino({
level: 'info',
timestamp: pino.stdTimeFunctions.isoTime
});
logger.info({ userId: 1 }, 'user login');
输出(JSON):
{"level":30,"time":1700000000000,"msg":"user login","userId":1}
npm i pino-pretty
const logger = pino({
transport: {
target: 'pino-pretty',
options: {
colorize: true,
translateTime: 'SYS:yyyy-mm-dd HH:MM:ss',
ignore: 'pid,hostname'
}
}
});
输出:
2026-01-21 10:00:00 [info] user login
npm i morgan
const morgan = require('morgan');
app.use(morgan('combined')); // Apache 风格
app.use(morgan('dev')); // 简短
自定义格式:
morgan(':method :url :status :response-time ms');
| 场景 | 推荐方案 |
|---|---|
| 小项目 | console + JSON |
| 普通后端 | winston |
| 高并发 | pino |
| HTTP 请求日志 | morgan |
| 生产环境 | JSON 格式日志 |
如果你愿意,可以告诉我:
我可以直接给你一份可直接用的日志配置模板。