現在、すべての出力をログ ファイルに書き込む必要があるプログラムに取り組んでいます。
指定したのと同じ順序で、レベル、メッセージ、オブジェクト値、別のメッセージ、整数値、別のメッセージ、別の整数値を出力するログ メソッドを作成する必要があります。これを行うログメソッドが見つからないようです。を使用してJava.util.logging
います。これは可能ですか?
現在、すべての出力をログ ファイルに書き込む必要があるプログラムに取り組んでいます。
指定したのと同じ順序で、レベル、メッセージ、オブジェクト値、別のメッセージ、整数値、別のメッセージ、別の整数値を出力するログ メソッドを作成する必要があります。これを行うログメソッドが見つからないようです。を使用してJava.util.logging
います。これは可能ですか?
以下の形式のログ形式が必要だと思います 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());
とにかく、これはかなり古いトピックです。私の 2 セントです。なぜなら、私は自分のプロジェクトで java.util.logging.Logger` を十分に使用することも好むからです。
ラムダは、アプリケーション全体で再利用するメリットがない限り、複数のカスタム パラメーター用の定型的な Formatter 拡張機能を多かれ少なかれ時代遅れにします。(私の) 単純なシナリオでは、ログ メッセージは挿入されるコード部分に合わせて調整されるため、String.format()
通常ははるかに簡単で柔軟です。
Java 8とラムダの前Formatter
は、メッセージの構築を延期する唯一の方法でした。唯一の代替手段loggable
は、レベルに基づくチェックが行われる前に、事前にログに記録するメッセージを作成することでした。
Java 8 lambdasでは、文字列の書式設定をチェック後に延期できloggable
ますが、元のメソッド コンテキストには引き続きアクセスできます。唯一の小さな欠点は、ラムダの制限により、アクセスされるすべてのフィールドが final である必要があることです。
ここにかなり単純なスニペットがあります:
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)
);
これが、組み込みのロギングを使用したい人にも役立つことを願っています:-)
乾杯ベン