Có cách nào để chỉ định Log4J 2.x log4j2.xml
vị trí tệp theo cách thủ công (như DOMConfigurator
trong Log4J 1.x), mà không gây rối với classpath và thuộc tính hệ thống?Cách xác định vị trí cấu hình Log4J 2.x?
Trả lời
Bạn có thể sử dụng phương pháp tĩnh #initialize(String contextName, ClassLoader loader, String configLocation)
(xem nguồn here) trong org.apache.logging.log4j.core.config.Configurator
. (Bạn có thể vượt qua null cho bộ nạp lớp.)
Hãy nhận biết rằng lớp này không phải là một phần của API công cộng để mã của bạn có thể phá vỡ với bất kỳ phiên bản nhỏ.
Để hoàn chỉnh, bạn cũng có thể xác định vị trí của tập tin cấu hình với sở hữu hệ thống này:
-Dlog4j.configurationFile=path/to/log4j2.xml
Sử dụng LoggerContext cho phép setConfigLocation.
File f = new File(this.logConfigFile);
URI fc = f.toURI();
System.out.println("Loading logging config file: " + fc);
Logger l = (Logger) LogManager.getLogger(LogManager.ROOT_LOGGER_NAME);
l.getContext().setConfigLocation(fc);
hoặc cách khác
LoggerContext.getContext().setConfigLocation(java.net.URI);
Bạn có thể khởi tạo như dưới đây cũng
ConfigurationSource source = new ConfigurationSource(new FileInputStream(log4j file Path));
XmlConfiguration xmlConfig = new XmlConfiguration(source);
Logger logger = (Logger) LogManager.getLogger();
logger.getContext().start(xmlConfig);
Trong mỗi lớp học mà bạn có thể nhận được dụ logger như sau
import org.apache.logging.log4j.LogManager;
import org.apache.logging.log4j.Logger;
private final Logger logger = LogManager.getLogger(ABC.class);
[org.apache.logging.log4j.Logger] (https://logging.apache.org/log4j/2.0/log4j-api/apidocs/org/apache/logging/log4j/Logger.html) không có getContext() phương pháp. – Boris
Trong Windows, hãy lưu ý rằng bạn cần phải sử dụng một URI với log4j.configurationFile
tài sản
-Dlog4j.configurationFile=file://C:\path\to\log4j2.xml
Tôi tin rằng thuộc tính hệ thống chấp nhận đường dẫn tệp thông thường (tương đối hoặc tuyệt đối) cũng như URI. –
Đây không phải là cách đơn giản bởi vì Configurator (và những người khác) có thể được mở rộng (http://logging.apache.org/log4j/ 2.0/manual/extending.html) – mcoolive
Tôi gọi hàm '' 'Configurator.initialize()' '' trong dự án của tôi ở đâu? Tôi yêu cầu nó bởi vì tôi đang làm nó trong một khối tĩnh và Log4j đang đăng nhập mà nó không tìm thấy tệp trước khi mã của tôi chạy. –