ubuntu

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

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

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

一、先定目标与格式类型

二、按场景给出推荐组合

场景 推荐格式 推荐库与配置要点
开发/调试 彩色、单行可读 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 负责应用事件,系统级日志便于统一运维。

三、关键配置示例

// 安装: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') });
// 安装: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);
// 安装: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' }, '健康检查通过');
// 安装: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 与系统日志的常见落地方式。

四、部署与运维要点

0
看了该问题的人还看了