2010-08-11 22 views
5

khi bạn viếtCó thể tiền tố mỗi dòng của một stacktrace trong log4j?

logger.error("message", exception); 

log4j tạo ra thông điệp và stack trace hoàn chỉnh:

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 
... 

mô hình chuyển đổi của tôi là

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

Vì vậy, là nó có thể để tiền tố mỗi dòng với myPrefix, như:

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 
    ... 

Khi tôi grep nhật ký của mình trên myPrefix, tôi không thấy dấu vết ngăn xếp. Chúng tôi có nhiều tiền tố khác nhau (mỗi mô-đun)

Xin cảm ơn trước.

Trả lời

2

Subclass ThrowableRenderer, ví dụ:

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; 
    } 

} 

Thêm vào yo ur log4j.properties:

log4j.throwableRenderer=whatever.package.LogThrowableRenderer 

này sử dụng hiện DefaultThrowableRenderer để render stacktrace theo cách quen thuộc trước khi thêm tiền tố, vì vậy nó sẽ bao gồm các Throwable lớp, tin nhắn, và nguyên nhân.

0

Viết chức năng trình bao bọc để làm điều đó cho bạn.

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

Cảm ơn mẹo, nhưng đây không phải là những gì tôi đang tìm kiếm. Thứ nhất, nó sẽ thực hiện một số nhật ký thay vì một nhật ký. 2, tôi đang làm việc trên một dự án khá lớn và tôi không thể tưởng tượng việc thay đổi mọi logger.log bằng cái gì khác. Cuối cùng, giải pháp của bạn sẽ không tiền tố dòng "at" với tiền tố. Tôi đang tìm một giải pháp cấu hình log4j. –

+0

O ok xin lỗi về điều đó. Tôi không quá quen thuộc với log4j nhưng khi tôi đã làm một Google nhanh chóng trên nó, tôi thấy điều này, http://logging.apache.org/log4j/1.2/manual.html, bạn có thể đã nhìn thấy nó, nhưng nếu bạn di chuyển xuống Cấu hình khoảng một nửa xuống có thể giúp đỡ. Xin lỗi tôi không thể giúp nhiều hơn. – Mike

7

Tham khảo câu trả lời của Alex vì câu trả lời sạch hơn.

Bạn có thể viết thực hiện của riêng bạn org.apache.log4j.spi.ThrowableRenderer:

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

Sau đó, chỉnh sửa cấu hình log4j của bạn:

log4j.throwableRenderer = bạn tùy chỉnh-class-name

Các ThrowableRenderer trả về một mảng của String s. Dưới đây là mã của bạn:

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

ý tưởng khác sẽ được in Throwable thành một PrintWriter được gói một số Writer mà viết vào bộ nhớ, và sau đó tái lặp qua chuỗi giới hạn bởi line.separator, thêm mỗi dòng vào một danh sách:

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

cảm ơn vì điều này: Tôi sẽ thử điều này. –

+2

hoạt động tuyệt vời, cảm ơn! nhưng tôi phải chuyển sang log4j 1.2.16 để có thể thực hiện điều này –

+1

Điều này không xử lý lớp và thông báo có thể ném được, hoặc bất kỳ nguyên nhân nào. –

Các vấn đề liên quan