【发布时间】: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。