Linux环境下Node.js日志存储策略
Node.js生态中有多种成熟的日志库可供选择,需根据应用场景(如性能、结构化需求、易用性)选取:
根据环境调整日志级别,平衡日志详细程度与性能:
debug
或verbose
级别,记录详细的调试信息(如函数调用、变量值),帮助开发者快速定位问题。info
或warn
级别,记录关键流程(如请求响应、业务逻辑执行)和潜在问题(如警告信息),避免过多日志干扰。warn
或error
级别,仅记录异常、错误及重要业务事件(如用户登录、订单创建),减少不必要的磁盘IO,提升应用性能。防止日志文件无限增长占用磁盘空间,常用工具及配置:
winston-daily-rotate-file
插件,按天(或文件大小)分割日志文件,支持设置保留天数(如maxFiles: '14d'
)和压缩(如zippedArchive: true
)。示例配置:const DailyRotateFile = require('winston-daily-rotate-file');
const logger = winston.createLogger({
transports: [
new DailyRotateFile({
filename: 'logs/application-%DATE%.log',
datePattern: 'YYYY-MM-DD',
maxSize: '20m', // 单个文件最大20MB
maxFiles: '14d', // 保留14天
zippedArchive: true // 压缩旧日志
})
]
});
logrotate
(系统自带),通过配置文件(如/etc/logrotate.d/nodejs
)定义轮换规则,支持按大小(size 100M
)、日期(daily
)轮换,自动压缩(compress
)及删除旧日志(maxage 30
)。示例配置:/path/to/app.log {
daily
rotate 14
compress
delaycompress
missingok
notifempty
copytruncate
}
其中copytruncate
用于避免重启应用即可轮换日志。使用JSON格式记录日志,便于后续通过工具(如ELK Stack、Graylog)解析、过滤和分析:
const logger = winston.createLogger({
format: winston.format.combine(
winston.format.timestamp({ format: 'YYYY-MM-DD HH:mm:ss' }),
winston.format.json()
),
transports: [new winston.transports.File({ filename: 'app.log' })]
});
// 记录结构化日志
logger.info({
event: 'user.login',
userId: '12345',
username: 'john_doe',
ip: '192.168.1.100'
});
结构化日志的优势在于可通过字段(如event
、userId
)快速筛选、聚合数据,提升日志分析效率。
将分散在各个服务器的日志集中存储和分析,解决分布式系统中日志分散的问题:
保护日志中的敏感信息(如用户密码、信用卡号),避免数据泄露:
***
)。示例代码:const sensitiveFields = ['password', 'creditCardNumber'];
function desensitize(obj) {
for (const key in obj) {
if (sensitiveFields.includes(key)) {
obj[key] = '***';
}
}
return obj;
}
logger.info({
event: 'user.login',
...desensitize({ userId: '12345', password: '123456' })
});
chmod 640 app.log
)限制日志文件的访问范围(仅允许应用用户和管理员读取),避免未授权访问。合理规划日志存储路径,避免与系统日志混淆:
.pm2/logs
文件夹(如~/.pm2/logs/app.log
),便于统一管理。/var/log/my-node-app/
),确保日志与应用代码分离,便于备份和维护。/var/log
(系统日志标准位置),以免干扰系统日志的管理和分析。