CKBox 本地部署日志
CKBox 本地部署的日志写入到 stdout 和 stderr。大部分日志以 JSON 格式输出。它们可用于监控或调试目的。在生产环境中,建议将日志存储到文件中或使用分布式日志系统(如 ELK 或 CloudWatch)。
# 使用日志监控 CKBox
为了更深入地了解 CKBox 本地部署的性能,我们构建了可用于监控的日志。要启用这些日志,只需添加 ENABLE_METRIC_LOGS=true 环境变量。
# 日志结构
日志结构包含以下信息
handler– 操作的统一标识符。使用此字段标识调用。traceId– 唯一的 RPC 调用 ID。tags– 用分号分隔的标签列表。使用此字段过滤指标日志。data– 包含附加信息的 JSON 对象。它可能在不同的传输之间有所不同。data.duration– 请求持续时间(以毫秒为单位)。data.transport– 请求传输类型。它可以是http或ws(Websocket)。data.status– 请求状态。它可以等于success、fail、warning。data.statusCode– 响应状态(符合 HTTP 状态码标准)。
此外,对于 HTTP 传输,还包括以下信息
data.url– URL 路径。data.method– 请求方法。
如果发生错误,data.status 将等于 failed,data.message 将包含错误消息。
HTTP 传输的示例日志
{
"level": 30,
"time": "2021-03-09T11:15:09.154Z",
"msg": "Request summary",
"handler": "ckbox",
"traceId": "85f13d92-57df-4b3b-98bb-0ca41a5ae601",
"data": {
"duration": 2470,
"transport": "http",
"statusCode": 200,
"status": "success",
"url": "/assets",
"method": "POST"
},
"tags": "metrics"
}
请参阅 示例图表,以了解如何使用日志进行监控目的。
# Docker
Docker 具有内置的日志机制,可捕获容器输出的日志。默认的日志驱动程序将这些日志写入文件。
使用此驱动程序时,可以使用 docker logs 命令显示容器的日志。可以添加 -f 标志以实时查看日志。有关 logs 命令的更多信息,请参考 官方 Docker 文档。
当容器长时间运行时,日志会占用大量空间。为了避免这个问题,您应该确保启用了日志轮转。这可以使用 max-size 选项设置。
# 分布式日志
如果您运行多个 CKBox 本地部署实例,建议使用分布式日志系统。它允许您在一个地方查看和分析来自所有实例的日志。
# AWS CloudWatch 和其他云解决方案
如果您在云中运行 CKBox 本地部署,最简单且推荐的方式是使用您选择的提供商提供的服务。以下是一些可用的服务
- AWS – CloudWatch
- Google Cloud – Cloud Logging
- Azure – Azure Monitor
要将 CloudWatch 与 AWS ECS 一起使用,您必须先创建一个日志组,并将日志驱动程序更改为 awslogs。当日志驱动程序配置正确后,日志将直接流式传输到 CloudWatch。
logConfiguration 可能类似于以下内容
"logConfiguration": {
"logDriver": "awslogs",
"options": {
"awslogs-region": "us-west-2",
"awslogs-group": "cksource",
"awslogs-stream-prefix": "ck-ckbox-logs"
}
}
有关更多信息,请参考 使用 awslogs 日志驱动程序 文章。
# 本地部署解决方案
如果您使用的是自己的基础设施,或者出于某种原因无法使用您的提供商提供的服务,您可以始终使用一些本地部署的分布式日志系统。
有很多可用的解决方案,包括
-
ELK + Filebeat
这是一个建立在 Elasticsearch、Logstash 和 Kibana 之上的堆栈。在此配置中,Elasticsearch 存储日志,Filebeat 从 Docker 读取日志并将它们发送到 Elasticsearch,Kibana 用于查看它们。由于日志已经结构化,因此 Logstash 是不必要的。 -
Fluentd
它使用一个专用的 Docker 日志驱动程序 来发送日志。它有一个内置的 Web 界面,但也可以与 Elasticsearch 和 Kibana 集成以实现更好的过滤。 -
Graylog
它使用一个专用的 Docker 日志驱动程序 来发送日志。它有一个内置的 Web 界面,并且需要 Elasticsearch 来存储日志,还需要 MongoDB 数据库来存储配置。
# 示例配置
此示例配置使用 Fluentd、Elasticsearch 和 Kibana 从 Docker 捕获日志。
在运行 CKBox 本地部署之前,您必须准备日志服务。出于此示例的目的,将使用 Docker Compose。在 docker-compose.yml 文件中创建 fluentd、elasticsearch 和 kibana 服务
version: '3.7'
services:
fluentd:
build: ./fluentd
volumes:
- ./fluentd/fluent.conf:/fluentd/etc/fluent.conf
ports:
- "24224:24224"
- "24224:24224/udp"
elasticsearch:
image: docker.elastic.co/elasticsearch/elasticsearch:6.8.5
expose:
- 9200
ports:
- "9200:9200"
kibana:
image: docker.elastic.co/kibana/kibana:6.8.5
environment:
ELASTICSEARCH_HOSTS: "http://elasticsearch:9200"
ports:
- "5601:5601"
要将 Fluentd 与 Elasticsearch 集成,您首先需要在 Fluentd 镜像中安装 fluent-plugin-elasticsearch。为此,请使用以下内容创建一个 fluentd/Dockerfile 文件
FROM fluent/fluentd:v1.10-1
USER root
RUN apk add --no-cache --update build-base ruby-dev \
&& gem install fluent-plugin-elasticsearch \
&& gem sources --clear-all
接下来,在 fluentd/fluent.conf 文件中配置输入服务器和与 Elasticsearch 的连接
<source>
@type forward
port 24224
bind 0.0.0.0
</source>
<match *.**>
@type copy
<store>
@type elasticsearch
host elasticsearch
port 9200
logstash_format true
logstash_prefix fluentd
logstash_dateformat %Y%m%d
include_tag_key true
type_name access_log
tag_key @log_name
flush_interval 1s
</store>
<store>
@type stdout
</store>
</match>
现在,您已准备好运行这些服务
docker-compose up --build
当服务准备就绪后,您就可以启动 CKBox 本地部署。
docker run --init -p 8080:8080 \
--log-driver=fluentd \
--log-opt fluentd-address=[Fluentd address]:24224 \
[Your config here] \
docker.cke-cs.com/ckbox:[version]
现在,在浏览器中打开 Kibana。它位于 https://:5601/。在第一次运行时,您可能会被要求创建索引。使用 fluentd-* 模式并按下“创建”按钮。完成此步骤后,您的日志将显示在“发现”选项卡中。