Назад | Перейти на главную страницу

Logstash: время UNIX Epoch не конвертируется в читаемый формат

Я установил стек ELK и пытаюсь проанализировать записи журнала squid.

И у меня возникла проблема при попытке преобразовать следующее время UNIX / Epoc как

1442469455.757

в удобочитаемый формат.

При устранении неполадок появляется следующая ошибка:

Получено событие, в котором кодировка символов отличается от настроенной.

и это идет с "_dateparsefailure" тег, который означает, что это не удалось.

Я использовал следующий фильтр logstash

filter {
if [type] == "squid" {
        grok {
        patterns_dir   => [ "/etc/logstash/patterns" ]
        match => { message => "%{SQUID_LOG}" }
        }
        date {
          match => [ "timestamp", "UNIX" ]
        }
   }
}

Шаблон регулярного выражения, соответствующий метке времени в основном шаблоне "%{SQUID_LOG}" является: (%{DATA:timestamp})

Пожалуйста, дайте мне знать, если есть постоянное решение или обходной путь для этого.

Заранее спасибо.

ОБНОВИТЬ:

Похоже, это вызвано лишним пространством после отметки времени, как указано ниже:

value=>"1438744871.647\\xA0\\xA0\\xA0\\xA0\\xA0", :exception=>"Invalid UNIX epoch value '1438744871.647\\xA0\\xA0\\xA0\\xA0\\xA0'", :config_parsers=>"UNIX", :config_locale=>"default=en_GB", :level=>:warn

Есть ли способ избавиться от этих '\\xA0\\xA0\\xA0\\xA0\\xA0' после отметки времени?

Конфиг:

input { stdin { } }

filter {
        grok {
        match => { message => "((%{DATA:time_stamp}) (%{NUMBER:time_elapsed_ms}) (%{IPV4:client_ip}) (%{WORD:req_stat})/(%{INT:reply_code}) (%{INT:request_size}) (%{WORD:http_method}) (%{URIPROTO:request_protocol}://)?%{IPORHOST:request_hostname}(?::%{POSINT:port})?(?:%{URIPATHPARAM:uri_param}|) (%{USERNAME:user}) (%{WORD:squid_hierarchy})/(%{HOST:server}|-) (%{DATA:content_type}) (%{WORD:snaction}|-))" }
        add_tag => "NONU"
        }
        mutate {
        strip => [ "time_stamp" ]
        }
        date {
         match => [ "time_stamp", "UNIX" ]
        }
   }

output {
  stdout { codec => rubydebug }
}

Образец данных:

1442469456.136      1 19.108.217.100 DENIED/407 3864 CONNECT fei.wsp.microsoft.com:443 - HIER_NONE/- text/html -

Если ошибки действительно вызваны лишним пробелом в time_stamp поле, вы можете использовать mutate фильтровать strip это из. Тогда ваш фильтр будет выглядеть так:

filter {
  if [type] == "squid" {
    grok {
      patterns_dir   => [ "/etc/logstash/patterns" ]
      match => { message => "%{SQUID_LOG}" }
    }
    mutate {
      strip => ["time_stamp"]
    }
    date {
      match => [ "time_stamp", "UNIX" ]
    }
 }
}

Обновить

Если во всех записях журнала есть ровно 6 дополнительных пробелов после отметки времени, обновите шаблон Grok следующим образом. Обратите внимание на лишние пробелы между time_stamp и time_epapsed_ms.

((%{DATA:time_stamp})      (%{NUMBER:time_elapsed_ms}) (%{IPV4:client_ip}) (%{WORD:req_stat})/(%{INT:reply_code}) (%{INT:request_size}) (%{WORD:http_method}) (%{URIPROTO:request_protocol}://)?%{IPORHOST:request_hostname}(?::%{POSINT:port})?(?:%{URIPATHPARAM:uri_param}|) (%{USERNAME:user}) (%{WORD:squid_hierarchy})/(%{HOST:server}|-) (%{DATA:content_type}) (%{WORD:snaction}|-))

Если есть вероятность, что это может быть больше или меньше 6 пробелов, следующее должно работать.

((%{DATA:time_stamp})%{SPACE}(%{NUMBER:time_elapsed_ms}) (%{IPV4:client_ip}) (%{WORD:req_stat})/(%{INT:reply_code}) (%{INT:request_size}) (%{WORD:http_method}) (%{URIPROTO:request_protocol}://)?%{IPORHOST:request_hostname}(?::%{POSINT:port})?(?:%{URIPATHPARAM:uri_param}|) (%{USERNAME:user}) (%{WORD:squid_hierarchy})/(%{HOST:server}|-) (%{DATA:content_type}) (%{WORD:snaction}|-))

Я подозреваю, что это что-то в разборе SQUID_LOG (например, токен отсутствует или неуместен).

Вы можете увидеть больше, если поместите свой код фильтра между:

input {
  file {
    path => "/opt/logstash/squid.log"
    type => "squid"
    start_position => "beginning"
    sincedb_path => "/dev/null"
  }
}

[filter]

output {
    stdout { codec => rubydebug }   
}

где /opt/logstash/squid.log - это всего лишь несколько проблемных строк журнала.

С участием:

/opt/logstash/bin/logstash -f this_test_conf_file.conf

вы увидите на экране, что происходит.