Ubuntu环境下Node.js日志如何管理
导读:Ubuntu下Node.js日志管理实践 一 核心原则与总体架构 使用结构化日志:优先选择成熟的日志库,如 Winston、Pino、Bunyan,便于控制日志级别(如 error、warn、info、debug)、输出格式与多目标输出(...
Ubuntu下Node.js日志管理实践
一 核心原则与总体架构
- 使用结构化日志:优先选择成熟的日志库,如 Winston、Pino、Bunyan,便于控制日志级别(如 error、warn、info、debug)、输出格式与多目标输出(文件、控制台、HTTP 等)。结构化(如 JSON)更利于后续检索与分析。
- 做好日志轮转与保留:按时间/大小切分,压缩归档,设置保留天数,避免磁盘被撑满。
- 集中式收集与分析:在分布式或生产环境,将日志发送到 ELK Stack(Elasticsearch、Logstash、Kibana) 或 Graylog 等平台,统一检索、可视化与告警。
- 运行与监控:使用 PM2 等进程管理器统一管理进程与日志,便于自动重启、实时查看与故障告警。
二 应用内日志方案与示例
- 使用 Winston 记录文件与控制台日志(开发/生产一致,便于排错与归档)
- 安装:
npm install winston - 示例:
const winston = require('winston'); const logger = winston.createLogger({ level: process.env.NODE_ENV === 'production' ? 'info' : 'debug', format: winston.format.combine( winston.format.timestamp({ format: 'YYYY-MM-DD HH:mm:ss' } ), winston.format.json() ), transports: [ new winston.transports.File({ filename: 'logs/error.log', level: 'error' } ), new winston.transports.File({ filename: 'logs/combined.log' } ), ], } ); if (process.env.NODE_ENV !== 'production') { logger.add(new winston.transports.Console({ format: winston.format.simple() } )); } logger.info('应用启动', { pid: process.pid } ); logger.error('发生错误', { err: new Error('boom') } );
- 安装:
- 使用 Pino 记录高性能结构化日志(适合高并发)
- 安装:
npm install pino - 示例:
const pino = require('pino')(); pino.info({ service: 'api' } , 'hello pino');
- 安装:
- Express 场景结合 HTTP 访问日志(morgan + winston)
- 安装:
npm install morgan winston - 示例:
const express = require('express'); const morgan = require('morgan'); const logger = require('./logger'); // 上面的 winston 实例 const app = express(); app.use(morgan('combined', { stream: { write: msg => logger.info(msg.trim()) } } )); app.get('/', (_, res) => res.send('ok')); app.listen(3000);
- 安装:
- 日志级别建议:开发环境用 debug,生产环境用 info/error;按需细化到 warn/verbose。
三 日志轮转与保留策略
-
应用内轮转(推荐与系统方案二选一或叠加):使用 winston-daily-rotate-file
- 安装:
npm install 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' } ); logger.add(rotateTransport); - 说明:按天切分、超过 20MB 切分、保留 14 天、旧文件压缩归档。
- 安装:
-
系统级轮转(与应用解耦,推荐生产使用):使用 logrotate
- 新建配置:
sudo nano /etc/logrotate.d/nodejs-app - 示例配置(按天轮转、保留 7 天、压缩、延迟压缩、空文件不轮转、自动创建新文件):
/path/to/your/node-app/logs/*.log { daily rotate 7 compress delaycompress missingok notifempty create 0640 root adm } - 测试与生效:
sudo logrotate -f /etc/logrotate.d/nodejs-app - 说明:该方式对应用透明,适合多进程/多实例或容器化部署。
- 新建配置:
四 运行与集中式日志
- 使用 PM2 管理进程与日志
- 安装:
npm install -g pm2 - 常用命令:
pm2 start app.js --name my-app pm2 logs my-app # 实时查看 pm2 monit # 资源与日志监控 pm2 flush # 清理当前日志 - 日志轮转(PM2 内置):
pm2 set pm2:log-date-format "YYYY-MM-DD HH:mm:ss" pm2 set pm2:max-size "20M" pm2 set pm2:retain "14d"
- 安装:
- 集中式日志收集
- 方案:将日志发送到 rsyslog 或直接到 ELK/Graylog。
- rsyslog 示例(将标识为 nodejs 的日志写入文件):
sudo apt-get install rsyslog # /etc/rsyslog.d/50-default.conf 追加: if $programname == 'nodejs' then /var/log/nodejs.log & stop sudo systemctl restart rsyslog - 后续可在 Kibana 中建立索引模式进行检索与可视化。
五 维护与最佳实践清单
- 目录与权限:日志目录统一(如 /var/log/myapp/ 或项目内 logs/),设置合适权限(如 0640),避免敏感信息写入日志。
- 保留与清理:按合规设置保留周期(如 7–14 天),结合 logrotate 或应用内轮转策略自动清理。
- 性能与异步:避免同步写日志与过重序列化,高并发优先 Pino 或异步传输。
- 结构化与采样:统一 JSON 字段(如 timestamp、level、service、trace_id),异常场景适当增加采样与上下文。
- 监控与告警:对 error 级别日志建立监控与告警(如对接 Sentry、Prometheus + Alertmanager)。
- 安全合规:脱敏敏感字段(如 password、token、card),限制日志访问权限,定期审计。
声明:本文内容由网友自发贡献,本站不承担相应法律责任。对本内容有异议或投诉,请联系2913721942#qq.com核实处理,我们将尽快回复您,谢谢合作!
若转载请注明出处: Ubuntu环境下Node.js日志如何管理
本文地址: https://pptw.com/jishu/765903.html
