20

在 java.util.logging 中使用默认记录器时,我试图在日志记录期间抑制日期行的输出。例如,这是一个典型的输出:

2010 年 6 月 1 日上午 10:18:12 gamma.utility.application 信息

信息:ping:db-time=2010-06-01 10:18:12.0,本地时间=20100601t101812,持续时间=180000
2010 年 6 月 1 日 10:上午 21:12 gamma.utility.application 信息
信息:ping:db-time=2010-06-01 10:21:12.0,本地时间=20100601t102112,持续时间=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(处理程序 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 回答