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://127.0.0.1:5601/。在第一次运行时,您可能会被要求创建索引。使用 fluentd-*
模式并按下“创建”按钮。完成此步骤后,您的日志将显示在“发现”选项卡中。