Como formatar dados de log antes de encaminhá-los como JSON para elasticsearch?

1

Eu registro todos os eventos em um sistema em um arquivo JSON via syslog-ng :

destination d_json { file("/var/log/all_syslog_in_json.log" perm(0666) template("{\"@timestamp\": \"$ISODATE\", \"facility\": \"$FACILITY\", \"priority\": \"$PRIORITY\", \"level\": \"$LEVEL\", \"tag\": \"$TAG\", \"host\": \"$HOST\", \"program\": \"$PROGRAM\", \"message\": \"$MSG\"}\n")); };

log { source(s_src); destination(d_json); };

Este arquivo é monitorado por logstash (2.0 beta), que encaminha o conteúdo para elasticsearch (2.0 RC1):

input
{
  file
  {
    path => "/var/log/all_syslog_in_json.log"
    start_position => "beginning"
    codec => json
    sincedb_path => "/etc/logstash/db_for_watched_files.db"
    type => "syslog"
  }

}

output {
    elasticsearch {
        hosts => ["elk.example.com"]
        index => "logs"
    }
}

Eu visualizo os resultados em kibana .

Esta configuração funciona bem, exceto que kibana não expande a message part:

Épossívelajustarqualquerumdoselementosdacadeiadeprocessamentoparapermitiraexpansãodemessages(paraqueseuscomponentesestejamnomesmonívelquepathoutype?

EDIT:conformesolicitado,algumaslinhasde/var/log/all_syslog_in_json.log

{"@timestamp": "2015-10-21T20:14:05+02:00", "facility": "auth", "priority": "info", "level": "info", "tag": "26", "host": "eu2", "program": "sshd", "message": "Disconnected from 10.8.100.112"}
{"@timestamp": "2015-10-21T20:14:05+02:00", "facility": "authpriv", "priority": "info", "level": "info", "tag": "56", "host": "eu2", "program": "sshd", "message": "pam_unix(sshd:session): session closed for user nagios"}
{"@timestamp": "2015-10-21T20:14:05+02:00", "facility": "authpriv", "priority": "info", "level": "info", "tag": "56", "host": "eu2", "program": "systemd", "message": "pam_unix(systemd-user:session): session closed for user nagios"}
    
por WoJ 21.10.2015 / 19:27

1 resposta

1

Acredito que você esteja usando o codec errado em sua entrada, você precisa usar json_lines, de os documentos :

If you are streaming JSON messages delimited by \n then see the json_lines codec.

Use este codec . Alternativamente, você poderia ignorar o codec na entrada e enviá-los através de um filtro json, que é como eu sempre faço isso.

filter {
    json {
        source => "message"
    }
}
    
por 06.12.2015 / 12:03