xây dựng trên Andreas' answer, tôi có thể nghĩ đến một vài phương pháp tiếp cận đến vấn đề chỉ thực hiện định dạng nếu Logger.isDebugEnabled
lợi nhuận true
:
Lựa chọn 1: Vượt qua trong một lá cờ "làm định dạng"
Một tùy chọn là có đối số phương thức cho biết có thực sự thực hiện định dạng hay không.Một trường hợp sử dụng có thể là:
System.out.println(lazyFormat(true, "Hello, %s.", "Bob"));
System.out.println(lazyFormat(false, "Hello, %s.", "Dave"));
Trường hợp đầu ra sẽ là:
Hello, Bob.
null
Mã cho lazyFormat
là:
private String lazyFormat(boolean format, final String s, final Object... o) {
if (format) {
return String.format(s, o);
}
else {
return null;
}
}
Trong trường hợp này, String.format
chỉ thực hiện khi format
cờ được đặt thành true
và nếu được đặt thành false
, thẻ này sẽ trả lại null
. Điều này sẽ ngừng định dạng của thông báo ghi nhật ký xảy ra và sẽ chỉ gửi một số thông tin "giả".
Vì vậy, một trường hợp sử dụng với các logger có thể là:
logger.debug(lazyFormat(logger.isDebugEnabled(), "Message: %s", someValue));
Phương pháp này không chính xác phù hợp với những định dạng được yêu cầu trong câu hỏi.
Lựa chọn 2: Kiểm tra Logger
cách tiếp cận khác là yêu cầu logger trực tiếp nếu nó isDebugEnabled
:
private static String lazyFormat(final String s, final Object... o) {
if (logger.isDebugEnabled()) {
return String.format(s, o);
}
else {
return null;
}
}
Trong phương pháp này, đó là mong rằng logger
sẽ được hiển thị trong lazyFormat
phương pháp. Và lợi ích của phương pháp này là người gọi sẽ không cần phải được kiểm tra phương pháp isDebugEnabled
khi lazyFormat
được gọi, vì vậy việc sử dụng điển hình có thể là:
logger.debug(lazyFormat("Debug message is %s", someMessage));
Phiên bản mới hơn của Log4J cho phép thay thế tham số xem http://stackoverflow.com/a/14078904/620113 – computermacgyver
Điều này thực sự hoạt động - nó sẽ định dạng chuỗi nhưng nó có làm việc "lười biếng" không? Tôi đã thực hiện một thử nghiệm nhỏ, nơi arg của lazyFormat là các cuộc gọi đến một chức năng mà in để System.err và nó có vẻ như các args trong Object ... o được đánh giá ngay cả khi String.format (s, o) là không. – OneSolitaryNoob
OneSolitaryNoob - Nó không làm điều lười biếng. Nhà cung cấp câu trả lời cho biết nó có thể được thực hiện bằng cách sử dụng phương thức "isDebugEnabled()" trong phương thức toString() methdod. Tôi đã cung cấp một mô hình đăng nhập lười biếng tổng quát hơn trong câu trả lời của tôi: http://stackoverflow.com/a/18317629/501113 – chaotic3quilibrium