Fluentd 的日志收集配置

前言

先简单说明一下,当前生产中咱们全部的服务都运行在 docker 里面,到目前为止尚未使用 k8s 来管理 docker,平常的更新部署等主要仍是使用 ansible + jenkins 结合来进行的,例如 docker 中服务的日志则是经过挂载到宿主机的目录当中,而后经过运行 fluentd 的 docker 也是经过挂载的方式读取宿主机所在的日志目录来进行收集。如下的配置说明示例使用的 fluentd 的 1.9.1 版本。docker

环境

fluentd 典型的部署架构须要包含两种不一样角色:转发器(forwarder),聚合器(aggregator)express

Fluentd 的日志收集配置

当前环境中:
转发器的 fluentd 是运行在每一个主机的 docker,将每一个主机上其余 docker 服务的日志收集起来而后转发到聚合器的 fluentd。
聚合器的 fluentd 是独立主机上运行的两个 docker,是将 docker 内部 24224 端口分别映射到主机的 24227 端口和 24228 端口。它将各个主机上转发过来的日志匹配过滤而后存储到 elasticsearch 中。ruby

fluentd 在线测试工具:https://fluentular.herokuapp.com架构

定义 flunetd 镜像

fluentd 这里都是使用的官方的 docker 镜像而后安装的插件。默认的 fluentd 镜像没有我须要的 fluent-plugin-elasticsearch 插件和 fluent-plugin-forest 插件,因此须要在 fluentd 的镜像的基础上经过 Dockerfile 中执行以下命令安装插件:
fluent-gem install fluent-plugin-elasticsearch && fluent-gem install fluent-plugin-forestapp

从新构建的 fluentd 镜像上传到本身的 harbor 仓库中,而后经过 ansible 部署启动 fluentd 的 docker 到各个主机上。socket

转发器配置示例

<source>
  @type tail
  path /home/game/http_8001/logs/access.log,/home/game/http_8002/logs/access.log
  pos_file /home/game/access.log.pos
  tag game.http.host01
  #read_from_head true
  format /^(?<log>.*)/
</source>

<match game.**>
  @type forward
  <buffer>
     @type file
     path /home/game/td-gamex-buffer
     chunk_limit_size 128MB
     total_limit_size 8GB
     chunk_full_threshold 0.9
     compress text
     flush_mode default
     flush_interval 15s
     flush_thread_count 1
     delayed_commit_timeout 60
     overflow_action throw_exception
     retry_timeout 10m
   </buffer>
  send_timeout 60s
  recover_wait 10s
  heartbeat_interval 1s
  transport tcp
  <server>
    name aggregator01
    host 10.144.77.88
    port 24227
    weight 60
  </server>
  <server>
    name aggregator02
    host 10.144.77.88
    port 24228
    weight 60
  </server>

聚合器配置示例

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

<filter game.http.**>
  @type record_transformer
  enable_ruby
  <record>
    service ${tag_parts[1]}
    host ${tag_parts[2]}
  </record>
</filter>

<filter game.http.**>
  @type parser
  reserve_data yes
  key_name log
  <parse>
    @type regexp
    expression /^(?<remote>[^ ]*) - (?<server_id>[^ ]*) \[(?<time>[^\]]*)\] "(?<method>\S+)(?: +(?<path>[^\"]*?)(?: +\S*)?)?" (?<code>[^ ]*) (?<body_bytes_sent>[^ ]*) "(?<referer>[^\"]*)" "(?<agent>[^\"]*)" (?<response-time>[^ ]*) (?<uid>[^ ]*) "(?<header_dvt>[^\"]*)" (?<header_did>[^ ]*) (?<header_sv>[^ ]*) (?<header_v>[^ ]*) (?<body>[^ ]*)/ 
    time_format %d/%b/%Y:%H:%M:%S %z
  </parse>
</filter>

<match game.**>
  @type copy
  <store>
    @type forest
    subtype elasticsearch
    <buffer>
       @type file
       path /tmp/elastic-buffer-191
       total_limit_size 1024MB
       chunk_limit_size 16MB
       flush_mode interval
       flush_interval 5s
       flush_thread_count 8
    </buffer>

    <template>
      hosts 10.144.77.99:9200
      logstash_format true
      logstash_prefix ${tag_parts[1]}
    </template>
    <case game.http.**>
      logstash_prefix ${tag}
    </case>
    <case game.socket.**>
      logstash_prefix ${tag}
    </case>
  </store>
</match>
相关文章
相关标签/搜索