web-dev-qa-db-ja.com

複数のパラメーターを使用したロギング

現在、すべての出力をログファイルに書き込む必要があるプログラムに取り組んでいます。

レベル、メッセージ、オブジェクト値、別のメッセージ、整数値、別のメッセージ、別の整数値を指定した順序で出力するログメソッドを記述する必要があります。私はこれを行うログメソッドを見つけることができないようです。私は使っている Java.util.logging。これは可能ですか?

14
Gash87

以下の形式のログ形式が必要だと思いますFINE、Message1、object.GetValue()、Message2,1、Message3,2

出力メッセージ形式を作成する必要があります

logger.log(Level.INFO, "{0},{1},{2},{3},{4},{5}",new Object[]{Message1,object.getValue(),Message2,1,Message3,2});

次に、Formatterクラスを拡張してカスタムフォーマッターを作成する必要があります

public class DataFormatter extends Formatter {

@Override
public synchronized String format(LogRecord record) {
    String formattedMessage = formatMessage(record);
    String throwable = "";
    String outputFormat = "%1$s, %2$s \n %3$s"; //Also adding for logging exceptions
    if (record.getThrown() != null) {
        StringWriter sw = new StringWriter();
        PrintWriter pw = new PrintWriter(sw);
        pw.println();
        record.getThrown().printStackTrace(pw);
        pw.close();
        throwable = sw.toString();
    }
    return String.format(outputFormat,record.getLevel().getName(),formattedMessage,throwable);
}
}

新しく作成したフォーマッターを設定します

    for(int i=0;i<logger.getHandlers().length;i++)
        logger.getHandlers()[i].setFormatter(new DataFormatter());
22
Rohit

ともかく、私の2セントという非常に古いトピックです。プロジェクトでJava.util.logging.Logger`を使用することも好きだからです。

アプリケーション全体での再利用の恩恵を受けない限り、ラムダは、複数のカスタムパラメータに対するこの定型的なFormatter拡張機能を多かれ少なかれ廃止します。 (私の)単純なシナリオでは、ログメッセージは挿入されたコード部分に合わせて調整されるため、通常、String.format()ははるかに簡単で柔軟です。

Before Java 8 and lambdas、Formatterのみがメッセージ構築を延期することができました。唯一の alternativeは、レベルに基づいてloggableチェックが行われる前に、事前にログに記録するメッセージを作成することでした。
Java 8ラムダを使用すると、loggableチェック後に文字列のフォーマットを延期できますが、元のファイルにアクセスできますメソッドコンテキスト:唯一の小さな欠点は、ラムダの制限により、アクセスされるすべてのフィールドが最終である必要があることです。

ここにかなり単純なスニペット:

final String val1 = "lambda expression log message";
final Level level = Level.INFO;
Logger.getGlobal().log(level, () -> 
        String.format("Hello, I'm a %s, evaluated after %s loggable check.", val1, level)
);
Logger.getGlobal().log(level, new RuntimeException(), () -> 
        String.format("Hello, I'm a %s with a stack trace, evaluated after %s loggable check.", val1, level)
);

これが組み込みのロギングも使用したい人の助けになることを願っています:-)

乾杯ベン

10
Ben Steinert

Slf4jロガーの使用中に以下のコードを使用しました-

logger.error("Error while finding A from DB. a : {} and b : {}", a,b);
logger.info("Nothing found in db for A with a : {} and b : {}",a,b);
8
Sanchi Girotra