插件窝 干货文章 Node.js日志与系统日志如何关联

Node.js日志与系统日志如何关联

winston 日志 Node const 184    来源:    2025-05-07

Node.js日志与系统日志关联方案

要将Node.js应用的日志与系统日志关联起来,可以采用以下几种方法:

1. 使用系统日志服务

通过syslog协议

const winston = require('winston');
const { Syslog } = require('winston-syslog');

const logger = winston.createLogger({
  transports: [
    new Syslog({
      host: 'localhost',
      port: 514,
      protocol: 'udp4',
      facility: 'local0',
      app_name: 'your-node-app'
    })
  ]
});

使用journald (Linux系统)

const { Journald } = require('winston-journald');

const logger = winston.createLogger({
  transports: [new Journald()]
});

2. 日志文件集中管理

使用logrotate

配置/etc/logrotate.d/your-node-app:

/var/log/your-node-app/*.log {
  daily
  missingok
  rotate 14
  compress
  delaycompress
  notifempty
  create 0640 root adm
  sharedscripts
  postrotate
    systemctl restart your-node-app
  endscript
}

使用rsyslog

配置/etc/rsyslog.d/your-node-app.conf:

$ModLoad imfile
$InputFileName /var/log/your-node-app/app.log
$InputFileTag node-app:
$InputFileStateFile stat-node-app
$InputFileSeverity info
$InputFileFacility local7
$InputRunFileMonitor

local7.* /var/log/syslog

3. 分布式日志收集

ELK Stack (Elasticsearch, Logstash, Kibana)

// 使用winston-elasticsearch
const { ElasticsearchTransport } = require('winston-elasticsearch');

const esTransport = new ElasticsearchTransport({
  level: 'info',
  clientOpts: { node: 'http://localhost:9200' }
});

const logger = winston.createLogger({
  transports: [esTransport]
});

Fluentd

配置Fluentd收集Node.js日志:

<source>
  @type tail
  path /var/log/your-node-app/app.log
  pos_file /var/log/td-agent/your-node-app.log.pos
  tag node.app
  format json
</source>

<match node.app>
  @type elasticsearch
  host localhost
  port 9200
  logstash_format true
</match>

4. 使用唯一请求ID关联

const uuid = require('uuid');
const cls = require('cls-hooked');

// 创建命名空间
const ns = cls.createNamespace('app');

// 中间件设置请求ID
app.use((req, res, next) => {
  ns.run(() => {
    const requestId = req.headers['x-request-id'] || uuid.v4();
    ns.set('requestId', requestId);
    next();
  });
});

// 日志记录时包含请求ID
function createLogger() {
  return winston.createLogger({
    format: winston.format.combine(
      winston.format((info) => {
        info.requestId = ns.get('requestId');
        return info;
      })(),
      winston.format.json()
    ),
    transports: [new winston.transports.Console()]
  });
}

5. 使用APM工具

New Relic

require('newrelic');

Datadog

const tracer = require('dd-trace').init();

这些APM工具会自动关联日志、指标和追踪信息。

最佳实践建议

  1. 标准化日志格式:使用JSON格式,包含时间戳、服务名、日志级别、请求ID等统一字段
  2. 日志级别合理使用:区分debug、info、warn、error等级别
  3. 敏感信息过滤:避免记录密码、密钥等敏感信息
  4. 日志轮转:设置合理的日志轮转策略,避免磁盘空间耗尽
  5. 监控告警:对错误日志设置告警机制

选择哪种方案取决于你的具体需求、系统架构和团队熟悉的技术栈。