【问题标题】:Java Logging: console vs. file outputJava 日志记录:控制台与文件输出
【发布时间】:2014-09-01 01:47:23
【问题描述】:

我有一个关于java.util.Logger 的问题。 我设置了文件处理程序并更改了这样的格式:

Logger logger = Logger.getLogger("TotalLog");
FileHandler fh = new FileHandler("log/total.%g.log", 5242880, 20, true);
fh.setFormatter(new Formatter() {

  @Override
  public String format(LogRecord record) {
    return new Date(record.getMillis()) + " " + record.getLevel() + ": " + record.getMessage() + "\n";
  }
});

logger.addHandler(fh);
logger.log(Level.INFO, "****************************************");

问题是格式化程序会影响日志文件。但是控制台没有以这种格式显示消息。此外,这样的代码在控制台中有效,但在文件中无效。

logger.log(Level.INFO, "{0} user folders registered.", userfolders.size());

这意味着在控制台上打印:4 user folders registered.
但存档:{0} user folders registered.

我该如何解决这些问题?

编辑
好的,这是解决方案,我找到了一个链接,显示如何访问记录器的默认控制台处理程序:logging in java

所以我没有创建一个匿名类,而是创建了一个名为LogFormatter的新类:

public class LogFormatter extends Formatter {
  @Override
  public String format(LogRecord record) {
    return new Date(record.getMillis()) + " " + record.getLevel() + ": " + record.getMessage() + "\n";
  }
}

并且稍微修改了代码:

Logger logger = Logger.getLogger("TotalLog");
FileHandler fh = new FileHandler("log/total.%g.log", 5242880, 20, true);
fh.setFormatter(new LogFormatter());
logger.addHandler(fh);
logger.getParent().getHandlers()[0].setFormatter(new LogFormatter());
logger.log(Level.INFO, "****************************************");

不过,我还是不知道如何进行参数化日志记录。同时我将代码替换为:

logger.log(Level.INFO, userfolders.size() + " user folders registered.");

知道怎么做吗?

【问题讨论】:

  • 你为什么要为此编写代码?您可以配置格式模式(甚至以编程方式)以实现相同的结果。事实上,你可能打破了替换逻辑。
  • 默认日志看起来像这个 DATE CLASS : METHOD LEVEL: MESSAGE 但是我需要这种格式 DATE LEVEL: MESSAGE
  • 一些格式字符串的例子:docs.oracle.com/javase/7/docs/api/java/util/logging/… 但是java.util.Logging 是相当痛苦的。我建议改用 SLF4J。

标签: java logging


【解决方案1】:

Formatter 类中调用formatMessage(或根据需要复制和调整),例如:

public class LogFormatter extends Formatter {
  @Override
  public String format(LogRecord record) {
    return new Date(record.getMillis()) + " " + record.getLevel() + ": " + super.formatMessage(record) + "\n";
  }
}

http://docs.oracle.com/javase/7/docs/api/java/util/logging/Formatter.html 上查看format 方法的评论:

公共抽象字符串格式(LogRecord记录)

格式化给定的日志记录并返回格式化后的字符串。

生成的格式化字符串通常包含一个本地化和 LogRecord 的消息字段的格式化版本。推荐 使用 formatMessage(java.util.logging.LogRecord) 方便 方法来本地化和格式化消息字段。

【讨论】: