Filebeat + logstash + asterisk log

Добрый день.
Пытаюсь отправить лог звонков из asterisk в Elasticsearch
Схема такая
Asterisk складывает лог в файл /var/log/asterisk/cdr-csv/Master.csv
с помощью filebeat пересылаю в logstash
а logstash уже все записывает в elasticsearch

конфиг filebeat:

filebeat.prospectors:
- input_type: log
  paths:
    - /var/log/asterisk/cdr-csv/Master.csv
  fields: {log_type: cdr}
  encoding: utf-8
output.logstash:
  hosts: ["192.168.1.1:8083"]

конфиг Logstash:

input {
       tcp {
               port => 8083
               type => "asterisk"
                codec => plain {
                        charset => UTF-8
                }
       }
}

output {
       if [type] == "asterisk"{
               elasticsearch {
                       hosts => ["localhost:9200"]
                       sniffing => true
                       manage_template => false
                       index => "%{[type]}-%{+YYYY.MM.dd}"
               }
       }
}
file -bi /var/log/asterisk/cdr-csv/Master.csv
text/plain; charset=**utf-8**

в итоге все приходит примерно в таком виде \xD3\u001F

что делать? куда копать?

А как лог файл выглядит?

"","1325","s","macro-dial-one","""Extn1325"" <1325>","SIP/avaya-out-0000948b","SIP/1503-0000948c","Dial","SIP/1503,,Ttr","2015-02-02 10:01:35","2015-02-02 10:01:37","2015-02-02 10:01:55",20,18,"ANSWERED","DOCUMENTATION","1422871295.257384",""

вот кусочек лога. это одна строка

Точно такая же проблема и на windows.

filebeat.prospectors:

- input_type: log
  paths:
    - C:\orf1.log
output.logstash:
  hosts: ["192.168.0.1:8084"]

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

в логах logstash вот такие строки

[2017-09-19T10:04:58,272][WARN ][logstash.codecs.line] Received an event that has a different character encoding than you configured. ", :expected_charset=>"UTF-8"}

Похоже, что logstash не правильно сконфигурирован. input должен быть beats а не tcp. Я бы попробовал так

input {
  beats {
    port => 8083
    ....
  }
}

tcp никак не интерпретирует входящие сообщения. А beats используют lumberjack как протокол. Поэтому tcp и не работает.

Спасибо. проблема была именно в этом.
пробовал отправить данные сразу в elastic. данные приходят, но одной строкой, а в логе у меня CSV формат.
понимаю, что можно данные отправлять сначала в logstash, а уже в нем в filter с помощью csv{} разбить.
но в logstash у меня данные не приходят. А в логах filebeat получаю

INFO No non-zero metrics in the last 30s

насколько я понимаю данное сообщение говорит об отсутствие новых данных в файле.
я добавляю параметр

tail_file: false

и все равно не получаю данные.

что я упустил?

Может registry file показвает что эти файлы уже загружены?

Elasticsearch тоже может немного парсить. Но для CSV специальный плагин нужен.

Про registry file читал. его при каждом перезапуски службы удалял.
в лог файлах встречаются ip адреса хотел попробовать с картами поиграться, а как понимаю без logstash это не получится.

так же наткнулся на строчку в логах filebeat

ERR Failed to publish events caused by: write tcp X.X.X.X:56906->Y.Y.Y.Y:8084: wsasend: An existing connection was forcibly closed by the remote

но при уровне логирования debug

logging:
  level: debug

в логах пишит, что все отправлено

2017-09-19T21:38:09+04:00 DBG  2 events out of 2 events sent to logstash. Continue sending
2017-09-19T21:38:09+04:00 DBG  send completed

У вас в примерах в одном месте 8083, в другом 8084. Может в этом проблема? Если нет - пришлите по новой все установки, я посмотрю.

Это тоже можно - Ingest Geoip Processor Plugin | Elasticsearch Plugins and Integrations [5.6] | Elastic

filebeat

filebeat.prospectors:
- input_type: log   
  paths:
    - C:\orf1.log
  tail_file: false
logging:
  level: debug
output:
  logstash:
    hosts: ["192.168.0.1:8084"]

Logstash

input {
       beats {
               port => 8084
               type => "tmg"
     }
}
filter {
       if [type] == "tmg" {
              csv {}
       }
}
output {
       if [type] == "tmg"{
               elasticsearch {
                       hosts => ["localhost:9200"]
                       index => "tmg"
               }
       }
}

В logstash beats не поддерживает параметр type. Начните с более простой конфигурации:

input {
       beats {
               port => 8084
      }
}
filter {
     csv {}
}
output {
       elasticsearch {
               hosts => ["localhost:9200"]
               index => "tmg"
       }
}

проблема была в

if [type] == "tmg"{

в обработке output.
так как у меня данные собираются в другие индексы, и чтобы не получать лишние данные в индекс TMG я сделал

if [host] == "asu-006" {

но как понимаю это не очень правильное решение.
есть ли способы записывать тэги на стороне filebeat для фильтрации данных?
что то вроде

if [tag] == "mytag" {

Похоже, что это баг в документации или в плагине. Пока выясняем - можно воспользоваться установкой document_type или засунуть что-нибудь в tags или fields.

This topic was automatically closed 28 days after the last reply. New replies are no longer allowed.