20

java.util.loggingでデフォルトのロガーを使用しているときに、ロギング中に日付変更線の出力を抑制しようとしています。たとえば、次のような典型的な出力があります。

2010年6月1日10:18:12AMgamma.utility.application情報

情報:ping:db-time = 2010-06-01 10:18:12.0、local-time = 20100601t101812、duration = 180000
2010年6月1日10: 21:12 AM gamma.utility.application info
INFO:ping:db-time = 2010-06-01 10:21:12.0、local-time = 20100601t102112、duration = 180000

行を削除したいのですがJun 1, 2010...、ログ出力が乱雑になっています。これどうやってするの?

4

3 に答える 3

32

Java SE 7から、新しいシステムプロパティjava.util.logging.SimpleFormatter.formatがあります。

同じプロパティは、java.util.loggingプロパティファイル(logging.properties)でも構成できます。Eclipseユーザーであり、コンソール出力の二重行メッセージに悩まされている場合は、次のようにjre logging.propertiesファイル(JDK_HOME / jre / lib / logging.properties)を変更できます。

java.util.logging.SimpleFormatter.format =%4 $ s:%5 $ s [%1 $ tc]%n

いくつかのフォーマット例は、http://docs.oracle.com/javase/7/docs/api/index.html?java / util / logging/SimpleFormatter.htmlから入手できます。

于 2012-05-23T14:39:40.983 に答える
14

この問題は、親ログのハンドラーが原因で発生します。解決策は、親ログからすべてのハンドラーを削除してから、独自のカスタムハンドラーを追加することです。このコードは、親ログからハンドラーを削除します。

      for(Handler iHandler:log.getParent()。getHandlers())
        {{
        log.getParent()。removeHandler(iHandler);
        }
于 2010-06-03T06:32:13.640 に答える
5

java.util.logging.Formatterクラスを拡張するカスタムフォーマッタを作成String format(LogRecord)し、必要に応じてメソッドを実装します。たとえば、次のフォーマッタはログメッセージ(および例外がログに記録されている場合はスロー可能なスタックトレース)のみを表示します。

import java.io.PrintWriter;
import java.io.StringWriter;
import java.util.logging.Formatter;
import java.util.logging.LogRecord;

class CustomRecordFormatter extends Formatter {
    @Override
    public String format(final LogRecord r) {
        StringBuilder sb = new StringBuilder();
        sb.append(formatMessage(r)).append(System.getProperty("line.separator"));
        if (null != r.getThrown()) {
            sb.append("Throwable occurred: "); //$NON-NLS-1$
            Throwable t = r.getThrown();
            PrintWriter pw = null;
            try {
                StringWriter sw = new StringWriter();
                pw = new PrintWriter(sw);
                t.printStackTrace(pw);
                sb.append(sw.toString());
            } finally {
                if (pw != null) {
                    try {
                        pw.close();
                    } catch (Exception e) {
                        // ignore
                    }
                }
            }
        }
        return sb.toString();
    }
}

これがあなたの使い方です:

import java.util.logging.ConsoleHandler;
import java.util.logging.Logger;

class A {
    private static final Logger LOGGER = Logger.getLogger(A.class.getName());

    static {
        CustomRecordFormatter formatter = new CustomRecordFormatter();
        ConsoleHandler consoleHandler = new ConsoleHandler();
        consoleHandler.setFormatter(formatter);
        LOGGER.addHandler(consoleHandler);
    }

    public void doSomething() {
        LOGGER.info("something happened");
    }
}
于 2010-06-01T16:47:34.310 に答える