Нужен файл logstash-conf для извлечения количества разных строк в файле журнала

Как написать файл конфигурации logstash, чтобы отделить две разные (S:Info & S:Warn) строки от файла журнала и отобразить соответствующий счетчик в Kibana?

Пробовал использовать фильтр grep в logstash, но не уверен, что получу счетчик двух разных строк (Info и Warn) в Kibana.

Ниже приведен фрагмент файла журнала:

Apr 23 21:34:07 LogPortSysLog: T:2015-04-23T21:34:07.276 N:933086 S:Info P:WorkerThread0#783 F:USBStrategyBaseAbs.cpp:724 D:T1T: Power request disabled for this cable. Defaulting to 1000mA
Apr 23 21:34:10 LogPortSysLog: T:2015-04-23T21:34:10.570 N:933087 S:Warn P:DasInterfaceThread#791 F:USBStrategyBaseAbs.cpp:1696 D:CP_CONTROL:Unexpected DasChildTag: 27 B:{}

1 ответ

Решение

Вы хотите grok фильтр. Я не обязательно получаю весь формат, но это мои догадки:

Apr 23 21:34:07 LogPortSysLog: T:2015-04-23T21:34:07.276 N:933086 S:Info P:WorkerThread0#783 F:USBStrategyBaseAbs.cpp:724 D:T1T: Power request disabled for this cable. Defaulting to 1000mA

Это переводится как:

LOG_TIMESTAMP LOG_NAME: T:ACTUAL_TIMESTAMP N:LOGGED_EVENT_NUMBER S:SEVERITY P:THREAD_NAME F:FILENAME:LINE_NUMBER D:MESSAGE

Похоже, что я собираю некоторую дополнительную информацию в MESSAGE, но это должно помочь вам начать.

файлы:

  1. data.log содержит две строки из вашего ввода.
  2. portlogs.conf содержит "конфигурацию" Logstash для анализа журнала.

    input {
      # You can change this to the file/other inputs
      stdin { }
    }
    
    filter {
      grok {
        # "message" is the field name filled in by most inputs with the
        #  current line to parse
        # Note: I throw away the log's timestamp and use the message timestamp,
        #  which may not be true for all of your logs!
        match => [
          "message",
          "%{SYSLOGTIMESTAMP} %{DATA:name}: T:%{TIMESTAMP_ISO8601:timestamp} N:%{INT:log_number:int} S:%{DATA:severity} P:%{DATA:thread} F:%{DATA:filename}:%{INT:line_number:int} D:%{GREEDYDATA:log_message}"
        ]
      }
    }
    
    output {
      # Change this to go to your Elasticsearch cluster
      stdout {
        codec => rubydebug
      }
    }
    

Комбинируя два, с Logstash, я получаю вывод (работает Logstash 1.5 RC3, но RC4 вышел на этой неделе):

{
        "message" => "Apr 23 21:34:07 LogPortSysLog: T:2015-04-23T21:34:07.276 N:933086 S:Info P:WorkerThread0#783 F:USBStrategyBaseAbs.cpp:724 D:T1T: Power request disabled for this cable. Defaulting to 1000mA",
       "@version" => "1",
     "@timestamp" => "2015-04-24T01:34:07.276Z",
           "host" => "Chriss-MBP-2",
           "name" => "LogPortSysLog",
     "log_number" => 933086,
       "severity" => "Info",
         "thread" => "WorkerThread0#783",
       "filename" => "USBStrategyBaseAbs.cpp",
    "line_number" => 724,
    "log_message" => "T1T: Power request disabled for this cable. Defaulting to 1000mA"
}
{
        "message" => "Apr 23 21:34:10 LogPortSysLog: T:2015-04-23T21:34:10.570 N:933087 S:Warn P:DasInterfaceThread#791 F:USBStrategyBaseAbs.cpp:1696 D:CP_CONTROL:Unexpected DasChildTag: 27 B:{}",
       "@version" => "1",
     "@timestamp" => "2015-04-24T01:34:10.570Z",
           "host" => "Chriss-MBP-2",
           "name" => "LogPortSysLog",
     "log_number" => 933087,
       "severity" => "Warn",
         "thread" => "DasInterfaceThread#791",
       "filename" => "USBStrategyBaseAbs.cpp",
    "line_number" => 1696,
    "log_message" => "CP_CONTROL:Unexpected DasChildTag: 27 B:{}"
}

Это будут те два документа, которые отправляются в Elasticsearch, если вы правильно настроите свой вывод. Сообщения Grok - это просто регулярные выражения, поэтому вы можете создать шаблон, который специально анализирует (или не анализирует) внутреннюю часть log_message, который включает в себя игнорирование вещей, таких как B:{} выше. Чтобы игнорировать это, просто не указывайте имя поля (например, :log_message называет совпавший образец log_message, поэтому, не называя его, он игнорируется).

Оттуда, это просто вопрос загрузки Kibana и создания визуализации. Он будет автоматически использовать поля сверху, чтобы сделать их доступными для поиска. Например, вы можете искать severity:warn чтобы видеть только строки журнала с серьезностью "Предупреждать" (без учета регистра). Чтобы найти точные совпадения, вы можете использовать автоматически добавленные severity.raw искать это как severity.raw:Warn, но это, как правило, не то, что делают пользователи.

Другие вопросы по тегам