【问题标题】:java.util.logging: how to suppress date linejava.util.logging:如何抑制日期线
【发布时间】:2011-02-26 09:36:38
【问题描述】:

在使用 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... 行,它们只会使我的日志输出变得混乱。我该怎么做?

【问题讨论】:

  • 输出格式取决于所使用的格式化程序。 java.sun.com/j2se/1.4.2/docs/api/java/util/logging/…。你能指定什么是你的并发布它的配置吗?
  • 这里是example,关于如何实现自定义格式化程序
  • Anton,我在 jdk 1.6 中使用 java.util.logging.SimpleFormatter。我尝试创建一个简单的格式化程序并覆盖它的 format(LogRecord) 方法,但这没有帮助。
  • Bozho,我在哪里可以找到 .properties 文件?它应该包含哪些与日志记录相关的内容?

标签: java logging java.util.logging


【解决方案1】:

编写自定义格式化程序扩展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");
    }
}

【讨论】:

  • 我会试一试,但是当我上次尝试类似的东西时它不起作用。
  • 除此之外还需要遵循以下安德鲁的回答:)
  • 格式化程序是最终的。
【解决方案2】:

问题是由父日志中的处理程序引起的。解决方案是从父日志中删除所有处理程序,然后添加自己的自定义处理程序。此代码从父日志中删除处理程序:

for(处理程序 iHandler:log.getParent().getHandlers()) { log.getParent().removeHandler(iHandler); }

【讨论】:

  • 也可以使用log.setUseParentHandlers(false);
【解决方案3】:

从 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

【讨论】:

  • 你拯救了我们的一天,谢谢伙计。作为记录,如果您使用的是 Tomcat,您也可以在 /etc/tomcat/logging.properties 下更改此设置,您无需更改全局 Java 设置。
  • 如果您想以编程方式执行此操作,请在此处查看答案:stackoverflow.com/questions/194765/…
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-06-28
相关资源
最近更新 更多