guideWord 导入导出本地部署日志

Word 导入导出本地部署的日志写入到 stdoutstderr。大多数日志采用 JSON 格式。它们可用于监控或调试。在生产环境中,建议将日志存储到文件或使用分布式日志系统(如 ELK 或 CloudWatch)。

# 使用日志监控 Word 导入导出

为了更好地了解 Word 导入导出本地部署的运行情况,我们构建了可用于监控的日志。要启用这些日志,只需添加 ENABLE_METRIC_LOGS=true 环境变量。

# 日志结构

日志结构包含以下信息

  • handler – 操作的统一标识符。使用此字段标识调用。
  • traceId – 唯一的 RPC 调用 ID。
  • tags – 用分号分隔的标签列表。使用此字段筛选指标日志。
  • data – 包含附加信息的。它可能在不同的传输之间有所不同。
  • data.duration – 以毫秒为单位的请求持续时间。
  • data.transport – 请求传输的类型。它可以是 httpws(websocket)。
  • data.status – 请求状态。它可以等于 successfailwarning
  • 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": "postConvert",
  "traceId": "85f13d92-57df-4b3b-98bb-0ca41a5ae601",
  "data": {
    "duration": 752,
    "transport": "http",
    "statusCode": 200,
    "status": "success",
    "url": "/v1/convert",
    "method": "POST"
  },
  "tags": "metrics"
}

请查看 示例图表,以查看如何将日志用于监控目的

# Docker

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

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

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

# 分布式日志

如果您正在运行多个 Word 导入导出本地部署实例,建议使用分布式日志系统。它允许您在一个位置查看和分析来自所有实例的日志。

# AWS CloudWatch 和其他云解决方案

如果您在云中运行 Word 导入导出本地部署,最简单且推荐的方式是使用所选提供商提供的服务。以下是一些可用的服务

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

logConfiguration 可能看起来类似于此

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

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

# 本地部署解决方案

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

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

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

  • Fluentd
    它使用专门的 Docker 日志驱动程序 来发送日志。它有一个内置的前端,但也能够与 Elasticsearch 和 Kibana 集成以更好地过滤。

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

# 示例配置

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

在运行 Word 导入导出本地部署之前,您必须准备日志记录服务。出于本示例的目的,将使用 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

当服务准备就绪后,您终于可以启动 Word 导入导出本地部署了。

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

现在在浏览器中打开 Kibana。它可以在 https://127.0.0.1:5601/ 访问。在首次运行时,系统可能会询问您是否要创建索引。使用 fluentd-* 模式并按下“创建”按钮。完成此步骤后,您的日志将出现在“发现”选项卡中。