【问题标题】:Log4j2 is not formatting output like specified / appender is not added I thinkLog4j2 没有像指定的那样格式化输出/我认为没有添加附加程序
【发布时间】:2020-01-28 08:21:53
【问题描述】:

我正在学习在我的应用程序中使用 log4j2。为了配合,我添加了一个带有格式说明符的附加程序和模式布局。但是,输出不符合规范。甚至 INFO 级别的语句也没有被打印出来。 代码:

 public static void main(String[] args) {
        ConfigurationBuilder<BuiltConfiguration> builder=ConfigurationBuilderFactory.newConfigurationBuilder();
        AppenderComponentBuilder appenderBuilder = builder.newAppender("Stdout", "CONSOLE");
        appenderBuilder.add(builder.newLayout("PatternLayout").addAttribute("pattern", "[%c{1}] %m\\n"));
        builder.add(appenderBuilder);

        Logger logger = LogManager.getLogger();
        logger.log(Level.INFO, "This is a first Info log");
        logger.log(Level.INFO, "This is a second Info log");
        logger.log(Level.ERROR, "This is a first Error log");
        logger.log(Level.FATAL, "This is a first fatal log");

    }
  • 我面临的问题是:

    1. 日志输出不符合我指定的模式。我有 尝试更改模式,它仍然以相同的格式打印。
    2. 我添加了四个日志记录语句,其中只打印了两个(ERROR 和 FATAL)。

输出:

  Logging output for pattern ("%m\\n"): 
       14:42:06.046 [main] ERROR loghelper.log4j.Log2Helper - This is a first Error log
    14:42:06.049 [main] FATAL loghelper.log4j.Log2Helper - This is a first fatal log

Logging output for pattern ("%d [%t] %-5level: %msg%n%throwable"): 
        14:41:23.555 [main] ERROR loghelper.log4j.Log2Helper - This is a first Error log
    14:41:23.557 [main] FATAL loghelper.log4j.Log2Helper - This is a first fatal log

【问题讨论】:

  • 你有什么问题?
  • 日志输出不符合我指定的模式。我什至尝试过改变模式,它仍然打印相同。另外,我添加了四个日志语句,其中只打印了两个(ERROR 和 FATAL)。

标签: java logging log4j log4j2


【解决方案1】:

首先,未配置根记录器(默认为错误级别) 因此会打印错误及以上级别的日志。

其次,添加附加程序后构建器没有构建。

    builder.add(appenderBuilder);        

应该更新到

    builder.add(appenderBuilder);
    builder.build();

【讨论】:

  • 我添加了构建语句。还是不行。
【解决方案2】:

Mohit 几乎得到它。即使使用 builder.build(),您所完成的只是创建配置。您实际上并没有告诉 Log4j 使用它。为此,您需要使用

import org.apache.logging.log4j.core.LoggerContext;

LoggerContext loggerContext = (LoggerContext) LogManager.getContext(false);
loggerContext.setConfiguration(configuration);

毕竟我不得不问,既然可以只提供一个文件,为什么还要麻烦编程配置?

【讨论】:

  • 我的配置对象应该是什么? loggerContext.setConfiguration(配置);我没有设置配置/在我的情况下不需要。
  • 如果您不需要配置(即 - 您正在使用文件进行配置或使用默认配置),那么这一切都不是必需的。只需将 log4j2.xml、log4j2.properties 或 log4j2.yaml 放在类路径上,或者将 log4j2.configurationFile 属性设置为文件的位置。
  • 我有理由进行这种编程配置。其项目特定。
  • 那我不明白你关于配置应该是什么的问题。这就是您使用构建器创建的内容。您只是没有使用构建方法来构建它,然后将其传递给 Log4J 使用。
猜你喜欢
  • 2016-07-17
  • 2019-01-19
  • 2013-02-24
  • 2017-04-17
  • 2016-08-16
  • 2023-03-06
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多