4

これは私がやろうとしていることです:

Logger logger = LogManager.getLogManager().getLogger(Logger.GLOBAL_LOGGER_NAME);
ByteArrayOutputStream stream = new ByteArrayOutputStream();
Handler handler = new StreamHandler(stream, new SimpleFormatter());
logger.addHandler(handler);
org.slf4j.LoggerFactory.getLogger("com.example").info("foo");
logger.removeHandler(handler);
assert stream.toString().contains("foo");

SLF4J と JUL の混合です。streamスクリプトの最後は空です。なんで?

4

1 に答える 1

0

レコードがフォーマットされている場合、StreamHandler はフォーマッタの「head」のみを書き込みます。ハンドラーがクローズされている場合、条件付きで「head」と「tail」が書き込まれます。これはすべて、StreamHandler によって LogRecord が消費されなかったことを示しているようです。SimpleFormatter は先頭と末尾の両方に空の文字列を使用するため、トラブルシューティングには役立ちません。

  1. すべてのロガー、アペンダー、およびハンドラーのレベル/優先度をチェックし、それらが正しく設定されていることを確認します。
  2. LogManager の代わりに Logger.getLogger(Logger.GLOBAL_LOGGER_NAME) を使用します。
  3. ロガーを保持するには、静的な最終参照を使用します。
  4. ハンドラーで close を呼び出します。
  5. 先頭と末尾の出力があるため、XMLFormatter を使用してトラブルシューティングを行います。
  6. slf4j + java.util.loggingを読む: 設定方法は?
于 2014-05-23T20:47:06.397 に答える