web-dev-qa-db-ja.com

属性としてメッセージパラメータを使用してJSONオブジェクトを作成するログバックレイアウトはありますか?

パラメーター化された文字列メッセージを含むJSONオブジェクトとしてLogglyにログイベントを送信したい。私たちのプロジェクトには現在、次のような多くのコードがあります。

String someParameter = "1234";
logger.log("This is a log message with a parameter {}", someParameter);

現在、SLF4JバックエンドとしてLogbackを使用し、Logbackの JsonLayout を使用してILogEventオブジェクトをJSONにシリアル化します。その結果、ログイベントがLogglyに出荷されるまでに、次のようになります。

{
    "message": "This is a log message with a parameter 1234",
    "level": INFO,
    ....
}

これは機能しますが、messageのすべての値に対して異なるsomeParameter文字列を送信し、Logglyの自動フィルターを使用できない状態にします。

代わりに、次のようなJSONを作成するレイアウトが必要です。

{
    "message": "This is a log message with a parameter {}",
    "level": INFO,
    "parameters": [
        "1234"
    ]
}

この形式により、LogglyはsomeParameterの値に関係なく、メッセージThis is a log message with a parameterを含むすべてのログイベントをグループ化できます。

LogstashのKVフィルター は次のように見えます-ILogEventオブジェクトのカスタムシリアル化を実行する独自のレイアウトを書く以外に、Logbackでこのタスクを達成する方法はありますか?

26
MusikPolice

マップされた診断コンテキスト を使用して、logglyで一度フィルタリングできるログメッセージのタイプごとにスタンプを設定できます。

JsonLayout のソースによると、スタンプはJSONに個別の値として保存されます。

5
muttonUp

Logback用のJSON logstashエンコーダーがあります logstash-logback-encoder

18
Mark Roper

だから私は実行時間を記録しようとしていたので、ExecutionTimeという名前、メソッド、クラス、期間でpojoを作成しました。

その後、作成できました。

ExecutionTime time = new ExecutionTime("Controller Hit", methodName, className, sw.getTotalTimeMillis());

ロギングには次に使用しました:

private final Logger logger = LoggerFactory.getLogger(this.getClass());
logger.info(append("metric", time), time.toString());

次のものがあることを確認してください。

import static net.logstash.logback.marker.Markers.append;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

これにより、次のようなログが記録されます。

{  
   "ts":"2017-02-16T07:41:36.680-08:00",
   "msg":"ExecutionTime [name=Controller Hit, method=setupSession, className=class com.xxx.services.controllers.SessionController, duration=3225]",
   "logger":"com.xxx.services.metrics.ExecutionTimeLogger",
   "level":"INFO",
   "metric":{  
      "name":"Controller Hit",
      "method":"setupSession",
      "className":"class com.xxx.services.controllers.SessionController",
      "duration":3225
   }
}

Logback-spring.xmlを使用してログをjsonに出力していたため、別の設定になる可能性があります。

<?xml version="1.0" encoding="UTF-8"?>
<configuration>
    <include resource="org/springframework/boot/logging/logback/base.xml"/>
    <property name="PROJECT_ID" value="my_service"/>
    <appender name="FILE" class="ch.qos.logback.core.rolling.RollingFileAppender">
        <File>app/logs/${PROJECT_ID}.json.log</File>
        <encoder class="net.logstash.logback.encoder.LogstashEncoder">
            <fieldNames>
                <timestamp>ts</timestamp>
                <message>msg</message>
                <thread>[ignore]</thread>
                <levelValue>[ignore]</levelValue>
                <logger>logger</logger>
                <version>[ignore]</version>
            </fieldNames>
        </encoder>
        <rollingPolicy class="ch.qos.logback.core.rolling.FixedWindowRollingPolicy">
            <maxIndex>10</maxIndex>
            <FileNamePattern>app/logs/${PROJECT_ID}.json.log.%i</FileNamePattern>
        </rollingPolicy>
        <triggeringPolicy class="ch.qos.logback.core.rolling.SizeBasedTriggeringPolicy">
            <MaxFileSize>20MB</MaxFileSize>
        </triggeringPolicy>
    </appender>
    <logger name="com.xxx" additivity="false" level="DEBUG">
        <appender-ref ref="FILE"/>
        <appender-ref ref="CONSOLE"/>
    </logger>
    <root level="WARN">
        <appender-ref ref="FILE"/>
    </root>
</configuration>
8
andrewps

JSON固有のロギングAPIを提供し、SLF4Jで動作する最近作成されたプロジェクトは次のとおりです。

https://github.com/savoirtech/slf4j-json-logger

4
ash

既に回答したように、MDCで1次元JSONツリーを取得するか、logstash-logback-encoderでマーカーを使用します。

以下も探している場合:

  • ログに記録されたデータタイプのキーとタイプの定義のためのコードブック、
  • ログ集計ツールの構成(elasticsearchなど)
  • 生成されたJava効率的で正しいロギングのためのヘルパーコード

次に、作成したプロジェクト json-log-domain を試してください。上記の生成元となる単純なYAML形式の定義を定義します。

ヘルパーコードステートメントの例は

logger.info(Host("localhost").port(8080), "Hello world");

生成されたマークダウンは this のようなものを望みます。

1
ThomasRS