log 4 jにjson形式のlogを生成する方法

2775 ワード

詳細
Javaを使用してプロジェクトを開発する場合、logログは一般的にアプリケーションの不可欠な一部であり、ほとんどの場合、私たちのlogファイルは一般的なテキスト情報であり、levelによって異なるレベルのログをマークします.
ログの目的は、主に問題が発生したときに追跡する方法があり、中から原因を調べるのが便利で、データ量が小さいときにlinux上の各種shellコマンド、例えばawk、grepを通じて迅速に検索したり、簡単な統計をしたりすることができ、データ量があるとき、プログラム自体が分散しているとき、このような方法は少し骨が折れる.たとえば、10台のマシンを持っている場合は、クエリーごとにログインする必要があります.非常に煩雑で、データ量が大きい場合はlinuxコマンドの効率が非常に低い可能性があります.だからこの时私达は専门のログ分析のツールを使って処理する必要があって、ELKスイートを使うことを推荐して、ログのクエリーの分析の统计に対してとても得意で、最も重要なのはオープンソースです.
ElasticSearchは標準的なjson構造のデータをサポートし、インデックスを直接構築するが、多くの場合、私たちのlogファイルは普通のテキストであり、esに直接挿入することはできない.生成されたlogは直接json形式であり、logstashによってesを直接挿入すればよく、具体的なビジネスフィールドに注目する必要がなく、柔軟である.
log 4 jでは直接対応していないjsonのlayoutです.ここでlayoutを説明します.layoutはログコンポーネントで最終結果を文字列にレンダリングするクラスです.カスタムフォーマットが必要な場合は、layoutというクラスを継承し、formatメソッドを書き直して最終的なログ出力フォーマットを完了する必要があります.
log 4 jは直接jsonフォーマットをサポートしていませんが、logstash公式サイトにはサポートプロジェクトjsonevent-layoutが提供されています.もう何年も更新されていませんが、簡単な間に合わせはまだ使えます.機能はlog 4 jの印刷情報をjson形式に変換し、logstashでesに直接挿入できるようにする方法です.
github: https://github.com/logstash/log4j-jsonevent-layout
まずmavenに次のpom依存を導入します.



    net.logstash.log4j
    jsonevent-layout
    1.7



log 4 j.propertiesで簡単に構成できます.

#log4j.rootLogger=INFO,console,kafka
log4j.rootLogger=INFO,console

# appender console
log4j.appender.console=org.apache.log4j.ConsoleAppender
log4j.appender.console.target=System.out
log4j.appender.console.layout=net.logstash.log4j.JSONEventLayout

最終的に印刷されるlog形式は次のとおりです.

{"@timestamp":"2017-09-15T09:08:50.805Z","source_host":"USER-20160722CY","file":"TestJson.java","method":"main","level":"INFO","line_number":"39","thread_name":"main","@version":1,"logger_name":"TestJson","message":"log  ","class":"net.logstash.log4j.TestJson","mdc":{}}

上のlogは標準的なjsonフォーマットのほか、ELKの中に特需のタイムスタンプフィールド@timestampがあります.このフィールドは必要で、フォーマットはesがサポートするフォーマットでなければなりません.そうしてこそ、logstashを通じてesに直接挿入することができます.
まとめ:
logstash公式サイトのjsonevent-layoutを使用すると、log 4 jの出力情報を直接jsonに変換することができますが、log.info()メソッドでMapクラスに転送されたkvがjsonで生成されるか、infoメソッドでJSONオブジェクトに直接転送されるなど、カスタムフィールドをjsonに追加することはできません.私たちのアプリケーションでは、特定のフィールドをjsonに追加する必要がある場合があります.後続の統計分析を容易にする必要があります.例えば、私には時間のかかるフィールドがあります.現在、jsonevent-layoutは満足していません.そのため、layoutをカスタマイズしてこのような機能を実現する必要があります.これは後述の文章で共有されます.