温馨提示×

Ubuntu上Node.js日志格式怎么选

小樊
35
2025-12-06 00:52:30
栏目: 编程语言

Ubuntu上Node.js日志格式选择指南

一、先定目标与格式类型

  • 明确用途:是记录应用事件(业务、错误、调试)还是HTTP访问日志(请求路径、状态码、耗时)。
  • 选择格式:
    • 纯文本行式:人读友好,适合本地开发与小型服务。
    • 结构化JSON:便于检索、聚合与可视化(如对接 ELK/EFK、Grafana Loki)。
  • 必备字段:至少包含时间戳日志级别消息;HTTP日志建议增加method、url、status、responseTime、ip、user-agent等。
  • 性能与开销:高并发优先选择异步、低开销方案(如 JSON + 批量/流);开发期可用彩色可读输出。
  • 运维与合规:统一格式、可轮转归档、避免阻塞主线程,必要时输出到系统日志便于集中管理。

二、按场景给出推荐组合

场景 推荐格式 推荐库与配置要点
开发/调试 彩色、单行可读 Pino + pino-pretty(开发时启用 pretty,生产用 JSON);或 Winston 简单 printf 格式
生产业务日志 JSON WinstonPino 输出 JSON;按级别分流(如 error 单独文件/索引)
Express HTTP 访问日志 纯文本(NCSA/combined)或JSON morgan 预置格式(combined/common/tiny)或自定义 token;JSON 便于分析
集中化/系统级日志 JSON 写入 journald(systemd 服务)或 rsyslog;便于 journalctl、集中采集与审计
上述组合在 Ubuntu 上均易落地,morgan 负责 HTTP,Winston/Pino 负责应用事件,系统级日志便于统一运维。

三、关键配置示例

  • Winston 应用日志(JSON 生产,开发期可读)
// 安装:npm i winston
const winston = require('winston');

const logger = winston.createLogger({
  level: process.env.NODE_ENV === 'production' ? 'info' : 'debug',
  format: process.env.NODE_ENV === 'production'
    ? winston.format.json() // 生产:结构化 JSON
    : winston.format.combine(
        winston.format.colorize(),
        winston.format.timestamp({ format: 'YYYY-MM-DD HH:mm:ss' }),
        winston.format.printf(({ timestamp, level, message }) =>
          `[${timestamp}] ${level}: ${message}`
        )
      ),
  transports: [
    new winston.transports.Console(),
    new winston.transports.File({ filename: 'logs/error.log', level: 'error' }),
    new winston.transports.File({ filename: 'logs/combined.log' })
  ]
});

logger.info('服务启动', { port: 3000 });
logger.error('连接数据库失败', { err: new Error('timeout') });
  • Express + Morgan(访问日志)
// 安装:npm i express morgan
const express = require('express');
const morgan = require('morgan');
const app = express();

// 预置:combined(NCSA 扩展格式)
app.use(morgan('combined'));

// 或自定义 JSON 格式
app.use(morgan(':method :url :status :res[content-length] - :response-time ms :remote-addr :user-agent', {
  stream: require('fs').createWriteStream('/var/log/myapp/access.log', { flags: 'a' })
}));

app.get('/', (req, res) => res.send('Hello World'));
app.listen(3000);
  • Pino 高性能 JSON(开发期美化)
// 安装:npm i pino pino-pretty
const pino = require('pino');

const logger = pino({
  level: 'info',
  transport: process.env.NODE_ENV === 'production' ? undefined : {
    target: 'pino-pretty',
    options: { colorize: true, translateTime: 'SYS:standard' }
  }
});

logger.info({ path: '/health' }, '健康检查通过');
  • 写入系统日志(journald/rsyslog)
// 安装:npm i winston winston-syslog
const winston = require('winston');
const SyslogTransport = require('winston-syslog').SyslogTransport;

const logger = winston.createLogger({
  level: 'info',
  format: winston.format.json(),
  transports: [new SyslogTransport({ host: 'localhost', port: 514, protocol: 'udp' })]
});

logger.info('通过 syslog 写入日志');

以上示例覆盖了 JSON/文本、控制台/文件、HTTP 与系统日志的常见落地方式。

四、部署与运维要点

  • 权限与路径:日志目录(如 /var/log/myapp/)建议由应用用户拥有,权限 0755/0644;使用 logrotate 做按日/按大小轮转与压缩。
  • 性能与可靠性:避免同步写文件;高并发场景优先 JSON + 异步传输;必要时使用队列/批处理。
  • 集中化采集:将应用日志写入 journaldrsyslog,用 journalctl -u your-service 或集中平台查看;结构化日志便于 ELK/EFKLoki 分析。
  • 统一规范:全链路统一时间格式(推荐 ISO 8601)字段命名级别语义;HTTP 与业务日志字段避免冲突,便于关联分析。

0