当你写
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我的日志时,我看不到堆栈跟踪。我们有许多不同的前缀(每个模块一个)
提前致谢。
答案 0 :(得分: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();
另一个想法是将Throwable
打印到包含写入内存的一些PrintWriter
的{{1}}中,然后重新迭代由Writer
分隔的字符串,将每一行添加到列表中:
line.separator
答案 1 :(得分: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
类,消息和原因。
答案 2 :(得分:0)
编写一个包装函数来为你完成。
private void writeToLogs(String message, Exception excp) {
logger.error("myPrefix\t" + message, excp);
}