guide日志和监控

协作服务器本地部署中的日志记录到 stdoutstderr。 其中大多数以 JSON 格式记录。 它们可用于调试目的或监控请求速率、错误、持续时间和警告(无效请求)。 在生产环境中,我们建议将日志存储到文件或使用分布式日志系统(如 ELK 或 CloudWatch)。

# Docker

Docker 具有内置的日志记录机制,可捕获容器输出的日志。 默认的日志记录驱动程序将日志写入文件。

使用此驱动程序时,可以使用 docker logs 命令显示容器的日志。 可以添加 -f 标志以实时查看日志。 有关 logs 命令的更多信息,请参阅官方 Docker 文档

当应用程序在多个实例中运行时,该命令只会显示特定实例的日志。 若要收集来自多个实例的日志,请参阅分布式日志记录部分。

当容器长时间运行时,日志可能会占用大量空间。 若要避免此问题,应确保已启用日志轮换。 这可以通过 max-size 选项设置。

# 日志级别

每个日志都包含 level 属性。 日志级别有助于确定日志的重要性。

CKEditor 协作服务器将日志分为 6 个级别

  • 10 - 跟踪 - 关于应用程序中正在进行的进程的最详细的信息,
  • 20 - 调试 - 临时添加的日志,用于监控难以调试的情况,
  • 30 - 信息 - 有关资源修改或审计日志的信息,
  • 40 - 警告 - 通常可以忽略,因为它们是由应用程序中处理事件的异步性质引起的。 它们也可能通知您某些进程第一次失败,但另一次尝试解决了问题。 如果它们与错误 log level: ≥50 同时出现,它们可以通过提供更多上下文来加速问题调试,
  • 50 - 错误 - 表示某些进程意外停止或无法正常工作,
  • 60 - 严重错误 - 导致整个应用程序停止工作的错误。

默认情况下,只打印 level=40 及以上的日志。
可以通过设置 LOG_LEVEL=[value] 环境变量来更改默认设置。
不建议将值设置为低于 40,因为它可能会生成大量日志。 根据您的设置,这可能会导致性能或内存问题。

# 分布式日志记录

如果您运行多个协作服务器本地部署实例,建议使用分布式日志记录系统。 它允许您在一个地方查看和分析所有实例的日志。

# AWS CloudWatch 和其他云解决方案

如果您在云中运行协作服务器本地部署,最简单且推荐的方式是使用所选提供商提供的服务。 一些可用的服务包括

若要将 CloudWatch 与 AWS ECS 一起使用,您首先需要创建一个日志组,并将日志驱动程序更改为 awslogs。 当日志驱动程序配置正确时,日志将直接流式传输到 CloudWatch。

日志记录的 logConfiguration 可能类似于以下内容

"logConfiguration": {
  "logDriver": "awslogs",
  "options": {
    "awslogs-region": "us-west-2",
    "awslogs-group": "cksource",
    "awslogs-stream-prefix": "ck-cs-logs"
  }
}

有关更多信息,请参阅使用 awslogs 日志驱动程序文章。

# 本地部署解决方案

如果您使用的是自己的基础设施,或者由于某种原因无法使用您的提供商提供的服务,您可以始终使用某些本地部署的分布式日志记录系统。

有很多解决方案可用,包括

  • ELK + Filebeat
    这是一个构建在 Elasticsearch、Logstash 和 Kibana 之上的堆栈。 在此配置中,Elasticsearch 存储日志,Filebeat 从 Docker 读取日志并将其发送到 Elasticsearch,而 Kibana 用于查看它们。 由于日志已经是结构化的,因此 Logstash 不需要。

  • Fluentd
    它使用专用的Docker 日志驱动程序来发送日志。 它具有内置的 Frontend,但也可以与 Elasticsearch 和 Kibana 集成以实现更好的过滤。

  • Graylog
    它使用专用的Docker 日志驱动程序来发送日志。 它具有内置的 Frontend,并且需要 Elasticsearch 来存储日志以及 MongoDB 数据库来存储配置。

# 示例配置

此示例配置使用 Fluentd、Elasticsearch 和 Kibana 从 Docker 捕获日志。

在运行协作服务器本地部署之前,您需要准备日志记录服务。 为了便于说明,本例使用 Docker Compose。 在 docker-compose.yml 文件中创建 fluentdelasticsearchkibana 服务

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

当服务准备就绪后,您就可以启动协作服务器本地部署了。

docker run --init -p 8000:8000 \
--log-driver=fluentd \
--log-opt fluentd-address=[Fluentd address]:24224 \
[Your config here] \
docker.cke-cs.com/cs:[version]

现在,在浏览器中打开 Kibana。 它位于https://127.0.0.1:5601/。 在第一次运行时,您可能会被要求创建索引。 使用 fluentd-* 模式,然后按“创建”按钮。 完成此步骤后,您的日志将显示在“发现”选项卡中。