Java日志记录: console vs.文件输出

标签 java logging

我有一个关于 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 个用户文件夹。
但在文件中:已注册{0} 个用户文件夹。

如何解决这些问题?

编辑:
好的,这是解决方案,我找到了一个链接,显示如何访问记录器的默认控制台处理程序: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.");

知道如何做到这一点吗?

最佳答案

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 方法的评论:

public abstract String format(LogRecord record)

Format the given log record and return the formatted string.

The resulting formatted String will normally include a localized and formatted version of the LogRecord's message field. It is recommended to use the formatMessage(java.util.logging.LogRecord) convenience method to localize and format the message field.

关于Java日志记录: console vs.文件输出,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25597916/

相关文章:

java - 如何获取特定列中使用的行数

java - 通过socket将asn1数据从客户端发送到服务器

java - 将一个Map分配给ImmutableMap后,如何停止或限制重新分配另一个Map

java - 如何在 Java 中从单词 (sWord) 中删除设定的字符串?

java - 我应该把 ACRA.init(this); 放在哪里?

java - 在 Spring Boot 应用程序中使用 AOP 记录方法调用及其参数

java - Java Logger 和 System.out.println 有什么区别

java - 在配置文件中创建 map

ruby-on-rails - 防止 Sidekiq 在测试中打印 "(...) INFO: Sidekiq client with redis options {}"

java - JdbcTemplate — 记录数据源连接 url