Java 是否可以在log4j中为stacktrace的每一行添加前缀?

Java 是否可以在log4j中为stacktrace的每一行添加前缀?,java,log4j,Java,Log4j,当你写作时 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_fatherOfExcepti

当你写作时

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
那么,是否可以用myPrefix为每一行添加前缀,如下所示:

    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
    ...
当我在myPrefix上grep我的日志时,我看不到堆栈跟踪。我们有许多不同的前缀(每个模块一个)


提前感谢。

编写一个包装函数来完成这项工作

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

参考Alex的答案,因为它更清晰。

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

然后,编辑您的log4j配置:

log4j.throwableRenderer=您的自定义类名

ThrowableRenderer
返回一个
String
s的数组。这是您的代码:

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();

子类<代码>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;
    }

}

这将使用现有的
DefaultThrowableRenderer
在添加前缀之前以熟悉的方式呈现stacktrace,因此它将包括
Throwable
类、消息和原因。

感谢您的提示,但这不是我要找的。首先,它将执行多个日志,而不是一个日志。第二,我正在做一个相当大的项目,我无法想象用其他东西改变每个logger.log。最后,您的解决方案不会在“at”行前面加前缀。我正在寻找一个log4j配置解决方案。好的,很抱歉。我对log4j不太熟悉,但当我在上面快速搜索时,我发现了这个,你可能已经看到了,但如果你向下滚动到一半的配置,可能会有所帮助。对不起,我帮不了你了。很好,谢谢!但我必须迁移到log4j 1.2.16才能做到这一点。这不会处理可丢弃的类和消息,或任何原因。@AlexNauda编辑并添加了一个替代方案,谢谢。@AlexNauda您的答案当然更好。我将从我的链接到它。
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.throwableRenderer=whatever.package.LogThrowableRenderer