温馨提示×

Ubuntu Nodejs日志如何管理

小樊
46
2025-12-27 21:23:53
栏目: 编程语言

Ubuntu 上 Node.js 日志管理实操指南

一 日志生成与结构化

  • 开发阶段可直接使用 console,但生产环境建议使用具备日志级别、结构化输出与多目标的库。
  • 常用方案与要点:
    • Winston:多传输(文件、控制台、HTTP 等)、可分级、可 JSON;适合复杂应用。
    • Bunyan:原生 JSON、便于检索与分析。
    • Pino:高性能,常与 pino-pretty 配合在本地美化输出。
    • Morgan(Express 中间件):专门记录 HTTP 请求日志(方法、URL、状态码等)。
  • 快速示例(Winston,生产建议 JSON,开发输出到控制台):
    • 安装:npm install winston
    • 配置:
      • const winston = require(‘winston’); const logger = winston.createLogger({ level: ‘info’, format: winston.format.json(), transports: [ new winston.transports.File({ filename: ‘error.log’, level: ‘error’ }), new winston.transports.File({ filename: ‘combined.log’ }), …(process.env.NODE_ENV !== ‘production’ ? [new winston.transports.Console({ format: winston.format.simple() })] : []) ] });
    • 使用:logger.info('Server started', { port: 3000 }); logger.error('DB failed', { err });
  • Express 请求日志(Morgan):app.use(morgan('combined'));

二 日志轮转与保留策略

  • 应用内轮转(代码可控,适合容器或无 systemd 场景)
    • Winston 插件 winston-daily-rotate-file
      • 安装:npm install winston-daily-rotate-file
      • 配置示例:
        • const DailyRotateFile = require(‘winston-daily-rotate-file’); const transport = new DailyRotateFile({ filename: ‘application-%DATE%.log’, datePattern: ‘YYYY-MM-DD’, zippedArchive: true, maxSize: ‘20m’, maxFiles: ‘14d’ });
  • 系统级轮转(Ubuntu 自带 logrotate,无需改代码,适合系统服务/物理机)
    • 创建配置:sudo nano /etc/logrotate.d/nodejs
    • 示例(管理 /var/log/nodejs/*.log):
      • /var/log/nodejs/*.log { daily missingok rotate 7 compress notifempty create 0640 root adm }
    • 测试:sudo logrotate -f /etc/logrotate.d/nodejs
  • 进程管理工具 PM2 内置日志轮转
    • 启动:pm2 start app.js --name my-app
    • 查看:pm2 logs my-apppm2 logs my-app --lines 100
    • 配置文件(ecosystem.config.js):
      • module.exports = { apps: [{ name: ‘my-app’, script: ‘app.js’, log_date_format: ‘YYYY-MM-DD HH:mm Z’, out_file: ‘/var/log/nodejs/my-app-out.log’, error_file: ‘/var/log/nodejs/my-app-err.log’, max_size: ‘10M’, retain: 7, merge_logs: true }] };
    • 启动:pm2 start ecosystem.config.js
    • 也可通过内置模块设置:pm2 set pm2-logrotate:max_size 10Mpm2 set pm2-logrotate:retain 7

三 集中式日志与系统日志

  • 集中式分析(适合多服务/分布式)
    • ELK Stack(Elasticsearch + Logstash + Kibana):
      • 安装:sudo apt-get install elasticsearch logstash kibana
      • Logstash 示例(/etc/logstash/conf.d/nodejs.conf):
        • input { file { path => “/var/log/nodejs/*.log”; start_position => “beginning” } }
        • filter { grok { match => { “message” => “%{TIMESTAMP_ISO8601:timestamp} %{LOGLEVEL:loglevel} %{GREEDYDATA:logmessage}” } } date { match => [“timestamp”, “ISO8601”] } }
        • output { elasticsearch { hosts => [“localhost:9200”] }; stdout { codec => rubydebug } }
      • 启动:sudo systemctl start logstash
      • 访问 Kibana(默认端口 5601)创建索引模式并分析日志。
  • 系统日志(写入 syslog,由 rsyslog 统一管理)
    • Node.js 示例(syslog):
      • const syslog = require(‘syslog’); syslog.openlog(‘my-app’, { facility: syslog.LOG_USER, tag: ‘my-app’ }); syslog.syslog(syslog.LOG_INFO, ‘Service started’); syslog.closelog();
    • rsyslog 配置(/etc/rsyslog.d/50-default.conf 或自定义):
      • if $programname == ‘my-app’ then /var/log/my-app.log
      • & stop
    • 重启:sudo systemctl restart rsyslog
    • 也可选用 Graylog 等集中式方案。

四 监控查看与日常维护

  • 实时查看
    • PM2:pm2 logs my-apppm2 logs my-app --lines 100pm2 logs my-app --clear
    • 系统日志:tail -f /var/log/nodejs/my-app.log
  • 清理与保留
    • 优先依赖 logrotatePM2 的轮转与保留策略(如保留 7 天、按 10M 分割、压缩归档),避免手工删除正在写入的日志。
    • 如需自定义清理脚本,可结合 cron 定期删除过期文件,但更推荐用成熟的轮转工具以避免误删与句柄问题。

五 实践建议

  • 开发环境:使用 consolePino + pino-pretty 便于本地调试;Express 搭配 Morgan 记录请求日志。
  • 生产环境:使用 Winston/Bunyan/Pino 输出结构化 JSON;按大小或日期轮转(如 10M1d);错误日志与业务日志分离;必要时写入 syslog 或接入 ELK/Graylog 做检索与可视化。
  • 运行方式:优先用 PM2 托管进程并统一查看/轮转日志;在容器/无 systemd 场景使用应用内轮转(如 winston-daily-rotate-file)。

0