Vấn đề của bạn là nhiều hơn khả năng không phải với khung đăng nhập nhưng với cách bố trí.
dụ bê tông
so35592962/App.java
package so35592962;
import org.apache.logging.log4j.*;
import so35592962.sub.OtherClass;
public class App {
public static final Logger logger = LogManager.getLogger();
public static void main(String[] args) {
logger.error("in App.main");
OtherClass.act();
}
}
so35592962/sub/OtherClass.java
package so35592962.sub;
import static so35592962.App.logger;
public class OtherClass {
public static void act() {
logger.error("OtherClass.act");
}
}
Vì vậy, bạn có thể thấy điều này là hoàn toàn những gì bạn muốn: lớp có sử dụng một logger duy nhất. Vì vậy, điểm tốt, Log4J2 có thể được sử dụng cho điều đó.
Bây giờ tôi thêm các tập tin ma thuật log4j2.xml
<?xml version="1.0" encoding="UTF-8"?>
<Configuration status="WARN">
<Appenders>
<Console name="Console" target="SYSTEM_OUT">
<PatternLayout pattern="%d{HH:mm:ss.SSS} [%t] %-5level %C{36} - %msg%n"/>
</Console>
</Appenders>
<Loggers>
<Root level="error">
<AppenderRef ref="Console"/>
</Root>
</Loggers>
</Configuration>
Chạy này sẽ in:
12:05:28.834 [main] ERROR so35592962.App - in App.main
12:05:28.836 [main] ERROR so35592962.sub.OtherClass - OtherClass.act
Look, có tên lớp khác nhau ở đây! Tuy nhiên, tôi đã sử dụng Log4J2.
Điều gì đã xảy ra ở đây?
Lưu ý mô hình sử dụng trong thẻ PatternLayout
:
%d{HH:mm:ss.SSS} [%t] %-5level %C{36} - %msg%n
Các ví dụ tiêu chuẩn và những gì bạn thường thấy trên Internet đều sử dụng mô hình %L
. Mẫu này là để hiển thị tên của trình ghi nhật ký. Nhưng bạn nói bạn không muốn nó. May mắn thay, các mẫu khác tồn tại. %C
sẽ hiển thị tên lớp thay vì tên nhật ký. Đây là mẫu được sử dụng ở đây.
Theo the PatternLayout
documentation, mô hình %C
nào sau đây:
Đầu ra tên lớp đầy đủ của người gọi việc tạo yêu cầu đăng nhập.
Lưu ý quan trọng, cũng được đề cập trong tài liệu hướng dẫn:
Tạo tên lớp của người gọi (thông tin vị trí) là một hoạt động tốn kém và có thể ảnh hưởng hiệu suất. Sử dụng cẩn thận.
Hoàn toàn tùy thuộc vào bạn (trong bất kỳ khung nào trong số này) cách bạn xác định và đặt tên cho người đăng nhập của mình. Bạn chỉ có thể có một cho toàn bộ ứng dụng của mình hoặc gọi 'getLogger' trên bất kỳ cuộc gọi nào. – Thilo
Liên quan: http://stackoverflow.com/questions/26600757/standard-way-to-implement-a-logger-across-classes-in-java?rq=1 http://stackoverflow.com/questions/27038694/ là-có-một-dễ-cách-để-tạo-một-logger-dụ-cho-mỗi-lớp? rq = 1 – Thilo
@ Thilo có một cho toàn bộ ứng dụng sẽ làm cho tất cả các bản ghi có cùng tên. Mà không phải là tôi đang tìm kiếm. Thay vào đó, khung công tác phải hiển thị tên lớp của người gọi. – Edi