聊聊CentOS上Node.js日志的配置与管理,其实核心思路就那么几条。无论你是刚接触服务端开发,还是已经在生产环境摸爬滚打多年,日志这件事都绕不开——它既是调试的拐杖,也是运维的眼睛。下面直接进入正题。

CentOS上Node.js日志如何配置与管理

一 核心方案与工具

选对工具,事半功倍。在应用内部,有几款日志库值得优先考虑:

在系统层面,logrotate 是管理日志轮转与压缩的老牌工具,非常适合长期运行的服务。如果用了进程管理器,PM2 自带日志聚合查看功能,能大大简化开发和运维的日常工作。

一旦服务规模上来,就需要考虑集中式日志了。常见的做法是通过 rsyslog(UDP/TCP 514端口)把日志发到远程,或者接入 LogstashFluentd 这类数据管道,最终落地到 ELK(Elasticsearch、Logstash、Kibana)体系中进行存储和可视化。

日志级别的设置,建议开发环境用 debug,生产环境用 info/warn/error 分层输出,这样既能过滤冗余信息,又能方便告警。

二 应用内日志配置示例

纸上谈兵不如直接看代码。先看一个使用 Winston 输出到控制台与文件的经典配置,特别之处在于它按错误和全量做了分离:

// logger.js
const { createLogger, format, transports } = require('winston');

const logger = createLogger({
  level: 'info',
  format: format.combine(
    format.timestamp({ format: 'YYYY-MM-DD HH:mm:ss' }),
    format.json()
  ),
  transports: [
    new transports.File({ filename: 'logs/error.log', level: 'error' }),
    new transports.File({ filename: 'logs/combined.log' }),
    new transports.Console()
  ]
});

module.exports = logger;

如果希望日志按天滚动并自动压缩,可以引入 winston-daily-rotate-file 插件:

// logger-daily.js
const { createLogger, format, transports } = require('winston');
const DailyRotateFile = require('winston-daily-rotate-file');

const logger = createLogger({
  level: 'info',
  format: format.combine(
    format.timestamp({ format: 'YYYY-MM-DD HH:mm:ss' }),
    format.printf(({ timestamp, level, message }) => {
      return `[${timestamp}] ${level.toUpperCase()}: ${message}`;
    })
  ),
  transports: [
    new DailyRotateFile({
      filename: 'logs/app-%DATE%.log',
      datePattern: 'YYYY-MM-DD',
      zippedArchive: true,
      maxSize: '20m',
      maxFiles: '14d'
    })
  ]
});

module.exports = logger;

再看一个 Log4js 的配置,同样支持按时间滚动:

// logger-log4js.js
const log4js = require('log4js');

log4js.configure({
  appenders: {
    out: { type: 'console' },
    app: {
      type: 'dateFile',
      filename: 'logs/app',
      pattern: '.yyyy-MM-dd.log',
      compress: true,
      alwaysIncludePattern: true
    }
  },
  categories: {
    default: { appenders: ['out', 'app'], level: 'info' }
  }
});

const logger = log4js.getLogger();
module.exports = logger;

这里有个建议:生产环境优先输出 JSON 格式到文件,这样后续检索和聚合会很方便;控制台输出则留给本地开发和调试就好。

三 系统级日志轮转与保留策略

对于使用 systemd 或长期运行的进程,logrotate 是系统级的可靠选择。配置起来很简单:

创建一个配置文件 /etc/logrotate.d/nodejs_app,内容如下:

/path/to/your/nodejs/app/logs/*.log {
    daily
    rotate 7
    compress
    delaycompress
    missingok
    notifempty
    create 0640 root root
}

然后手动测试一下:sudo logrotate -f /etc/logrotate.d/nodejs_app。在 CentOS 上,logrotate 默认由 cron.daily 每日触发,所以不需要额外设置定时任务。

那么,到底该用应用内轮转还是系统级轮转?这取决于场景:

四 进程管理与集中式日志

PM2 是 Node.js 进程管理的利器,它的日志管理功能也很实用:

如果想将日志发送到远程 rsyslog 服务器,流程也很清晰。首先在服务端启用 UDP 514 端口:编辑 /etc/rsyslog.conf,取消注释并启动模块:

module(load="imudp")
input(type="imudp" port="514")

然后重启服务:sudo systemctl restart rsyslog

在客户端,通过 Winston 的 Syslog 插件发送日志:

const { createLogger, transports } = require('winston');
const SyslogTransport = require('winston-syslog').SyslogTransport;

const logger = createLogger({
  level: 'info',
  transports: [
    new SyslogTransport({
      host: '192.0.2.10', // 远程 rsyslog 地址
      port: 514,
      protocol: 'udp4'
    })
  ]
});

再往上走一步,就是搭建完整的集中式分析平台了:日志从 Logstash 流入 Elasticsearch,最后在 Kibana 中实现检索、聚合与可视化。这套组合拳在大型系统中几乎是标配。

五 日常运维与最佳实践

最后,总结几条生产环境下的经验,值得记下来:

说到底,日志管理这件事,工具选对、配置做细、规则定好,后续运维就会省心很多。

本文转载于:https://www.yisu.com/ask/80612217.html 如有侵犯,请联系zhengruancom@outlook.com删除。
免责声明:正软商城发布此文仅为传递信息,不代表正软商城认同其观点或证实其描述。