web-dev-qa-db-ja.com

ログデータをJSONとしてelasticsearchに転送する前にフォーマットするにはどうすればよいですか?

システム上のすべてのイベントをsyslog-ngを介してJSONファイルに記録します。

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); };

このファイルは、コンテンツをlogstash(2.0 RC1)に転送するelasticsearch(2.0ベータ)によって監視されます。

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"
    }
}

次に、結果をkibanaで視覚化します。

この設定は、kibanamessage部分を展開しないことを除いて正常に機能します。

enter image description here

処理チェーンの要素のいずれかを微調整して、messagesの拡張を有効にすることは可能ですか(そのコンポーネントがpathまたはtypeと同じレベルになるように)。

編集:要求に応じて、/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"}
2
WoJ

入力に間違ったコーデックを使用していると思います。 ドキュメント からjson_linesを使用する必要があります。

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

代わりに このコーデック を使用してください。または、入力のコーデックを無視して、jsonフィルターを介して送信することもできます。これは私がいつも行っている方法です。

filter {
    json {
        source => "message"
    }
}
2
Rumbles