ubuntu

如何通过日志优化Ubuntu Node.js应用响应时间

小樊
35
2025-12-27 15:59:54
栏目: 编程语言

通过日志优化 Ubuntu 上 Node.js 应用响应时间的实操方案


一 目标与关键指标


二 埋点与日志配置

// 假设已使用 uuid/v4 生成 traceId
const uuid = require('uuid').v4;
const express = require('express');
const app = express();

app.use((req, res, next) => {
  const start = process.hrtime.bigint();
  const traceId = req.headers['x-trace-id'] || uuid();
  req.traceId = traceId;
  res.setHeader('x-trace-id', traceId);

  res.on('finish', () => {
    const [sec, ns] = process.hrtime.bigint().split(',');
    const durationMs = Number(sec * 1n + ns / 1_000_000n);
    // 建议接入结构化日志库(winston/pino),此处用 console 示意
    console.log(JSON.stringify({
      timestamp: new Date().toISOString(),
      level: 'info',
      service: 'my-api',
      env: process.env.NODE_ENV,
      host: os.hostname(),
      traceId,
      msg: 'http_request',
      method: req.method,
      url: req.url,
      route: req.route?.path,
      statusCode: res.statusCode,
      durationMs,
      userAgent: req.get('user-agent'),
      ip: req.ip
    }));
  });
  next();
});
// const winston = require('winston');
// const DailyRotateFile = require('winston-daily-rotate-file');
const logger = winston.createLogger({
  level: 'info',
  format: winston.format.combine(
    winston.format.timestamp(),
    winston.format.json()
  ),
  transports: [
    new DailyRotateFile({
      filename: '/var/log/nodejs/app-%DATE%.log',
      datePattern: 'YYYY-MM-DD',
      maxSize: '100m',
      maxFiles: '14d'
    }),
    new winston.transports.Console({ format: winston.format.simple() })
  ]
});
// const morgan = require('morgan');
// const logger = winston.createLogger({...}); // 如上
app.use(morgan('combined', { stream: { write: msg => logger.info(msg.trim()) } }));
// const { Pool } = require('pg'); const pool = new Pool();
const start = Date.now();
pool.query('SELECT * FROM users WHERE id = $1', [userId], (err, res) => {
  const duration = Date.now() - start;
  logger.info('db_query', {
    query: 'SELECT * FROM users WHERE id = $1', // 生产请脱敏
    durationMs: duration,
    rows: res?.rowCount,
    error: err?.message
  });
});

三 采集存储与可视化告警

# /etc/logrotate.d/nodejs
/var/log/nodejs/*.log {
  daily
  rotate 7
  missingok
  notifempty
  compress
  delaycompress
  sharedscripts
  create 0640 www-data www-data
}

四 从日志定位瓶颈与闭环优化

0
看了该问题的人还看了