阅读量:2
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 | 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 负责应用事件,系统级日志便于统一运维。 |
三、关键配置示例
- 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 + 异步传输;必要时使用队列/批处理。
- 集中化采集:将应用日志写入 journald 或 rsyslog,用 journalctl -u your-service 或集中平台查看;结构化日志便于 ELK/EFK 或 Loki 分析。
- 统一规范:全链路统一时间格式(推荐 ISO 8601)、字段命名与级别语义;HTTP 与业务日志字段避免冲突,便于关联分析。
以上就是关于“Ubuntu上Node.js日志格式怎么选”的相关介绍,筋斗云是国内较早的云主机应用的服务商,拥有10余年行业经验,提供丰富的云服务器、租用服务器等相关产品服务。云服务器资源弹性伸缩,主机vCPU、内存性能强悍、超高I/O速度、故障秒级恢复;电子化备案,提交快速,专业团队7×24小时服务支持!
简单好用、高性价比云服务器租用链接:https://www.jindouyun.cn/product/cvm