将您的 Node.js 应用程序日志存储到 Minio

日志记录仍然是开发者关注的主要问题之一。通常,各种组件,如 Web 服务器、数据库,将日志存储在不同的位置。当出现问题时,开发者需要四处寻找相关的日志。

如果能将应用程序日志自动存储到预定义的位置,那不是很好吗?您可以使用 Fluentd 和 Minio 来实现这一点。在这篇文章中,我们将了解如何设置 Fluentd 和 Minio,以自动从您的 Node.js 应用程序创建日志并将它们存储到您的 Minio 服务器。但首先,让我们简要介绍一下 Fluentd。

快速说明一下,我在本文中使用 Ubuntu 15.10 进行演示。如果您使用的是其他操作系统,请使用相应的 Fluentd 命令。您可以在我提供的相关链接中找到这些信息。

Fluentd

Fluentd 是一个开源数据收集平台,允许您统一数据收集过程。它通过提供一个位于数据源和后端系统之间的 统一日志记录层 来解耦数据源和后端系统,允许开发者轻松地从各种应用程序生成日志并将其存储到他们首选的位置。

入门

首先,让我们从 Node.js 应用程序创建日志,并将它们存储到本地文件系统中。完成此操作后,我们将继续将日志文件存储目标设置为 Minio 服务器。

  • 安装 Fluentd — 您可以安装 Fluentd 的稳定版本,名为 td-agent(由支持 Fluentd 的公司 Treasure Data 提供),或者使用基于 Ruby 的守护进程。如果您感到困惑,请阅读 此处 关于 Fluentd 和 td-agent 的区别。

我使用的是 Ubuntu 15.10,并使用以下命令安装了 td-agent

curl -L https://toolbelt.treasuredata.com/sh/install-ubuntu-trusty-td-agent2.sh | sh

如果您使用的是其他平台,则需要使用相应的脚本。阅读 此处 的详细安装说明。

安装成功后,您应该能够使用以下命令启动 Fluentd 守护进程

$ /etc/init.d/td-agent start

使用以下命令检查状态

$ /etc/init.d/td-agent status

修改 Fluentd 配置文件 — 现在让我们设置 Fluentd 的 forward 输入插件,以接受来自 Node.js 应用程序的日志。请注意,插件本身包含在核心文件中,因此我们只需要编辑配置文件。打开文件“/etc/td-agent/td-agent.conf”,并将源标签设置为以下内容

<source>
  @type forward
  port 24224
  bind 0.0.0.0
</source>

在这里,我们只是将输入类型设置为 forward,并将端口设置为 24224,以监听传入连接。请注意,这仅应在您的私有网络中使用,因为在互联网上打开端口 24224 会使您的系统容易受到攻击。对于公共网络使用,请考虑使用 in_secure_plugin.

  • 配置 Node.js 应用程序以将日志发送到 Fluentd — 现在我们将了解如何从您的 Node.js 应用程序记录事件。为此,您需要在您的 Node.js 应用程序中包含 fluent-logger 作为依赖项。在我的示例应用程序中,我这样做了

Package.json

{
  "name": "node-example",
  "version": "0.0.1",
  "dependencies": {
    "express": "2.5.9",
    "fluent-logger": "0.1.0"
  }
}

接下来,我在我的 Web 应用程序中调用了 logger.configure()logger.emit() 来设置日志记录。

app.js

var express = require('express');
var app = express.createServer(express.logger());

var logger = require('fluent-logger');
logger.configure('fluentd.test', {host: 'localhost', port: 24224});

app.get('/', function(request, response) {
  logger.emit('follow', {from: 'userA', to: 'userB'});
  response.send('Hello World!');
});
var port = process.env.PORT || 3000;
app.listen(port, function() {
  console.log("Listening on " + port);
});

此示例应用程序将记录器配置为将日志发送到本地主机端口 24224(与 Fluentd 配置中期望的端口相同),然后,每当访问“/”时,就会生成一条日志条目,内容为“from userA to userB”。

您可以在浏览器中访问 http://localhost:3000 上的此应用程序,前提是您通过运行以下命令执行了节点模块

$ node app.js

如果一切正常,您应该能够在 /var/log/td-agent/td-agent.log 中访问日志。

我们只完成了一半。在接下来的步骤中,我们将了解如何设置 Minio 服务器和客户端,然后配置 Fluentd 将日志存储到我们自己的 Minio 服务器。

  • 设置 Minio — 现在我们将设置我们自己的 Minio 服务器,它将用作所有由 Node.js 应用程序生成的日志的存储位置。从 此处 下载 Minio 服务器和 Minio 客户端。然后导航到您下载这两个应用程序的文件夹,并键入以下内容
$ chmod +x minio
$ ./minio --help
$ ./minio server <Folder_That_You_Wish_To_Be_Root>

这将生成访问密钥和秘密密钥,您需要使用它们登录到您的 Minio 服务器。

接下来,配置 Minio 客户端

$ chmod 755 mc
$ ./mc config host add myminio http://localhost:9000 <Access_Key> <Secret_Key>

然后使用 Minio 客户端创建一个桶,这将是来自 Fluentd 的入站日志的目标。(您也可以通过 Minio 服务器 Web 界面执行此操作。)

$ mc mb myminio/NodeAppLogs
  • 设置 Fluentd 以将日志发送到 Minio — 最后,我们将配置 Fluentd,以便它将日志发送到 Minio 服务器,而不是本地文件系统。为此,您需要打开位于“/etc/td-agent/td-agent.conf”(与我们在第二步中编辑的文件相同)的 Fluentd 配置文件。打开文件后,查找 <match> 标签,并将其替换为
<match>
 @type s3
 aws_key_id <minio_access_key>
 aws_sec_key <minio_secret_key>
 s3_bucket <target_bucket>
 s3_endpoint <minio_server_URL>
 path logs/
 force_path_style true
 buffer_path /var/log/td-agent/s3
 time_slice_format %Y%m%d%H%M
 time_slice_wait 10m
 utc
 buffer_chunk_limit 256m
</match>

您只需要更改 minio_access_keyminio_secret_keytarget_bucketminio_server_URL 字段。完成操作后,保存文件并通过以下命令重新启动 Fluentd

$ sudo /etc/init.d/td-agent restart

如果一切正常,您将能够在 Minio 服务器中看到您的 Node.js 日志

我的 Node.js 应用程序日志在 Minio 服务器上

既然您已经完成了,请帮助我们了解您的用例,以及我们如何更好地为您服务!填写 我们 Minio 部署最佳实践表格(只需不到一分钟),并有机会在 Minio 网站上展示您的用例,并将您的 Minio 私有云设计展示给 Minio 社区。