Tôi tin rằng giải pháp tốt sẽ là mã sẽ có hiệu quả như.
Hãy xem xét rằng log4j không còn được dùng nữa. Chính tác giả của nó đã để nó như vậy, để tránh phá vỡ tính tương thích, nhưng ông đã tạo ra một cái mới, SLF4J (http://www.slf4j.org/). Ông cung cấp cả một mặt tiền và thực hiện, theo sự phân biệt commons-logging/log4j, nhưng không có những sai sót của mỗi ...
Tôi tin rằng, trong cơ sở khai thác mới này, bạn có thể gửi các tham số đối tượng để ghi nhật ký và mức đó được đánh giá trước khi chuyển đổi các đối tượng (thành chuỗi hoặc theo cách khác). Ý tưởng là sử dụng chuỗi định dạng và tham số.
Mã của chúng tôi không sử dụng slf4j, nhưng chúng tôi có các phương pháp tiện ích thực hiện chính xác điều đó. Nó được mã hóa xấp xỉ như sau (từ bộ nhớ):
public enum LogLevel {
FATAL, ERROR, WARNING, INFO, DEBUG;
public void log(Logger logger, String format, Object... parameters) {
if (isEnabled(logger)) {
logImpl(logger, String.format(format, parameters));
}
}
public boolean isEnabled(Logger logger) {
switch(this) {
case WARNING : return logger.isWarningEnabled();
case INFO : return logger.isInfoEnabled();
case DEBUG : return logger.isDebugEnabled();
default: return true;
}
}
private void logImpl(Logger logger, String message) {
switch(this) {
case WARNING : logger.warn(message);
// other cases
}
}
}
Nó được sử dụng như:
public void myMethod(Object param) {
LogLevel.WARNING.log(LOGGER, "What is my message ....", "myMethod", param);
}
CẬP NHẬT: Nếu bạn cần gọi một phương thức trong nhật ký .. .
Một khả năng là sử dụng phương thức toString
. Điều này là thích hợp nếu nhật ký của bạn là 'kỹ thuật' và cũng sẽ được sử dụng khi gỡ lỗi.
Nếu đăng nhập của bạn là thêm chức năng (không nhắm mục tiêu đến developper), tôi đề nghị để xác định một giao diện (đó là chức năng âm thanh trong trường hợp đó, vì vậy nó rất hữu ích để cung cấp ý nghĩa):
public interface Detailable { // the name could also suggest logging?
String getFullDetails();
}
Triển khai giao diện đó trong bất kỳ đối tượng nào cần được truyền dưới dạng đối tượng ghi nhật ký, với tính toán phức tạp để tạo nhật ký.
Tôi không chắc chắn rằng log4j không làm điều đó đã (kiểm tra nội bộ đó làDebugEnabled = true trước khi in một công cụ đánh giá lớn và dài) ... bạn đã kiểm tra chưa? –
log4j không kiểm tra chính mức nhật ký (tất nhiên). Lý do tại sao mọi người đang sử dụng cờ 'isDebugEnabled()' là họ muốn tránh nguyên nhân gây ra bởi việc xây dựng các chuỗi ('" Thú vị, các fooj của tôi được goofed lên: "+ getFullDetails()' trong ví dụ) và tương tự . – sfussenegger
log4j không kiểm tra isDebugEnabled đầu tiên. Tôi đang cố gắng để tránh đánh giá getFullDetails nếu Debug không được kích hoạt. –