解析熟练的日志

时间:2017-01-04 14:19:45

标签: logging elasticsearch docker kibana fluentd

我在docker容器中运行本地服务器,该容器设置为使用流畅的日志驱动程序。 我有docker compose文件,它在自己的容器中运行流利的,nginx,elasticsearch和kibana。 所以流利的从我的服务器获取日志,将其传递给elasticsearch并显示在Kibana上。

我的问题是,如何使用流利的(弹性搜索或kibana,如果不能流利地)解析我的日志来制作新标签,这样我就可以对它们进行排序并更容易导航。

这是Kibana中显示的当前日志。现在,我希望将此日志字符串“分解”为新标记。在这种情况下:

2017/01/04 13:26:56.574909 UTC (Example deployment.web) [INFO] [GET] /api/device/ 200 10.562379ms

date: 2017/01/04
time: 13:26:56.574909 UTC
message: (Example deployment.web)
logType: [INFO]
other: [GET] /api/device/ 200 10.562379ms

我的docker-compose.yml

version: "2"

services:

  fluentd:
    image: fluent/fluentd:latest
    ports:
      - "24224:24224"
    volumes:
      - ./fluentd/etc:/fluentd/etc
    command: /fluentd/etc/start.sh
    networks:
      - lognet

  elasticsearch:
    image: elasticsearch
    ports:
      - "9200:9200"
      - "9300:9300"
    volumes:
      - /usr/share/elasticsearch/data:/usr/share/elasticsearch/data
    networks:
      - lognet

  kibana:
    image: kibana
    restart: always
    ports:
      - "5601:5601"
    environment:
      - ELASTICSEARCH_URL=http://localhost:9200
    networks:
      - lognet

  nginx:
    image: nginx
    ports:
      - "8084:80"
    logging:
      driver: fluentd
    networks:
      - lognet

    networks:
      lognet:
        driver: bridge

我的fluent.conf文件,不包含解析,只是简单的转发

<source>
  type forward
</source>

<match *.*>
  type elasticsearch
  host elasticsearch
  logstash_format true
  flush_interval 10s
</match>

我尝试使用regexp,这里我尝试解析logType out

<source>
  @type forward
</source>

<match *.*>
  type stdout 
</match>

<filter docker.**>
  @type parser  
  format /(?<logType>\[([^\)]+)\])/ 
  key_name log
  reserve_data false
</filter>

我尝试了其他配置但没有导致解析我的日志。

3 个答案:

答案 0 :(得分:4)

对于有类似问题的人,我找到了适用于我的解决方案。

在fluent.conf文件中添加了新的过滤器标记。例如,如果我想创建名为 severity 的新字段,则第一步是使用正则表达式进行记录。

示例是 [DEBU]

<filter *.*>
  @type record_transformer
  enable_ruby
  <record>
    severity ${record["log"].scan(/\[([^\)]+)\]/).last} 
  </record>
</filter>

然后从原始邮件中删除:

<filter *.*>
  @type record_transformer
  enable_ruby
  <record>
    log ${record["log"].gsub(/\[([^\)]+)\]/, '')}   
  </record>
</filter>

主要部分是:

severity ${record["log"].scan(/\[([^\)]+)\]/).last} 

如果severity是新字段的名称,则记录[&#34; log&#34;]是原始日志字符串,其中找到字符串via regex并附加到新字段。

log ${record["log"].gsub(/\[([^\)]+)\]/, '')}   

此命令修改字段 log ,其中正则表达式由空字符串替换 - 已删除。

注意:顺序非常重要,因为我们首先必须附加到新字段,然后从原始日志消息中删除字符串(如果需要)。

答案 1 :(得分:0)

首先,使用tag标记您的来源。其次,在匹配部分中包含您的标记键:

include_tag_key true tag_key fluentd_key

这对我有用。日志将按fluentd_key分类。

答案 2 :(得分:0)

我们可以使用 record_transformer 选项。像下面的配置:

      <filter kubernetes.**>
        @type record_transformer
        enable_ruby true
        <record>
          container_name ${record["kubernetes"]["container_name"]}
          namespace ${record["kubernetes"]["namespace_name"]}
          pod ${record["kubernetes"]["pod_name"]}
          host ${record["kubernetes"]["host"]}
        </record>
      </filter>

通过这个,我们可以将 container_name、namespace、pod 和 host 作为标签/标签。然后我们可以进一步使用。下面是示例用例之一。

      <match **>
        @type elasticsearch
        host "#{ENV['FLUENT_ELASTICSEARCH_HOST']}"
        port "#{ENV['FLUENT_ELASTICSEARCH_PORT']}"
        logstash_format true
        logstash_prefix ${namespace}_${container_name}
        <buffer tag, container_name, namespace>
          @type file
          path /var/log/${container_name}/app.log
        </buffer>
      </match>