Linux系统中Node.js日志管理
一 核心方案与工具
二 快速落地示例
使用 Winston 输出到控制台与文件(按级别分流)
// 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;
运行与级别控制:LOG_LEVEL=debug node app.js
使用 Pino 高性能输出(开发环境美化)
// 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;
使用 Log4js 按日期滚动
// 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;
三 日志轮转与保留策略
系统级方案 logrotate(推荐与 Node.js 解耦)
创建配置 /etc/logrotate.d/nodejs-app:
/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(强制执行一次)
应用内方案(库自带轮转)
Winston + winston-daily-rotate-file:
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'
});
Log4js dateFile 已在上一节示例中展示(支持 daysToKeep、compress 等)。
何时选择哪种方案
四 运行方式与系统日志集成
使用 PM2 管理进程与日志
安装与启动:sudo npm install -g pm2,然后 pm2 start app.js --name my-app。
查看日志:pm2 logs my-app;按文件输出可在配置中指定 error_file 与 out_file。
内置日志轮转插件:
pm2 install pm2-logrotate
常用设置示例:
pm2 set pm2-logrotate:max_size 10M
pm2 set pm2-logrotate:retain 5
pm2 set pm2-logrotate:workerInterval 2
使用 systemd + journalctl
以服务运行 Node.js 应用后,使用 journalctl -u nodeapp 查看日志,-f 实时跟踪,--since/--until 时间过滤。
五 生产实践与注意事项