Java 获取格式化日志消息

Java 获取格式化日志消息,java,log4j,Java,Log4j,记录消息时,例如: log.error("This is a message"); 消息在登录到文件之前由布局格式化。例如: log.error("This is a message"); 2014-12-12 13:45:18错误这是一条信息 如何以编程方式获取此格式化消息 我将JAVA与log4j一起使用 谢谢 编辑: 我认为一种解决方案是以编程方式生成LoggingEvent并调用我的自定义布局的format方法,但我认为它不会有相同的时间戳。我假设您使用的是log4j 2(没有声誉来

记录消息时,例如:

log.error("This is a message");
消息在登录到文件之前由布局格式化。例如:

log.error("This is a message");
2014-12-12 13:45:18错误这是一条信息

如何以编程方式获取此格式化消息

我将JAVA与log4j一起使用

谢谢

编辑:


我认为一种解决方案是以编程方式生成LoggingEvent并调用我的自定义布局的format方法,但我认为它不会有相同的时间戳。

我假设您使用的是log4j 2(没有声誉来评论要求澄清-对于log4j 1.2,答案会有很大不同)。下面的解决方案为您提供了对字符串对象的编程访问,该对象包含与文件的消息输出完全相同的字符串

在本例中-您可以按如下方式获得实际的格式化字符串:

  • 获取MessageFactory:
    myFactory=Logger.getMessageFactory()
  • 调用
    String formattedCopyOfMessage=myFactory.newMessage(“这是一条消息”).getFormattedString()
  • 这是一个不寻常的用例


    注意-我建议的方法不允许您访问记录器生成的实际对象,它是一个不同的字符串对象,将包含相同的字符串。

    您的问题不清楚。您是指如何以编程方式设置log4j appender的布局吗?如果是这样的话,你可以这样做

      ConsoleAppender console = new ConsoleAppender(); //create appender
      //configure the appender
      String PATTERN = "%d [%p|%c|%C{1}] %m%n";
      console.setLayout(new PatternLayout(PATTERN)); 
      console.setThreshold(Level.FATAL);
      console.activateOptions();
      //add appender to any Logger (here is root)
      Logger.getRootLogger().addAppender(console);
    
    然后,您可以使用删除根记录器上所有现有的appender

     Logger.getRootLogger().getLoggerRepository().resetConfiguration();
    

    你是说;如何查看日志配置文件中使用的格式化类?提示:这是模式设置。对不起,我使用的是1.2.OK版本。你能再解释一下你的用例吗?您可以使用WriterAppender而不是FileAppender—将消息附加到输出流,然后您可以通过编程方式访问该输出流,并(可选地)根据需要将其直接添加到文件。要做到这一点,在设置记录器时,您需要有权/被允许更改Appender。如果这符合你的情况,我会在新的答案中详细说明。如果我的问题不清楚,很抱歉。我不想以编程方式设置布局,我有一个自定义布局,我希望在执行log.error(XXXX)时获得将输出到文件的消息。对不起我的英语。