将 e.printStackTrace() 转换为使用 log4j

7

我对log4j非常陌生。我不想在我的日志文件中显示异常堆栈跟踪,如下所示:

java.lang.IllegalArgumentException: nodeRef is a mandatory parameter
at org.alfresco.util.ParameterCheck.mandatory(ParameterCheck.java:42)

这些异常使用e.printStackTrace()直接写入控制台,如下所示。
try {
    // something
} catch(Exception e) {
    StringWriter stack = new StringWriter();
    e.printStackTrace(new PrintWriter(stack));
    logger.debug("Caught exception; decorating with appropriate status template : " + stack.toString());
}

我现在正在定制一个开源项目,而不是自己编写所有的程序。因此,在所有的Java文件中都删除e.printStackTrace();是不可能的。

据我所知,通过使用Log4j日志记录器打印的日志可以使用Log4j错误级别(如info、debug、warn)进行配置。但是,如果直接将日志写入控制台或文件,该怎么办呢?

如何配置Log4j不仅打印异常堆栈跟踪,还显示其他信息?有解决方法吗?


1
你首先需要使用log4j。你展示的catch语句a)没有使用log4j;b)甚至没有在任何地方打印任何东西。它只是用堆栈跟踪填充了一个StringWriter。 - Marko Topolnik
我修改了我的代码。我的示例同时使用了e.printStackTrace()和logger.debug()。这不是我编写的。我的项目使用了那个附带源代码的jar文件。 - swemon
1
我会创建一个PrintStream来替换System.err,将所有内容写入log4j。这样你就可以随意使用System.out或System.err,并且它们实际上都使用了log4j。 ;) - Peter Lawrey
3个回答

8

使用 Logger#error

import org.apache.log4j.Logger;

...

Logger log = Logger.getLogger(Locomotive.class);
log.error("your message", exc);

...

8
代码
StringWriter stack = new StringWriter();
e.printStackTrace(new PrintWriter(stack));
logger.debug("Caught exception; decorating with appropriate status template : " + stack.toString());

这只是Log4j API使用错误的一个例子。但如果你被困在其中,除了将日志级别提高到debug并省略整个消息之外,你将无事可做。

可能存在一种方式可以截断所有日志消息,这将在一定程度上缓解你的问题。


是的。因为我们已经使用了logger.debug()。我认为我们不需要使用e.printStackTrace(new PrintWriter(stack));但源代码已经这样使用了。 - swemon
1
我认为你并没有理解那段代码。这里没有任何冗余;在你提供的示例中,printStackTrace 实际上并没有 打印 任何内容。程序员只是想要将堆栈跟踪附加到一个 debug 日志信息中,而 Log4J 不支持 log.debug(msg, exc) --- 这是有充分理由的。 - Marko Topolnik

0
logger.info("Inside add() of Abc class");
logger.error("Error occurred while calculation::::"+errorMessage);

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接