【问题标题】:Throwable.printStackTrace() with log4j [duplicate]Throwable.printStackTrace() 与 log4j [重复]
【发布时间】:2014-02-11 15:20:49
【问题描述】:

我有一个应用程序使用下面的代码来输出异常堆栈跟踪,但是当我在服务器上运行它时,它不会在 log4j 文件中记录任何内容。

通常我会使用logger.error("msg...", e),但我无法更改代码,所以我坚持使用 printStackTrace() 方法。

有没有办法配置 log4j 以将它们包含在日志中?我知道他们去System.err而不是System.out所以我可以使用log4j配置以某种方式重定向它(即不更改代码)吗?

非常感谢任何想法。

try {
...
} catch (Exception e) {
e.printStackTrace();
}

【问题讨论】:

标签: java log4j


【解决方案1】:

借用 Black Vegetable 提供的示例,看看这是否有助于您朝着想要的方向前进:

import java.io.IOException;
import java.io.OutputStream;
import java.io.PrintStream;

import org.apache.log4j.Logger;

public class TestSystemErrCapture {

  private static final Logger log = Logger.getLogger(TestSystemErrCapture.class);

  public static void main(String[] args) {
    // First, redirect STDERR
    System.setErr(new PrintStream(new OutputStream() {
      private StringBuilder message = new StringBuilder();
      @Override
      public void write(int b) throws IOException {
        if (b == '\n') {
          log.error(message);
          message.setLength(0);
        } else {
          message.append((char)b);
        }
      }
    }));
    // Now test to make sure output is redirected
    TestThirdPartyClass t3pc = new TestThirdPartyClass();
    t3pc.doIt();
  }

  public static class TestThirdPartyClass {
    public void doIt() {
      try {
        throw new RuntimeException("Evil");
      } catch (Exception e) {
        e.printStackTrace();
      }
    }
  }

}

log4j.xml:

<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE log4j:configuration PUBLIC
  "-//APACHE//DTD LOG4J 1.2//EN"     "http://logging.apache.org/log4j/1.2/apidocs/org/apache/log4j/xml/doc-files/log4j.dtd">
  <log4j:configuration xmlns:log4j='http://jakarta.apache.org/log4j/'>
  <appender name="Console"
            class="org.apache.log4j.ConsoleAppender">
    <!-- Only allow INFO+ in the Console. Use other logs for DEBUG-
    <param name="Threshold" value="INFO"/>-->
    <layout class="org.apache.log4j.PatternLayout">
      <param name="ConversionPattern"
             value="%d{MM/dd/yyyy HH:mm:ss}: %l%n%-5p - %m%n"/>
    </layout>
  </appender>
  <root>
    <level value="INFO"/>
    <appender-ref ref="Console"/>
  </root>
</log4j:configuration>

产生以下输出(我在 Eclipse 中运行):

02/11/2014 10:26:53: TestSystemErrCapture$1.write(TestSystemErrCapture.java:18)
ERROR - java.lang.RuntimeException: Evil

02/11/2014 10:26:53: TestSystemErrCapture$1.write(TestSystemErrCapture.java:18)
ERROR -     at     TestSystemErrCapture$TestThirdPartyClass.doIt(TestSystemErrCapture.java:33)

02/11/2014 10:26:53: TestSystemErrCapture$1.write(TestSystemErrCapture.java:18)
ERROR -     at TestSystemErrCapture.main(TestSystemErrCapture.java:27)

输出有点奇怪,可能不是你想要的应用程序,但我认为它应该让你开始。

HTH --jsp

【讨论】:

  • 这就是我的想法。 +1
  • 谢谢。问题是我无法更改应用程序中的代码,所以我试图查看是否有任何方法可以仅使用 log4j 配置来完成。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2010-12-07
  • 2016-12-01
  • 2013-08-31
  • 2011-02-27
  • 1970-01-01
  • 1970-01-01
  • 2022-01-18
相关资源
最近更新 更多