首页主机资讯Ubuntu环境下Node.js日志如何管理

Ubuntu环境下Node.js日志如何管理

时间2025-12-08 13:53:03发布访客分类主机资讯浏览1469
导读: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
Debian下Tomcat如何优化性能 怎样在Linux Overlay中实现负载均衡

游客 回复需填写必要信息