Debian系统下Node.js应用日志管理指南
在Debian系统中,Node.js应用的日志管理需覆盖日志生成、存储、轮转、监控全流程,以下是具体实施方案:
Node.js生态中有多种日志库,需根据需求选择:
const winston = require('winston');
const logger = winston.createLogger({
level: process.env.NODE_ENV === 'production' ? 'warn' : 'debug', // 生产环境用warn减少日志量
format: winston.format.json(), // 结构化日志便于分析
transports: [
new winston.transports.File({ filename: 'error.log', level: 'error' }), // 错误日志单独存储
new winston.transports.File({ filename: 'combined.log' }), // 合并所有日志
],
});
if (process.env.NODE_ENV !== 'production') {
logger.add(new winston.transports.Console({ format: winston.format.simple() })); // 开发环境输出到控制台
}
根据环境调整日志级别,避免不必要的日志输出:
debug或verbose,记录详细信息(如请求参数、数据库查询),便于调试。warn或error,仅记录关键事件(如错误、警告),减少磁盘占用和性能消耗。const level = process.env.NODE_ENV === 'production' ? 'warn' : 'debug';
const logger = winston.createLogger({ level, ... });
防止日志文件过大占用磁盘空间,常用工具为logrotate(系统自带):
sudo apt install logrotate
/etc/logrotate.d/下新建nodejs文件,内容如下:/var/log/nodejs/*.log { # 日志文件路径(需与Node.js应用输出的路径一致)
daily # 每天轮转一次
rotate 7 # 保留7个旧日志文件
compress # 压缩旧日志(节省空间)
missingok # 日志文件不存在时不报错
notifempty # 日志为空时不轮转
create 640 root adm # 新日志文件的权限和所有者
sharedscripts # 所有日志轮转完成后执行postrotate
postrotate
# 可选:通知应用重新打开日志文件(如使用PM2需取消注释)
# PM2 reload all
# systemctl restart your-node-app
endscript
}
sudo logrotate -d /etc/logrotate.d/nodejs # 测试配置是否正确(dry run)
sudo logrotate -f /etc/logrotate.d/nodejs # 强制立即执行轮转
PM2是Node.js进程管理工具,内置日志管理功能,适合简化流程:
sudo npm install pm2 -g
pm2 start app.js --name "my-app" --log-date-format "YYYY-MM-DD HH:mm Z" # 输出带时间戳的日志
pm2 logs my-app # 查看实时日志
pm2 logs my-app --lines 100 # 查看最后100行日志
pm2 logs my-app --json # 以JSON格式输出日志
pm2 set pm2:logrotate:max_size 10M # 单个日志文件最大10MB
pm2 set pm2:logrotate:retain 7 # 保留7个日志文件
pm2 save
将Node.js日志发送到系统日志(journald),便于统一管理:
syslog传输,或修改systemd服务文件。/etc/systemd/system/your-node-app.service文件:[Unit]
Description=My Node.js App
After=network.target
[Service]
ExecStart=/usr/bin/node /path/to/your/app.js
StandardOutput=syslog # 标准输出发送到syslog
StandardError=syslog # 标准错误发送到syslog
SyslogIdentifier=my-node-app # 日志标识符
Restart=on-failure # 失败时自动重启
User=www-data # 运行用户
Group=www-data # 运行组
Environment=NODE_ENV=production
[Install]
WantedBy=multi-user.target
sudo systemctl daemon-reload
sudo systemctl restart your-node-app
journalctl -u your-node-app -f # 实时查看应用日志
journalctl -u your-node-app --since "2025-10-01" # 查看指定时间范围的日志
对于分布式系统,建议使用ELK Stack(Elasticsearch+Logstash+Kibana)或Graylog实现日志集中存储、搜索和可视化:
const sensitiveData = (data) => data.replace(/(\d{4})-(\d{4})-(\d{4})-(\d{4})/, '****-****-****-****');
logger.info(`User logged in: ${sensitiveData(user.creditCard)}`);
async选项),避免日志记录阻塞主线程,影响应用性能。const logger = winston.createLogger({
transports: [
new winston.transports.File({ filename: 'combined.log', async: true }), // 异步写入
],
});
通过以上步骤,可在Debian系统中实现Node.js应用的高效日志管理,满足监控、排查故障和合规需求。