如何使用log4j捕获第三方控制台日志

时间:2016-10-24 12:04:34

标签: java web-services logging console log4j

我使用log4j记录应用程序中的操作。我使用以下文件appender:

 private FileAppender getFileAppender(String name) {
  PatternLayout layout = new PatternLayout("%d{ABSOLUTE} %5p %t %c{1}:%M:%L - %m%n");
  StringBuilder filePath = new StringBuilder();
  filePath.append("logs/")
        .append(name)
        .append(".log");
  FileAppender fileAppender = null;

  try {
     File file = new File(filePath.toString());
     file.getParentFile().mkdirs();
     file.createNewFile();

     fileAppender = new FileAppender(layout, filePath.toString(), true);
     fileAppender.setName("FileAppender");
     fileAppender.setAppend(true);
  } catch (IOException e) {
     LogWrapper.LOG.get(this.getClass().getSimpleName()).trace(e);
  }

  return fileAppender;
  }

我的应用程序使用第三方,将Web服务调用记录到控制台。然后我运行应用程序我在Intellij Idea的控制台中看到了这些日志,但是没有在生成的日志文件中看到。

如何将这些日志重定向到File Appender生成的文件中?

更新 答案是正确的,但还有一个第三方使用Console Appender进行回溯,属性如下:

<configuration status="OFF">
<appender name="STDOUT" class="ch.qos.logback.core.ConsoleAppender">
    <encoder>
        <pattern>%d{HH:mm:ss.SSS} [%t] %-5level %logger{36} - %msg%n
        </pattern>
    </encoder>
</appender>
<root level="WARN">
    <appender-ref ref="STDOUT" />
</root>

由于这个捕获控制台输出堆栈。我怎样才能捕获并重写Logback属性并使其记录到文件或禁用日志?

1 个答案:

答案 0 :(得分:0)

您可以尝试将STDOUT记录为INFO,将STDERR记录为WARNING,例如:

final Logger myLog4jLogger = Logger.getLogger(getClass());

System.setOut(new PrintStream(new ByteArrayOutputStream() {
    @Override
    public synchronized void write(byte[] pB, int pOff, int pLen) {
        super.write(pB, pOff, pLen);
        myLog4jLogger.info(toString());
        reset();
    }
}));

System.setErr(new PrintStream(new ByteArrayOutputStream() {
    @Override
    public synchronized void write(byte[] pB, int pOff, int pLen) {
        super.write(pB, pOff, pLen);
        myLog4jLogger.warn(toString());
        reset();
    }
}));

在Log4j初始化之后和调用第三方工具之前,只执行一次此操作。 请注意,这意味着您的进程的STDOUT和STDERR将被重定向到您的日志,因此您的进程发送到STDOUT / STDERR的所有文本都将转到日志,包括您自己的"System.out.println()"

此外,使用它,您可能希望避免登录到控制台,因为我不确定如果您登录到控制台会发生什么,并且控制台被重定向到日志...(无限循环?堆栈溢出?OutOfMemoryError?)

关于使用Logback的第三方,您可以将其日志发送到文件而不是STDOUT,方法是将其添加到其配置文件中:

<appender name="FILE" class="ch.qos.logback.core.FileAppender">
   <file>myApp.log</file>

   <encoder>
     <pattern>%d{HH:mm:ss.SSS} [%t] %-5level %logger{36} - %msg%n</pattern>
   </encoder>
</appender>

并替换:

<appender-ref ref="STDOUT" />

...与:

<appender-ref ref="FILE" />
相关问题