插件窝 干货文章 Linux环境下Node.js日志如何管理

Linux环境下Node.js日志如何管理

日志 Winston 使用 logger 512    来源:    2025-05-06

Linux环境下Node.js日志管理方案

在Linux环境下管理Node.js应用日志是保证应用可维护性和故障排查的重要环节。以下是几种有效的日志管理方案:

1. 基础日志方案

使用console模块

console.log('Info message');
console.error('Error message');
console.warn('Warning message');

使用Node.js内置util模块格式化日志

const util = require('util');
console.log(util.format('%s:%s', 'foo', 'bar')); // foo:bar

2. 使用日志框架

Winston (推荐)

npm install winston
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()
  }));
}

Bunyan

npm install bunyan
const bunyan = require('bunyan');
const log = bunyan.createLogger({name: 'myapp'});

log.info('Hello');
log.error({err: new Error('boom')}, 'Something went wrong');

Pino (高性能)

npm install pino
const pino = require('pino');
const logger = pino({
  level: 'info',
  timestamp: () => `,"time":"${new Date().toISOString()}"`
});

logger.info('Hello Pino');
logger.error('This is an error');

3. 日志轮转管理

使用logrotate (系统级方案)

创建/etc/logrotate.d/nodeapp文件:

/path/to/your/nodeapp/logs/*.log {
    daily
    missingok
    rotate 14
    compress
    delaycompress
    notifempty
    create 0640 root root
    sharedscripts
    postrotate
        kill -USR2 `cat /var/run/nodeapp.pid 2>/dev/null` 2>/dev/null || true
    endscript
}

使用Winston-daily-rotate-file

npm install winston-daily-rotate-file
const DailyRotateFile = require('winston-daily-rotate-file');

logger.add(new DailyRotateFile({
  filename: 'application-%DATE%.log',
  datePattern: 'YYYY-MM-DD',
  zippedArchive: true,
  maxSize: '20m',
  maxFiles: '14d'
}));

4. 结构化日志

// 使用Winston的结构化日志
logger.log({
  level: 'info',
  message: 'User logged in',
  userId: 123,
  ip: '192.168.1.1',
  timestamp: new Date().toISOString()
});

5. 日志集中管理方案

使用ELK Stack (Elasticsearch, Logstash, Kibana)

  1. 配置应用输出JSON格式日志
  2. 使用Filebeat收集日志
  3. Logstash处理并存入Elasticsearch
  4. Kibana可视化

使用Fluentd

npm install fluent-logger
const fluent = require('fluent-logger');
const logger = fluent.createFluentSender('app', {
  host: 'localhost',
  port: 24224,
  timeout: 3.0
});

logger.emit('follow', {from: 'userA', to: 'userB'});

6. 最佳实践

  1. 日志级别合理使用:debug, info, warn, error, fatal
  2. 避免敏感信息:不要记录密码、密钥等
  3. 上下文信息:包含请求ID、用户ID等便于追踪
  4. 性能考虑:异步日志记录避免阻塞事件循环
  5. 开发与生产分离:开发环境使用console,生产环境使用文件/集中式日志

7. PM2日志管理

如果使用PM2管理Node.js进程:

# 查看日志
pm2 logs

# 清空日志
pm2 flush

# 禁用日志
pm2 install pm2-logrotate
pm2 set pm2-logrotate:max_size 10M
pm2 set pm2-logrotate:retain 30

选择适合您项目规模和需求的方案,合理管理日志将大大提高应用的可维护性和故障排查效率。