首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在fluentd中解析日志

在fluentd中解析日志
EN

Stack Overflow用户
提问于 2017-01-04 22:19:45
回答 3查看 6.4K关注 0票数 4

我在docker容器中运行本地服务器,该容器被设置为使用fluentd作为日志驱动程序。我有docker组合文件,可以在他们自己的容器中运行fluentd,nginx,elasticsearch和kibana。因此,fluentd从我的服务器获取日志,将其传递给elasticsearch并显示在Kibana上。

我的问题是,如何在fluentd (elasticsearch或kibana,如果在fluentd中不可能)解析我的日志来创建新的标签,这样我就可以对它们进行排序并更容易导航。

这是在Kibana中显示的当前日志。现在我想把这个日志字符串‘分解’成新的标签。在这种情况下:

代码语言:js
复制
2017/01/04 13:26:56.574909 UTC (Example deployment.web) [INFO] [GET] /api/device/ 200 10.562379ms

代码语言:javascript
复制
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

代码语言:javascript
复制
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文件,不包含解析,只是简单的转发

代码语言:javascript
复制
type forward



  type elasticsearch
  host elasticsearch
  logstash_format true
  flush_interval 10s

我尝试使用正则表达式,这里我尝试解析出logType

代码语言:javascript
复制
@type forward



  type stdout 



  @type parser  
  format /(?\[([^\)]+)\])/ 
  key_name log
  reserve_data false

我尝试了其他配置,但都不能解析我的日志。

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2017-02-06 17:27:24

对于任何有类似问题的人,我找到了一个适合我的解决方案。

在fluent.conf文件中新建过滤器将添加标记。例如,如果我想创建一个名为严重性第一步是用regex记录它。示例如下DEBU。

代码语言:javascript
复制
@type record_transformer
  enable_ruby
  
    severity ${record["log"].scan(/\[([^\)]+)\]/).last}

然后从原始消息中删除:

代码语言:javascript
复制
@type record_transformer
  enable_ruby
  
    log ${record["log"].gsub(/\[([^\)]+)\]/, '')}

主要部分是:

代码语言:js
复制
severity ${record["log"].scan(/\[([^\)]+)\]/).last}

其中,severity是新字段record的名称“日志”是原始日志字符串,其中通过regex找到字符串并将其附加到新字段。

代码语言:js
复制
log ${record["log"].gsub(/\[([^\)]+)\]/, '')}

此命令修改字段日志其中regex被替换为空字符串- deleted。

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

票数 6
EN

Stack Overflow用户

发布于 2017-01-06 23:15:08

首先,使用以下命令标记您的源代码tag。其次,在match部分包含您的标记键:

include_tag_key true tag_key fluentd_key

这对我很有效。日志将按以下方式进行分类fluentd_key

票数 0
EN

Stack Overflow用户

发布于 2021-02-25 20:00:14

我们可以使用记录_变压器选项。如下配置所示:

代码语言:javascript
复制
@type record_transformer
        enable_ruby true
        
          container_name ${record["kubernetes"]["container_name"]}
          namespace ${record["kubernetes"]["namespace_name"]}
          pod ${record["kubernetes"]["pod_name"]}
          host ${record["kubernetes"]["host"]}

这样我们就有了容器_名称、命名空间、pod和host作为标签/标签。然后我们可以进一步使用它。下面是一个示例用例。

代码语言:javascript
复制
@type elasticsearch
        host "#{ENV['FLUENT_ELASTICSEARCH_HOST']}"
        port "#{ENV['FLUENT_ELASTICSEARCH_PORT']}"
        logstash_format true
        logstash_prefix ${namespace}_${container_name}
        
          @type file
          path /var/log/${container_name}/app.log
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/41466048

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档