Chúng tôi sử dụng log4j 1.2.x để đăng nhập vào sản phẩm của chúng tôi và đang tìm cách di chuyển sang log4j 2.x trong tương lai gần. Một trong những chức năng chúng tôi đã thực hiện là ghi nhật ký thông tin hệ thống và các thông số quan trọng khác trên mỗi tệp nhật ký cuộn mới được tạo. Cách chúng tôi thực hiện trong log4j 1.2.x là chúng ta đã mở rộng RollingFileAppender
lớp log4j và đã ghi đè phương pháp rollOver()
, dưới đây là đoạn một phần của việc thực hiệnLàm thế nào để tùy chỉnh log4j2 RollingFileAppender?
@Override
public void rollOver() {
super.rollOver(); //We are not modifying it's default functionality but as soon as rollOver happens we apply our logic
//
// Logic to log required system properties and important parameters.
//
}
Bây giờ khi chúng ta muốn di chuyển đến log4j2 chúng tôi xem xét một giải pháp mới để đạt được chức năng tương tự. Nhưng như tôi thấy mã nguồn cho log4j2 nó rất khác với mã nguồn cũ hơn. Lớp RollingFileAppender
không chứa phương thức rollover()
vì nó đã được chuyển đến RollingManagerhelper
và nó đã được đặt thành private
là tốt.
Phát triển một gói hoàn chỉnh mới và mở rộng/triển khai một số lớp trừu tượng/trợ giúp từ log4j2 là một trong những giải pháp khả thi cho chúng tôi, nhưng đòi hỏi nhiều mã hóa/sao chép vì chúng tôi không sửa đổi những gì RollingFileAppender
. mở rộng nhỏ cho nó. Có một giải pháp đơn giản cho nó?
CẬP NHẬT
Tôi tạo ra một tra cứu tùy chỉnh theo gợi ý trong câu trả lời và dưới đây là cách tôi tạo ra nó;
@Plugin(name = "property", category = StrLookup.CATEGORY)
public class CustomLookup extends AbstractLookup {
private static AtomicLong aLong = new AtomicLong(0);
@Override
public String lookup(LogEvent event, String key) {
if (aLong.getAndIncrement() == 0) {
return "this was first call";
}
if (key.equalsIgnoreCase("customKey")) {
return getCustomHeader();
} else {
return "non existing key";
}
}
private static String getCustomHeader() {
// Implementation of custom header
return "custom header string";
}}
Nhưng điều này không hoạt động như đã đề cập; điều này luôn in this was first call
trong tiêu đề. Tôi cũng đã thử đặt breakoint vào điều kiện if
đầu tiên và những gì tôi nhận thấy là nó chỉ được gọi một lần. Vì vậy, những gì tôi lo sợ là lớp customLookup chỉ được khởi tạo khi khởi động khi log4j2 khởi tạo thuộc tính của nó từ cấu hình xml. Tôi không biết làm cách nào khác tôi có thể triển khai lớp tra cứu tùy chỉnh này.
CẬP NHẬT 2
Sau khi thực hiện ở trên tôi đã thử nó trong bit cách khác đó là như sau;
private static AtomicLong aLong = new AtomicLong(0);
@Override
public String lookup(LogEvent event, String key) {
return getCustomHeader(key);
}
private static String getCustomHeader(final String key) {
if (aLong.getAndIncrement() == 0) {
return "this was first call";
}
if (key.equalsIgnoreCase("customKey")) {
// Implementation for customKey
return "This is custom header";
} else {
return "non existing key";
}
}
Nhưng điều này cũng giống như vậy. log4j2 tạo ra các tiêu đề trong khi khởi tạo từ tập tin cấu hình xml của nó và sau đó sử dụng các tiêu đề từ bộ nhớ. Giá trị return
bị ghi đè lookup()
phương pháp không thể thay đổi động vì nó chỉ được gọi trong khi khởi tạo. Mọi trợ giúp thêm sẽ được đánh giá cao.
Nếu bạn muốn sử dụng thay thế biến thời gian chạy sử dụng đôi $$ khi chỉ định khóa biến trong tệp thuộc tính log4j2. – TrueCurry