ubuntu

Ubuntu下Node.js日志如何优化

小樊
41
2025-10-13 14:08:24
栏目: 编程语言

Ubuntu下优化Node.js日志的关键策略

1. 选择合适的日志库

优先使用成熟的第三方日志库(如WinstonPino),它们提供日志级别控制、格式化、传输(文件/控制台/远程)、异步记录等功能,远优于原生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() }));
}

2. 合理配置日志级别

根据环境动态调整日志级别,避免记录无关信息:

// 通过环境变量设置(推荐)
const logLevel = process.env.LOG_LEVEL || (process.env.NODE_ENV === 'production' ? 'warn' : 'debug');
const logger = winston.createLogger({ level: logLevel, ... });

3. 实现日志轮转

使用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);
/var/log/nodejs/*.log {
  daily
  missingok
  rotate 7
  compress
  notifempty
  create 0640 root adm
}

该配置每天轮转日志,保留7天,压缩旧文件。

4. 启用异步日志记录

确保日志记录不阻塞主线程(尤其是高并发场景)。多数日志库(如Winston、Pino)默认支持异步:

const pino = require('pino');
const logger = pino({ level: 'info' }, pino.destination('/var/log/nodejs/app.log'));

5. 结构化日志输出

使用JSON格式记录日志,便于后续用ELK(Elasticsearch+Logstash+Kibana)、Graylog等工具分析。例如:

logger.info({ 
  message: 'User logged in', 
  userId: 123, 
  ip: '192.168.1.1' 
});

结构化日志可通过工具快速过滤、聚合(如“查找所有登录失败的IP”)。

6. 集成监控与报警

将日志发送到集中式监控系统,实时检测异常并触发报警:

7. 加强日志安全性

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会被替换为***

8. 定期清理过期日志

通过cron定时任务自动删除超过保留期限的日志文件,释放磁盘空间。例如,每天凌晨清理7天前的日志:

# 编辑cron任务
crontab -e

添加以下内容:

0 0 * * * find /var/log/nodejs -type f -name "*.log" -mtime +7 -exec rm -f {} \;

0
看了该问题的人还看了