2010-08-11 26 views
5

当你写是否可以在log4j中为stacktrace的每一行加前缀?

logger.error("message", exception); 

log4j的生产信息和完整的堆栈跟踪:

Aug 9 06:26:13 10.175.60.14 myPrefix: [error] [TP-Processor114] [my.class.Name] message : exception 
at fatherOfException 
at fatherof_fatherOfException 
at fatherof_fatherof_fatherOfException 
... 

我的转换模式是

log4j.appender.syslog.layout.ConversionPattern=myPrefix: [%p] [%t] [%c] [%x] - %m%n 

那么,是不是可以前缀每一行 with myPrefix,as:

Aug 9 06:26:13 10.175.60.14 myPrefix: [error] [TP-Processor114] [my.class.Name] message : exception 
myPrefix at fatherOfException 
myPrefix at fatherof_fatherOfException 
myPrefix at fatherof_fatherof_fatherOfException 
    ... 

当我grep我myPrefix上的日志,我没有看到堆栈跟踪。我们有许多不同的前缀(每个模块一个)

在此先感谢。

回答

2

子类ThrowableRenderer,例如:

import org.apache.log4j.DefaultThrowableRenderer; 
import org.apache.log4j.spi.ThrowableRenderer; 

public class LogThrowableRenderer implements ThrowableRenderer { 

    DefaultThrowableRenderer def = new DefaultThrowableRenderer(); 

    @Override 
    public String[] doRender(Throwable t) { 
     String[] temp = def.doRender(t); 
     for (int i = 0; i < temp.length; i++) { 
      temp[i] = "myPrefix "+temp[i]; 
     } 
     return temp; 
    } 

} 

加入哟乌尔log4j.properties

log4j.throwableRenderer=whatever.package.LogThrowableRenderer 

这将使用现有DefaultThrowableRenderer添加前缀之前呈现在熟悉的方式堆栈跟踪,所以这将包括Throwable类,消息和原因。

0

写一个包装函数来为你做。

private void writeToLogs(String message, Exception excp) { 
    logger.error("myPrefix\t" + message, excp); 
} 
+0

感谢您的提示,但这不是我要找的。第一,它会做几个日志而不是一个。第二,我正在研究一个非常大的项目,我无法想象通过其他方式更改每个logger.log。最后,您的解决方案不会在前面加上“at”行前缀。我正在寻找一个log4j配置解决方案。 – 2010-08-11 14:34:13

+0

好吧,对不起。我对log4j不太熟悉,但是当我对它做了一个快速的Google时,我发现这是http://logging.apache.org/log4j/1.2/manual。HTML,你可能已经看到它,但如果你向下滚动到配置大约一半,可能会有所帮助。对不起,我忍不住了。 – Mike 2010-08-11 15:01:17

7

请参考Alex的回答,因为它是一个更清洁的答案。

您可以编写自己的实现的org.apache.log4j.spi.ThrowableRenderer

http://logging.apache.org/log4j/1.2/apidocs/org/apache/log4j/spi/ThrowableRenderer.html

然后,编辑您的log4j的配置:

log4j.throwableRenderer = 您的定制类名

ThrowableRenderer返回String的数组。这是你的代码:

String prefix = "myPrefix"; // Or some constant 

List<String> l = new LinkedList<String>(); 
l.add(String.format("%s %s: %s", prefix, t.getClass().getName(), t.getMessage())); 

for (StackTraceElement ste: t.getStackTrace()){ 
    l.add(String.format("%s %s", prefix, ste.toString())); 
} 

return (String[]) l.toArray(); 

另一个想法是打印ThrowablePrintWriter一个包装一些Writer写入到内存中,然后重新叠代的line.separator分隔的字符串,将每行的列表:

StringWriter sw = new StringWriter(); 
t.printStackTrace(new PrintWriter(sw)); 

List<String> l = new LinkedList<String>(); 
for (String s: sw.toString().split(System.lineSeparator())) { 
    l.add(String.format("%s %s", prefix, s)); 
} 

return (String[]) l.toArray(); 
+0

谢谢你:我会试试这个。 – 2011-03-19 14:58:04

+2

很好,谢谢!但我不得不迁移到log4j 1.2.16才能做到这一点 – 2011-07-20 08:10:00

+1

这不处理可抛出的类和消息,或任何原因。 – 2015-04-29 23:11:14

相关问题