Node.js在Debian上日志记录最佳实践
根据项目需求选型:
const winston = require('winston');
const logger = winston.createLogger({
level: 'info',
format: winston.format.json(),
transports: [
new winston.transports.File({ filename: 'error.log', level: 'error' }),
new winston.transports.File({ filename: 'combined.log' }),
new winston.transports.Console()
]
});
示例(Pino):
const pino = require('pino')();
pino.info({ event: 'user_login', userId: 123 }, 'User logged in');
按环境区分级别,避免不必要的磁盘占用:
debug(详细调试信息);info(关键流程)+ warn(潜在问题);warn(错误预警)+ error(实际错误)。const level = process.env.NODE_ENV === 'production' ? 'warn' : 'debug';
const logger = winston.createLogger({ level });
防止日志文件过大,推荐使用logrotate(Debian自带):
sudo apt-get install logrotate;/etc/logrotate.d/nodejs:/var/log/nodejs/*.log {
daily # 每天轮转
rotate 7 # 保留7份
compress # 压缩旧日志
delaycompress # 延迟压缩(避免当天压缩失败)
missingok # 文件丢失不报错
notifempty # 空文件不轮转
create 640 root adm # 新日志权限
sharedscripts # 所有日志轮转后执行一次
postrotate
systemctl restart your-node-app # 通知应用重新打开日志(如systemd服务)
endscript
}
sudo logrotate -f /etc/logrotate.d/nodejs。对于分布式系统,使用ELK Stack(Elasticsearch+Logstash+Kibana)或Graylog集中存储、分析日志:
winston-elasticsearch传输或Bunyan的bunyan-syslog库,将日志发送至中央服务器;避免日志写入阻塞主线程,影响应用性能:
transports.File使用fs.createWriteStream异步写入);fs.writeFileSync),除非需要确保日志立即写入(如崩溃前的关键日志)。使用JSON格式,便于后续自动化处理(如解析、过滤、聚合):
logger.info({
event: 'order_created',
orderId: 456,
amount: 100.00,
user: 'user123'
}, 'Order created successfully');
结构化日志可通过工具(如Logstash)提取字段,生成报表或告警。
避免日志泄露用户隐私或系统敏感数据(如密码、API密钥):
helmet)过滤请求体中的敏感字段;const sanitize = (info) => {
if (info.message.includes('password')) {
info.message = info.message.replace(/password=[^&]+/, 'password=*****');
}
return info;
};
const logger = winston.createLogger({
format: winston.format.combine(winston.format.json(), winston.format(customFormat(sanitize)))
});
设置日志监控,及时发现异常:
error级别日志时发送邮件/Slack通知。使用PM2管理Node.js进程,简化日志操作:
npm install pm2 -g;pm2 start app.js --name "my-node-app";pm2 logs my-node-app # 查看实时日志
pm2 logs --lines 100 # 查看最近100行
pm2 logrotate # 执行日志轮转(默认保留7天,每文件10M)
pm2 save # 保存当前进程列表
PM2会自动将日志输出到~/.pm2/logs/目录,并支持日志轮转。
将Node.js日志发送到Debian系统日志(rsyslog/journald),统一管理:
winston-syslog库:const winston = require('winston');
require('winston-syslog').Syslog;
const logger = winston.createLogger({
transports: [
new winston.transports.Syslog({
host: 'localhost',
port: 514,
protocol: 'udp',
facility: 'local0',
appName: 'my-node-app'
})
]
});
rsyslog(/etc/rsyslog.conf):if $programname == 'my-node-app' then /var/log/nodejs/app.log
& stop
重启rsyslog:sudo systemctl restart rsyslog。