Linux环境下Node.js日志配置指南
一 基础方案与日志库选型
二 快速上手示例
// logger.js
const winston = require('winston');
const logger = winston.createLogger({
level: process.env.LOG_LEVEL || 'info',
format: winston.format.combine(
winston.format.timestamp({ format: 'YYYY-MM-DD HH:mm:ss' }),
winston.format.errors({ stack: true }),
winston.format.splat(),
winston.format.json()
),
transports: [
new winston.transports.File({ filename: 'logs/error.log', level: 'error' }),
new winston.transports.File({ filename: 'logs/combined.log' })
]
});
if (process.env.NODE_ENV !== 'production') {
logger.add(new winston.transports.Console({
format: winston.format.combine(
winston.format.colorize(),
winston.format.simple()
)
}));
}
module.exports = logger;
// logger-pino.js
const pino = require('pino');
const logger = pino(
{
level: process.env.LOG_LEVEL || 'info',
timestamp: pino.stdTimeFunctions.isoTime
},
pino.destination('./logs/app.log')
);
// 开发时可在控制台美化输出
if (process.env.NODE_ENV !== 'production') {
const pretty = require('pino-pretty');
logger.info = (...args) => require('pino').info(pretty({ colorize: true }), ...args);
}
module.exports = logger;
// logger-log4js.js
const log4js = require('log4js');
log4js.configure({
appenders: {
out: { type: 'stdout' },
app: {
type: 'dateFile',
filename: 'logs/app',
pattern: 'yyyy-MM-dd.log',
alwaysIncludePattern: true,
daysToKeep: 90,
compress: true
}
},
categories: {
default: { appenders: ['out', 'app'], level: 'info' }
}
});
const logger = log4js.getLogger();
module.exports = logger;
LOG_LEVEL=debug node app.js
以上示例覆盖了控制台与文件输出、按级别分流、JSON 结构化、开发/生产差异化以及按日期滚动等常见需求。
三 日志轮转与保留策略
/path/to/your/nodejs/logs/*.log {
daily
rotate 7
compress
delaycompress
missingok
notifempty
create 640 root adm
sharedscripts
postrotate
# 若你的进程支持 USR1 触发重新打开日志,可在此发送信号
# [ ! -f /var/run/nodeapp.pid ] || kill -USR1 $(cat /var/run/nodeapp.pid)
endscript
}
sudo logrotate -d /etc/logrotate.d/nodejs-app # 语法检查
sudo logrotate -f /etc/logrotate.d/nodejs-app # 强制执行一次
const DailyRotateFile = require('winston-daily-rotate-file');
const transport = new DailyRotateFile({
filename: 'logs/application-%DATE%.log',
datePattern: 'YYYY-MM-DD',
zippedArchive: true,
maxSize: '20m',
maxFiles: '14d'
});
四 运行方式与系统日志集成
pm2 set pm2-logrotate:max_size 10M
pm2 set pm2-logrotate:retain 5
pm2 set pm2-logrotate:workerInterval 2
五 生产实践与注意事项