首页 > 解决方案 > 如何将应用程序日志从 NodeJS 应用程序发送到托管在 Kubernetes 中的 Elastic Stack?

问题描述

我正在构建一个 NodeJS 应用程序并尝试使用 Elastic Stack 来收集日志。我想要的日志是:

现在我的应用程序托管在 Kubernetes 中,并且我也将 Elastic Stack 部署到了同一个 GKE 集群。现在我是 Elastic Stack 的新手。我有一个小想法,我们必须将数据发送到 logstash 并将其发送到弹性搜索。然后我们可以在 Kibana 中进行可视化。我尝试遵循几个教程,但仍然不知道如何做到这一点。将我的应用程序连接到堆栈。所以,请问我可以知道...

提前致谢

更新:现在我设法使用 winston 将日志写入节点应用程序中的文件。因此它在应用程序根目录中创建error.log并:combined.log

const logger = winston.createLogger({
  level: 'info',
  format: winston.format.json(),
  defaultMeta: { service: 'user-service' },
  transports: [
    //
    // - Write to all logs with level `info` and below to `combined.log`
    // - Write all logs error (and below) to `error.log`.
    //
    new winston.transports.File({ filename: 'error.log', level: 'error' }),
    new winston.transports.File({ filename: 'combined.log' })
  ]
});

(根据我的码头文件WORKDIR /usr/src/app):

FROM node:lts as build-stage

WORKDIR /usr/src/app

ENV NPM_CONFIG_LOGLEVEL warn
COPY package.json package.json
COPY yarn.lock yarn.lock
RUN yarn install

COPY . .

RUN yarn build
RUN yarn install --production

FROM node:lts

WORKDIR /usr/src/app

COPY --from=build-stage /usr/src/app /usr/src/app

CMD yarn serve
EXPOSE 8000

现在我已经安装了 filebat,但它从 Nginx 和其他东西中获取了所有其他日志,但不是这个。如何告诉它准确获取这两个文件?

标签: elasticsearchlogstashelastic-stack

解决方案


免责声明:我不是 DevOps 人,但曾经从用户的角度使用 ELK 堆栈。

我认为您可以从 3 个基本组件开始:

  • Logstash(或文件节拍)
  • ElasticSearch 本身
  • 木花

Logstash 应该读取 NodeJS 生成的日志(写入某个文件)并将它们发送到 ElasticSearch。

由于您正在运行 K8S,因此 Node 应用程序很可能部署在某个 POD 中。在这种情况下,您可以考虑添加一个带有 Logstash 进程的 sidecar 容器作为一种可能的解决方案。IMO 这是最灵活的方法,尽管如果您在一台机器(节点)上运行多个 pod,那么 logstash 进程将占用您的 CPU。如果这是一个问题,您可以配置一些包含来自 pod 的日志的卷,并配置一个带有 LogStash 的专用 pod,它将映射来自主机节点上所有 POD 的所有日志。

在任何情况下,Logstash 都应该将数据发送到 ElasticSearch 并跟踪到目前为止发送的内容。如果您有许多日志,请考虑每天在 ES 中创建一个具有一定生存时间(保留期)的索引,例如 1 周。然后ES会通过自动删除索引来删除数据

Kubernetes 方面,ES 集群也可以部署在 POD 中,它应该公开端口以供访问(默认情况下,9200 用于 http,9300 用于二进制访问)。如果你的服务不多,大概 2-3 台服务器就够了,如果你不关心高可用性,你甚至可以从运行单个 pod 开始

现在是基巴纳。它是一个连接到 Elastic Search 并允许对日志数据进行切片和切块的 UI。您可以按级别、主机、消息进行过滤,ES 非常适合搜索,因此这个用例得到了很好的支持。

同样,对于 K8S,您可以将 Kibana 部署在具有暴露 HTTP 端口的 Pod 中,以便从浏览器访问。这里请注意,这个 HTTP 端口将由技术上不属于您的 kubernetes 集群的浏览器访问,因此请分别定义 K8S 基础设施。

这是一个基本的堆栈,虽然基本仍然非常灵活,并且可以用于实际项目。


推荐阅读