温馨提示×

Ubuntu Node.js日志文件如何管理

小樊
32
2025-12-09 23:55:40
栏目: 编程语言

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

一 核心原则与总体架构

  • 在应用内使用成熟的日志库(如 Winston、Pino、Bunyan、Log4js),统一日志级别(如 error、warn、info、debug),并优先输出结构化日志(JSON),便于检索与分析。
  • 采用“轮转 + 压缩 + 保留策略”控制磁盘占用,可结合应用内轮转与系统级 logrotate
  • 生产建议接入集中式日志(如 ELK Stack、Graylog),便于搜索、告警与可视化。
  • 使用进程管理工具(如 PM2)简化运行与日志采集;如使用 systemd,可对接 journald/syslog 统一采集。

二 应用内日志与轮转实践

  • 使用 Winston 输出到文件并区分级别(开发环境同时输出到控制台):
// logger.js
const winston = require('winston');

const logger = winston.createLogger({
  level: 'info',
  format: 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() }));
}

module.exports = logger;
  • 按时间/大小自动轮转(winston-daily-rotate-file):
// logger-rotate.js
const winston = require('winston');
const DailyRotateFile = require('winston-daily-rotate-file');

const transport = new DailyRotateFile({
  filename: 'logs/application-%DATE%.log',
  datePattern: 'YYYY-MM-DD',
  zippedArchive: true,
  maxSize: '20m',
  maxFiles: '14d',
});

const logger = winston.createLogger({
  level: 'info',
  format: winston.format.json(),
  transports: [transport],
});

module.exports = logger;
  • Express 场景可用 morgan 将 HTTP 访问日志接入 Winston(或其他日志库)。

三 系统级与进程管理方案

  • 使用 logrotate 管理 Node.js 应用日志文件(适合写入文件的应用)
    1. 创建配置:/etc/logrotate.d/nodejs-app
/path/to/your/nodejs/app/logs/*.log {
  daily
  missingok
  rotate 7
  compress
  notifempty
  create 0640 root adm
}
  1. 测试与生效:
sudo logrotate -f /etc/logrotate.d/nodejs-app
  • 使用 PM2 内置日志管理
    • 常用命令:
pm2 start app.js --name my-app
pm2 set pm2:log-date-format "YYYY-MM-DD HH:mm:ss"
pm2 set pm2:max-size "20M"
pm2 set pm2:retain "14d"
pm2 logs my-app
  • 日志默认目录:~/.pm2/logs/(按应用名生成 .log 与 .err.log)。
  • 使用 systemd 将输出接入 journald/syslog
    • 示例服务片段:
[Service]
ExecStart=/usr/bin/node /path/to/app.js
StandardOutput=syslog
StandardError=syslog
SyslogIdentifier=yourapp
  • 查看:
journalctl -u yourapp -f
  • 将日志发送到 rsyslog(再转发到集中式系统)
    • 简单匹配示例(/etc/rsyslog.d/50-default.conf):
if $programname == 'nodejs' then /var/log/nodejs.log
& stop
  • 重启服务:sudo systemctl restart rsyslog。

四 集中式日志与监控分析

  • 集中式方案:将日志发送到 ELK Stack(Elasticsearch、Logstash、Kibana)Graylog,便于检索、聚合、可视化与告警。
  • 轻量转发:使用 rsyslogfluentd 做日志采集与转发。
  • 分析与告警:结合 KibanaLogwatch/Analog 做报表与异常发现;进程管理工具(如 PM2)可用于实时日志查看与基础监控

五 最佳实践与维护清单

  • 明确日志级别与输出目标;生产以文件为主、控制台为辅;优先结构化 JSON
  • 制定保留周期与容量上限(如保留 7–14 天、单文件 20MB 上限),并启用压缩归档
  • 避免记录敏感信息(如密码、密钥、令牌);必要时做脱敏。
  • 建立监控与告警(磁盘使用率、错误日志激增等),并定期审计与清理
  • 团队统一日志字段规范(如 timestamp、level、service、trace_id),便于跨服务追踪。

0