Logstashで複数の異種入力を処理するにはどうすればよいですか?


95

技術ログやビジネスログなど、2つの非常に異なるタイプのログがあり、必要な場合を考えてみましょう。

  • 生の技術ログは、gelf出力を使用してgraylog2サーバーにルーティングされます。
  • jsonビジネスログは、専用のelasticsearch_http出力を使用してelasticsearchクラスターに保存されます。

Syslog-NGたとえば、構成ファイルを使用すると、ディスパッチされる前に個別に処理できるいくつかの異なる入力を定義できることがわかります。何をLogstash行うことができないようです。1つのインスタンスが2つの特定の構成ファイルで開始できる場合でも、すべてのログは同じチャネルを使用し、同じ処理が適用されます...

さまざまなタイプのログと同じ数のインスタンスを実行する必要がありますか?


2
あなたはベン・リムの正解を受け入れるべきです!
ベンウィーラー

回答:


191

さまざまなタイプのログと同じ数のインスタンスを実行する必要がありますか?

番号!異なるタイプのログを処理するために実行できるインスタンスは1つだけです。

logstash構成ファイルでは、各入力を異なるタイプで指定できます。次に、フィルターでifを使用してさまざまな処理を区別し、出力で別の宛先への「if」出力を使用できます。

input {
    file {
            type => "technical"
            path => "/home/technical/log"
    }
    file {
            type => "business"
            path => "/home/business/log"
    }
} 
filter {
    if [type] == "technical" {
            # processing .......
    }
    if [type] == "business" {
            # processing .......
    }
}
output {
    if [type] == "technical" {
            # output to gelf
    }
    if [type] == "business" {
            # output to elasticsearch
    }
}

これがあなたに役立つことを願っています:)


1
フィルターおよび出力定義でtype属性を(同じtype => "value"構文で)使用することもできます。これにより、構成ファイル内の追加のフォーマットが少し削減されます。例:gist.github.com/fairchild/3030472ドキュメントごと:この入力で処理されるすべてのイベントに「type」フィールドを追加します。タイプは主にフィルターのアクティブ化に使用されます。タイプはイベント自体の一部として保存されるため、タイプを使用してWebインターフェースでタイプを検索することもできます。
Tony Cesaro、2014年

5
まあ、それはベンが提供したものが実際にこれを行うための新しい方法のようです。type => "value"出力で使用すると、次のメッセージが表示されました。「stdoutで設定されている非推奨の構成設定「type」を使用しています。非推奨の設定は引き続き機能しますが、将来logstashから削除される予定です。新しい条件文での同じ動作、たとえば:if [type] == "sometype" { stdout { ... } }」以前のコメントを取り消します。:)
トニー・チェザロ2014年

type入力からのタイプフィールドがすでにある場合、属性は適用されないことに注意してください。これはオーバーライドしない特別な属性であり、文書化されています。Elasticでチケットを開いたところ、代わりに、tagsまたはadd_fieldtype
BornToCode

@BornToCode、よくわかりません。あなたはベンのコードに何か問題があると言っていますか?または、ログのパスが同じファイルである場合は機能しませんか?それが機能しないシナリオは何ですか?
ベンウィーラー

2
@BenLim OPはあなたの回答を受け入れませんでしたが、私はそれが最も役に立ち、あなたに賛成票を投じました。
bigbadmouse

15

複数のファイル入力にタグを使用しました:

input {
    file {
        type => "java"
        path => "/usr/aaa/logs/stdout.log"
        codec => multiline {
            ...
        },
        tags => ["aaa"]
    }

    file {
        type => "java"
        path => "/usr/bbb/logs/stdout.log"
        codec => multiline {
                ...
        }
        tags => ["bbb"]
    }
}
output {
    stdout {
        codec => rubydebug
    }
    if "aaa" in [tags] {
        elasticsearch {
            hosts => ["192.168.100.211:9200"]
            index => "aaa"
            document_type => "aaa-%{+YYYY.MM.dd}"
        }
    }

    if "bbb" in [tags] {
        elasticsearch {
            hosts => ["192.168.100.211:9200"]
            index => "bbb"
            document_type => "bbb-%{+YYYY.MM.dd}"
        }
    }
}

これは受け入れられた回答よりも優れています。logstashで複数のファイルビート入力を許可します。このような場合、「type」プロパティは「log」に設定され、変更できません。
レジスB.18年

しかし、これは最後のタグ(bbb)でタグを上書きしていませんか?そして再び、if statememtでは、タグが配列または単一の文字列の場合、両方のIFが機能します。したがって、これは論理的には正しくありませんが、logstashにはifの内部に別のロジックがある可能性があります
meso_2600

0

logstashは、入力セクションで2つを超えるファイルを読み取ることができないと思います。以下をお試しください

input {
    file {
            type => "technical"
            path => "/home/technical/log"
    }
    file {
            type => "business"
            path => "/home/business/log"
    }
 file {
            type => "business1"
            path => "/home/business/log1"
    }
} 

うん、同じ「問題」への実行
meso_2600
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.