Ubuntu下优化Node.js日志的关键策略
优先使用成熟的第三方日志库(如Winston、Pino),它们提供日志级别控制、格式化、传输(文件/控制台/远程)、异步记录等功能,远优于原生console模块。例如:
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' })
]
});
if (process.env.NODE_ENV !== 'production') {
logger.add(new winston.transports.Console({ format: winston.format.simple() }));
}
根据环境动态调整日志级别,避免记录无关信息:
warn或error,仅记录关键错误和警告,减少日志体积;debug或verbose,记录详细信息以辅助调试。// 通过环境变量设置(推荐)
const logLevel = process.env.LOG_LEVEL || (process.env.NODE_ENV === 'production' ? 'warn' : 'debug');
const logger = winston.createLogger({ level: logLevel, ... });
使用winston-daily-rotate-file或系统级logrotate工具,自动分割、压缩旧日志,避免单个文件过大占用磁盘空间。
const DailyRotateFile = require('winston-daily-rotate-file');
const transport = new DailyRotateFile({
filename: 'application-%DATE%.log',
datePattern: 'YYYY-MM-DD',
zippedArchive: true, // 压缩旧日志
maxSize: '20m', // 单个文件最大20MB
maxFiles: '14d' // 保留14天
});
logger.add(transport);
logrotate后,创建/etc/logrotate.d/nodejs文件:/var/log/nodejs/*.log {
daily
missingok
rotate 7
compress
notifempty
create 0640 root adm
}
该配置每天轮转日志,保留7天,压缩旧文件。
确保日志记录不阻塞主线程(尤其是高并发场景)。多数日志库(如Winston、Pino)默认支持异步:
transports自动异步写入;const pino = require('pino');
const logger = pino({ level: 'info' }, pino.destination('/var/log/nodejs/app.log'));
使用JSON格式记录日志,便于后续用ELK(Elasticsearch+Logstash+Kibana)、Graylog等工具分析。例如:
logger.info({
message: 'User logged in',
userId: 123,
ip: '192.168.1.1'
});
结构化日志可通过工具快速过滤、聚合(如“查找所有登录失败的IP”)。
将日志发送到集中式监控系统,实时检测异常并触发报警:
root或专用用户所有,设置chmod 0640权限,防止未授权读取;winston-masking等库过滤日志中的密码、手机号等敏感字段:const winston = require('winston');
const masking = require('winston-masking');
const logger = winston.createLogger({
transports: [new winston.transports.Console()],
format: winston.format.combine(
masking({ paths: ['password', 'creditCard'] }), // 过滤指定字段
winston.format.json()
)
});
logger.info({ password: '123456', username: 'admin' }); // 输出中password会被替换为***
通过cron定时任务自动删除超过保留期限的日志文件,释放磁盘空间。例如,每天凌晨清理7天前的日志:
# 编辑cron任务
crontab -e
添加以下内容:
0 0 * * * find /var/log/nodejs -type f -name "*.log" -mtime +7 -exec rm -f {} \;