ubuntu

Ubuntu Node.js日志如何提高可读性

小樊
44
2025-11-26 06:02:21
栏目: 编程语言

Ubuntu Node.js日志可读性提升实践

一 统一日志格式与级别

示例 Winston 统一配置(开发/生产可切换 transports 与 level):

// logger.js
const winston = require('winston');

const isProd = process.env.NODE_ENV === 'production';

const logger = winston.createLogger({
  level: isProd ? 'info' : 'debug',
  format: winston.format.combine(
    winston.format.timestamp({ format: 'YYYY-MM-DD HH:mm:ss' }),
    winston.format.errors({ stack: true }), // 错误堆栈
    winston.format.metadata({ fillExcept: ['message', 'level', 'timestamp', 'label'] }),
    winston.format.printf(({ timestamp, level, message, label, metadata }) => {
      const meta = Object.keys(metadata).length ? JSON.stringify(metadata) : '';
      return `[${timestamp}] ${level.toUpperCase()} [${label || 'app'}] ${message} ${meta}`;
    })
  ),
  transports: [
    new winston.transports.Console({
      format: winston.format.combine(
        winston.format.colorize(),
        winston.format.simple()
      )
    }),
    new winston.transports.File({ filename: 'logs/error.log', level: 'error' }),
    new winston.transports.File({ filename: 'logs/combined.log' })
  ]
});

module.exports = logger;

要点:

二 控制台与文件差异化输出

示例 Pino 开发期美化(生产移除 transport 以回归 JSON):

// pino 示例(开发)
const pino = require('pino');

const logger = pino({
  level: 'debug',
  transport: {
    target: 'pino-pretty',
    options: {
      colorize: true,
      translateTime: 'SYS:yyyy-mm-dd HH:MM:ss',
      ignore: 'pid,hostname'
    }
  }
});

要点:

三 HTTP 请求日志规范化

示例 morgan 自定义格式:

const express = require('express');
const morgan = require('morgan');
const fs = require('fs');
const path = require('path');

const accessLogStream = fs.createWriteStream(
  path.join(__dirname, 'logs', 'access.log'),
  { flags: 'a' }
);

app.use(morgan(':method :url :status :res[content-length] - :response-time ms', {
  stream: accessLogStream
}));

要点:

四 日志轮转与保留策略

示例 winston-daily-rotate-file:

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

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

示例 logrotate(/etc/logrotate.d/nodejs):

/var/log/nodejs/*.log {
  daily
  missingok
  rotate 7
  compress
  notifempty
  create 0640 root adm
}
# 执行:sudo logrotate /etc/logrotate.d/nodejs

要点:

五 集中化与快速检索分析

示例 ELK Filebeat → Logstash → ES(关键片段):

# /etc/logstash/conf.d/nodejs.conf
input {
  file {
    path => "/var/log/nodejs/*.log"
    start_position => "beginning"
    codec => json
  }
}
filter {
  # 如为文本日志,可用 grok 解析;JSON 可直接使用
}
output {
  elasticsearch {
    hosts => ["localhost:9200"]
    index => "nodejs-logs-%{+YYYY.MM.dd}"
  }
}

要点:

0
看了该问题的人还看了