java - Log4J 的默认 MessageFactory 是什么

标签 java logging log4j log4j2

org.apache.logging.log4j.Logger 的文档说

   /**
     * Logs a message with parameters at the given level.
     *
     * @param level the logging level
     * @param message the message to log; the format depends on the message factory.
     * @param params parameters to the message.
     * @see #getMessageFactory()
     */
    void log(Level level, String message, Object... params);

但是:

  1. 当我没有设置时使用哪个 MessageFactory?
  2. 哪种消息格式使用默认工厂?
  3. 如果默认工厂无法满足我的需求,我该如何设置自己的工厂?

更新:

请在答案中添加类名和 XML 元素名。如果没有适当的搜索词,很难在 Google 上找到有关 Log4J 2.x 的任何信息。

最佳答案

  1. 如果您不设置消息工厂,则默认使用 ParameterizedMessageFactory
  2. 默认情况下,log4j 为参数化消息使用消息工厂,因此您可以执行 logger.warn("hello {}", user.getName());
  3. 当您获得记录器时,您可以通过调用 LogManager.getLogger(name, messageFactory) 来设置您自己的工厂。

如果您想要 String.format 类型的参数(System.out.printf 格式),您可以使用 LogManager.getLogger(MyClass.class, new StringFormatterMessageFactory()) 来获取记录器。

如果您最常见的用法是参数化消息({} 格式),但如果您偶尔想要更多地控制字符串格式化程序提供的输出格式,您可以正常声明您的记录器(因此它使用 {} 参数化消息),并使用 Logger.printf 方法。

例子:

class MyClass {
    private static Logger logger = LogManager.getLogger(MyClass.class);

    public void someMethod() {
        // use printf here to precisely control the number of digits displayed
        logger.printf(Level.INFO, "pi: %.5f", Math.PI);
    }
}

这一切都在代码中。不涉及配置(XML 或其他)。

关于java - Log4J 的默认 MessageFactory 是什么,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25845120/

相关文章:

Python - 在调用它的模块中的函数内部使用记录器

shell - ssh session 的日志命令

java - 使用 Spring 配置文件的 JBoss 7 多个 log4j 配置

java - EnhancedPatternLayout 和 PatternLayout 之间的主要区别是什么?

java - 以编程方式设置时,广告尺寸和广告单元 ID 必须在 loadAd 之前设置

java - 在按钮单击事件上从表格布局获取值时出错

java - 如何使用 webdriver/Java 检查字段旁边的增加计数?

ruby-on-rails - 抑制特定 ActiveRecord 请求的 Rails 日志记录

java - 如何定期调用 asyncTasks

使用 play dist 出现 java.io.FileNotFoundException