process.env.LOG_LEVEL || (process.env.NODE_ENV === 'production' ? 'warn' : 'debug')。Pino 高性能异步写入(生产)
const pino = require('pino');
// 异步写入文件;开发时可接入 pino-pretty 仅在控制台美化
const logger = pino(
{ level: process.env.LOG_LEVEL || 'info' },
pino.destination('/var/log/nodejs/app.log')
);
logger.info({ route: '/health', status: 200, latencyMs: 3 });
要点:生产用 JSON 直写文件,异步无锁;仅在本地开发接入 pino-pretty 做美化,避免生产使用。
Winston 多传输 + 按大小轮转
const winston = require('winston');
const { createLogger, format, transports } = winston;
const { combine, timestamp, printf, json } = format;
const DailyRotateFile = require('winston-daily-rotate-file');
const transport = new DailyRotateFile({
filename: 'application-%DATE%.log',
datePattern: 'YYYY-MM-DD',
zippedArchive: true,
maxSize: '20m',
maxFiles: '14d'
});
const logger = createLogger({
level: process.env.LOG_LEVEL || 'info',
format: combine(timestamp(), json()),
transports: [
new transports.File({ filename: 'error.log', level: 'error' }),
transport
]
});
if (process.env.NODE_ENV !== 'production') {
logger.add(new transports.Console({ format: printf(({ level, message, timestamp }) => {
return `${timestamp} ${level}: ${message}`;
})}));
}
logger.info({ event: 'startup', pid: process.pid });
要点:错误单独文件;按天轮转并压缩;开发环境控制台可读性好。
系统级日志轮转 logrotate(Ubuntu 常用)
/var/log/nodejs/*.log {
daily
missingok
rotate 7
compress
notifempty
create 0640 root adm
}
要点:与应用内轮转二选一或配合使用,统一压缩与保留策略。
集中式日志与错误追踪
安全与合规