こんにちは、アプリケーションでJavaロギングを実装しようとしています。2つのハンドラーを使用します。ファイルハンドラーと独自のコンソールハンドラー。両方のハンドラーが正常に動作します。ファイルとコンソール。ログはデフォルトのコンソールハンドラにも送信されますが、これは不要です。コードを実行すると、余分な2行がコンソールに送信されます。デフォルトのコンソールを使用したくないハンドラー:既定のコンソールハンドラーを無効にする方法を知っている人はいますか?作成した2つのハンドラーのみを使用します。
Handler fh = new FileHandler("test.txt");
fh.setFormatter(formatter);
logger.addHandler(fh);
Handler ch = new ConsoleHandler();
ch.setFormatter(formatter);
logger.addHandler(ch);
import Java.util.Date;
import Java.util.logging.ConsoleHandler;
import Java.util.logging.FileHandler;
import Java.util.logging.Formatter;
import Java.util.logging.Handler;
import Java.util.logging.Level;
import Java.util.logging.LogManager;
import Java.util.logging.LogRecord;
import Java.util.logging.Logger;
public class LoggingExample {
private static Logger logger = Logger.getLogger("test");
static {
try {
logger.setLevel(Level.INFO);
Formatter formatter = new Formatter() {
@Override
public String format(LogRecord arg0) {
StringBuilder b = new StringBuilder();
b.append(new Date());
b.append(" ");
b.append(arg0.getSourceClassName());
b.append(" ");
b.append(arg0.getSourceMethodName());
b.append(" ");
b.append(arg0.getLevel());
b.append(" ");
b.append(arg0.getMessage());
b.append(System.getProperty("line.separator"));
return b.toString();
}
};
Handler fh = new FileHandler("test.txt");
fh.setFormatter(formatter);
logger.addHandler(fh);
Handler ch = new ConsoleHandler();
ch.setFormatter(formatter);
logger.addHandler(ch);
LogManager lm = LogManager.getLogManager();
lm.addLogger(logger);
} catch (Throwable e) {
e.printStackTrace();
}
}
public static void main(String[] args) {
logger.info("why does my test application use the standard console logger ?\n" + " I want only my console handler (Handler ch)\n " + "how can i turn the standard logger to the console off. ??");
}
}
デフォルトのコンソールハンドラーはルートロガーに接続されます。これは、ユーザーを含む他のすべてのロガーの親です。だから私はあなたの問題を解決する2つの方法を見ます:
これがこの特定のクラスにのみ影響する場合、最も簡単な解決策は、親ロガーへのログの受け渡しを無効にすることです。
logger.setUseParentHandlers(false);
アプリ全体でこの動作を変更する場合は、独自のハンドラーを追加する前に、ルートロガーからデフォルトのコンソールハンドラーを完全に削除できます。
Logger globalLogger = Logger.getLogger("global");
Handler[] handlers = globalLogger.getHandlers();
for(Handler handler : handlers) {
globalLogger.removeHandler(handler);
}
注:他のクラスでも同じログハンドラーを使用する場合、最良の方法は、長期的にログ構成を構成ファイルに移動することです。
ただやる
LogManager.getLogManager().reset();
これは奇妙ですが、Logger.getLogger("global")
は私のセットアップでは動作しません(Logger.getLogger(Logger.GLOBAL_LOGGER_NAME)
と同様)。
ただし、Logger.getLogger("")
はうまく機能します。
この情報が誰かにも役立つことを願っています...
構成をリセットし、ルートレベルをOFFに設定します
LogManager.getLogManager().reset();
Logger globalLogger = Logger.getLogger(Java.util.logging.Logger.GLOBAL_LOGGER_NAME);
globalLogger.setLevel(Java.util.logging.Level.OFF);
親ロガーまでメッセージを送信しないようにロガーに指示する必要があります。
...
import Java.util.logging.*;
...
Logger logger = Logger.getLogger(this.getClass().getName());
logger.setUseParentHandlers(false);
...
ただし、これはロガーにハンドラーを追加する前に行う必要があります。