Khi bạn làm điều gì đó như LOG.debug("Exported {}.", product)
trong slf4j, cuối cùng nó sẽ gọi toString() trên các đối số, ví dụ: product
.slf4j mà không toString()
Vì một số lý do, tôi không thể ghi đè lênString() trên tất cả các lớp tôi muốn sử dụng làm đối số. Một số lớp đến từ các lọ bên thứ ba, một số khác sẽ có toString() của chúng được gọi trong các ngữ cảnh khác, nơi mà thông tin tôi muốn in trong câu lệnh tường trình của tôi không có sẵn.
Tuy nhiên, tôi có một lớp cho mục đích gỡ lỗi có phương thức DebugFormatter.format(Object)
có một chuỗi dài các instanceofs chọn thường trình để tìm một số thông tin gỡ lỗi hữu ích về đối tượng đó.
Câu hỏi của tôi là: Có thể định cấu hình slf4j sao cho nó gọi phương thức tĩnh như vậy thay vì toString()?
Tất nhiên, tôi có thể gọi phương thức định dạng của tôi trên đối tượng trước khi chuyển nó thành tham số Logger.debug()
nhưng sau đó nó sẽ được thực hiện ngay cả khi trình ghi nhật ký tương ứng không được bật. Vì vậy, tôi đã phải bao quanh nó với if (LOG.isDebugEnabled())
có nghĩa là toàn bộ các điểm có đối số trong debug() đã bị bỏ qua.
Bạn chưa đề cập đến khung đăng nhập cơ bản. Có log4j không? đăng lại? – Ceki
Đó là log4j. Tôi đang có kế hoạch chuyển sang logback, tuy nhiên. – Wolfgang
Tôi đã chấp nhận câu trả lời của Andrew là câu trả lời chính thức vì nó dễ thực hiện hơn so với Ceki. Nó cũng độc lập với khung bên dưới. Thêm vào đó nó cho phép thực hiện định dạng tùy chọn, hoặc thậm chí chọn giữa các trình định dạng khác nhau. Tuy nhiên, đối với những người dùng khác, câu trả lời của Ceki có thể phù hợp hơn vì nó minh bạch hơn và tiết kiệm tài nguyên. – Wolfgang