2011-08-17 7 views
5

Tôi sử dụng log4j để đăng nhập vào dự án của mình. Dưới đây là nó thiết lập mẫu:log4j và weblogic: thông báo tường trình trùng lặp

public class MyClass { 
    private final Logger logger = Logger.getLogger(MyClass.class); 

    public MyClass() { 
    BasicConfigurator.configure(); 
    Logger.getLogger(MyClass.class).setLevel(Level.INFO); 
    } 

    ... 

} 

Vấn đề là trên mỗi logger tiếp theo gọi nó là bản sao thông điệp đăng nhập (Ý tôi là về cuộc gọi đầu tiên chỉ có 1 tin nhắn, cuộc gọi thứ hai có 2 thông điệp tương tự, sau đó có 3 trong số họ và như vậy). Dường như mỗi lần cá thể của trình ghi nhật ký mới được tạo và sử dụng với tất cả các phiên bản cũ.
Làm cách nào để tránh sự cố này? Cảm ơn.

UPP. Cố gắng để làm cho nó tĩnh, nhưng nó không hoạt động anyway. Tôi vẫn nhận được nhiều thông điệp tường trình. Bất kỳ ý tưởng? Có lẽ một số công cụ cụ thể của Weblogic?

Trả lời

4

Tận dụng tối logger static

private static final Logger logger = Logger.getLogger(MyClass.class); 

Mấu chốt ở đây là tạo ra một Logger cho mỗi lớp học, chứ không phải cho mỗi trường hợp.

+0

Cảm ơn bạn @Shawn. – kardanov

+0

Hmm, đã thử điều này, nhưng không thành công.Và đó là thực sự kỳ lạ gây ra lời khuyên của bạn trông rất hợp lý. Bất kỳ ý tưởng khác? Điều gì có thể gây ra vấn đề? Có lẽ một số công cụ cụ thể Weblogic? – kardanov

+0

Bạn đã tìm được giải pháp cho điều đó chưa? Tôi có hành vi tương tự ở đây và không thể sửa lỗi này cho đến nay. –

2

thử cài đặt độ nhạy falseprogrammatically hoặc trong cấu hình.

Logger.getLogger(MyClass.class).setAdditivity(false); 

Đối với tôi, điều đó đã làm các trick khi tôi đặt nó trong log4j.xml

<logger name="com.stackoverflow.answers.gnat" additivity="false"> 
    <!-- note additivity value set above --> 
    <level value="INFO"/> 
    <appender-ref ref="knowledge"/> 
    <appender-ref ref="reputation"/> 
</logger> 
+0

Cảm ơn bạn đã trả lời @gnat nhưng bây giờ tôi nhận được ngoại lệ: 'log4j: WARN Không thể tìm thấy người đăng ký cho logger log4j: WARN Hãy khởi chạy hệ thống log4j đúng cách' Không có nhật ký nào được khởi tạo. – kardanov

+0

_WARN Không có ứng cử viên nào ..._ Tôi hiểu rồi. Âm thanh quen thuộc. Không bao giờ có thể xác định lý do đó (tôi đã viết rằng tôi ghét tài liệu log4j? Chỉ tài liệu maven có vẻ tồi tệ hơn nó) nhưng nó luôn luôn cảm thấy như nó xảy ra khi tôi thiết lập một số thuộc tính quá sớm. Xem xét cố gắng để thiết lập độ nhạy càng muộn càng tốt. Ví dụ Btw 'xml' trong câu trả lời của tôi được sao chép từ codebase mà tôi làm việc ngay bây giờ (tôi chỉ làm xáo trộn tên và ref cụ thể của công ty) và nó được chứng minh là hoạt động tốt trong nửa năm qua hoặc một cái gì đó – gnat

1

Nếu bạn thực hiện lớp Logger của bạn tĩnh như đề xuất ở trên, và sau đó đảm bảo rằng bạn đang cấu hình log4j hoặc thông qua một thuộc tính hệ thống -D ở cấp JVM hoặc trong cấu hình của ứng dụng của bạn, bạn không nên có bất kỳ vấn đề nào. Cuộc gọi đó để phân tích cú pháp cấu hình hoặc ở thời gian tải lớp hoặc tại thời gian tạo ví dụ là chi phí không cần thiết.

log4j chỉ cần khởi tạo cấu hình một lần - cho dù đó là lúc khởi tạo máy chủ hay triển khai ứng dụng của bạn.

Dự án của bạn có phải là ứng dụng web không?

Ngoài ra, bạn có thể tìm hiểu thêm về hooking vào cấu hình logging WebLogic Server ở đây: http://download.oracle.com/docs/cd/E12840_01/wls/docs103/logging/logging_services.html

Hy vọng rằng sẽ giúp.

+0

cảm ơn bạn @kevinpowe – kardanov

+0

Niềm vui, @ kardanov - nếu bạn tìm thấy câu trả lời hữu ích, nó sẽ là tuyệt vời nếu bạn có thể bỏ phiếu cho câu trả lời. Hy vọng đăng nhập là điều trị bạn tốt hơn bây giờ. – kevinpowe

0

Sự cố nằm ở phương thức BasicConfurator.configure(). Tôi gặp vấn đề tương tự trong dự án java của mình và tôi không sử dụng WebLogic.

Tôi đã chuyển phương thức BasicConfigurator.configure() từ beforeTest() thành beforeClass() của mình và đột nhiên sự cố đã biến mất.

@BeforeClass 
public static void beforeClass() { 
    BasicConfigurator.configure(); 
    GeoLogger.setLogLevel(Level.INFO); 
} 

@Before 
public void beforeTest() { 
    //BasicConfigurator.configure(); 
} 

Hy vọng giúp hướng dẫn bạn giải pháp.