Ubuntu上Node.js日志格式选择指南
一、先定目标与格式类型
二、按场景给出推荐组合
| 场景 | 推荐格式 | 推荐库与配置要点 |
|---|---|---|
| 开发/调试 | 彩色、单行可读 | Pino + pino-pretty(开发时启用 pretty,生产用 JSON);或 Winston 简单 printf 格式 |
| 生产业务日志 | JSON | Winston 或 Pino 输出 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 与系统日志的常见落地方式。
四、部署与运维要点