Логсташ условный в сообщении - PullRequest
0 голосов
/ 30 января 2019

Я использую стек док-станции ELK для объединения и анализа журналов из разных источников, но у меня возникла проблема с моей конфигурацией logstash.

Filebeat перенаправляет поток в logstash, и у меня нет ничего в Elasticsearch, поэтому я думаю, что есть проблема в конфигурации logstash.

У меня есть два разных типа журналов из моих журналов докера:

  1. Журналы HTTP-запросов

    2019-01-29T18: 35: 15.423Z HTTPИНФОРМАЦИЯ "POST / myroute /? Param1 = test" 201 41 - 44,014 мс

  2. Журналы приложения

    2019-01-29T18: 48: 19.657Z ОШИБКА APP: {"code": 201, "message": "ok"}

Я хотел бы проверить журнал и изменить его, когда я обнаружу, "APP" или "HTTP".Итак, вот моя конфигурация logstash

input {
  beats {
    port => 5044
    codec => "json"
  }
}
filter {
    if "HTTP" in [message] {
      grok {
          mapping => { "message" => %{TIMESTAMP_ISO8601:timestamp} %{WORD:type} %{LOGLEVEL:level} "%{WORD:method} %{URIPATHPARAM:url}" %{INT:code} %{INT:bytes} - %{GREEDYDATA:response_time}
      }
    }
    else if "APP" in [message] {
      grok {
          mapping => { "message" => %{TIMESTAMP_ISO8601:timestamp} %{WORD:type} %{LOGLEVEL:level} %{GREEDYDATA:jsonstring}  }
      }
      json {
            source => "jsonstring"
            target => "doc"
      }
      mutate {
        add_field => {
          "code" => "%{[doc][code]}"
          "message" => "%{[doc][message]}"
        }
      }
    }
  }
}
output { 
    elasticsearch { 
        hosts => ["localhost"] 
    } 
}

Я думаю, что есть проблема, когда я пытаюсь проверить содержимое сообщения, но я не знаю, как ее решить.Любая идея ?

Большое спасибо!

РЕДАКТИРОВАТЬ:

Я исправляю некоторые проблемы в моей конфигурации, но она все еще не работает

input {
  beats {
    port => 5044
    codec => "json"
  }
}
filter {
    if [message] =~ /HTTP/  {
      grok {
          mapping => { "message" => %{TIMESTAMP_ISO8601:timestamp} %{WORD:type} %{LOGLEVEL:level} "%{WORD:method} %{URIPATHPARAM:url}" %{INT:code} %{INT:bytes} - %{GREEDYDATA:response_time}
      }
    }
    else if [message] =~ /APP/ {
      grok {
          mapping => { "message" => %{TIMESTAMP_ISO8601:timestamp} %{WORD:type} %{LOGLEVEL:level} %{GREEDYDATA:jsonstring}  }
      }
      json {
            source => "jsonstring"
            target => "doc"
      }
      mutate {
        add_field => {
          "code" => "%{[doc][code]}"
          "message" => "%{[doc][message]}"
        }
      }
    }
  }
}
output { 
    elasticsearch { 
        hosts => ["localhost"] 
    } 
}

РЕДАКТИРОВАТЬ 2:

logstash.stdout logs

 Failed to execute action {:action=>LogStash::PipelineAction::Create/pipeline_id:main, :exception=>"LogStash::ConfigurationError", :message=>"Expected one of #, \", ', -, [, { at line 10, column 37 (byte 149) after filter {\n    if \"HTTP\" in [message] {\n      grok {\n          mapping => { \"message\" => ", :backtrace=>["/opt/logstash/logstash-core/lib/logstash/compiler.rb:41:in `compile_imperative'", "/opt/logstash/logstash-core/lib/logstash/compiler.rb:49:in `compile_graph'", "/opt/logstash/logstash-core/lib/logstash/compiler.rb:11:in `block in compile_sources'", "org/jruby/RubyArray.java:2486:in `map'", "/opt/logstash/logstash-core/lib/logstash/compiler.rb:10:in `compile_sources'", "org/logstash/execution/AbstractPipelineExt.java:149:in `initialize'", "/opt/logstash/logstash-core/lib/logstash/pipeline.rb:22:in `initialize'", "/opt/logstash/logstash-core/lib/logstash/pipeline.rb:90:in `initialize'", "/opt/logstash/logstash-core/lib/logstash/pipeline_action/create.rb:42:in `block in execute'", "/opt/logstash/logstash-core/lib/logstash/agent.rb:92:in `block in exclusive'", "org/jruby/ext/thread/Mutex.java:148:in `synchronize'", "/opt/logstash/logstash-core/lib/logstash/agent.rb:92:in `exclusive'", "/opt/logstash/logstash-core/lib/logstash/pipeline_action/create.rb:38:in `execute'", "/opt/logstash/logstash-core/lib/logstash/agent.rb:317:in `block in converge_state'"

Никто?(

1 Ответ

0 голосов
/ 30 января 2019

Ваша конфигурация была неверно синтаксически, как показано в сообщении Expected one of.Сначала вы пропустили }, затем шаблон grok должен был быть объявлен как String, между ", с " в экранированной строке (как \") и в фильтре grok, опция соответствует, а не отображение.

Итак, исправляя все это, начиная с первого conf:

input {
  beats {
    port => 5044
    codec => "json"
  }
}
filter {
    if "HTTP" in [message] {
        grok {
            match => { "message" => "%{TIMESTAMP_ISO8601:timestamp} %{WORD:type} %{LOGLEVEL:level} \"%{WORD:method} %{URIPATHPARAM:url}\" %{INT:code} %{INT:bytes} - %{GREEDYDATA:response_time}" }
        }
    } else if "APP" in [message] {
        grok {
            match => { "message" => "%{TIMESTAMP_ISO8601:timestamp} %{WORD:type} %{LOGLEVEL:level} %{GREEDYDATA:jsonstring}"  }
        }
        json {
            source => "jsonstring"
            target => "doc"
        }
        mutate {
            add_field => {
                "code" => "%{[doc][code]}"
                "message" => "%{[doc][message]}"
            }
        }
    }
}

output { 
    elasticsearch { 
        hosts => ["localhost"] 
    } 
}
...