The official documentation thấy một ví dụ: Programatically Thêm vào Configuration hiện
final LoggerContext ctx = (LoggerContext) LogManager.getContext(false);
final Configuration config = ctx.getConfiguration();
Layout layout = PatternLayout.createLayout(PatternLayout.SIMPLE_CONVERSION_PATTERN, config, null, null,null, null);
Appender appender = FileAppender.createAppender("target/test.log", "false", "false", "File", "true", "false", "false", "4000", layout, null, "false", null, config);
appender.start();
config.addAppender(appender);
AppenderRef ref = AppenderRef.createAppenderRef("File", null, null);
AppenderRef[] refs = new AppenderRef[] {ref};
LoggerConfig loggerConfig = LoggerConfig.createLogger("false", "info", "org.apache.logging.log4j", "true", refs, null, config, null);
loggerConfig.addAppender(appender, null, null);
config.addLogger("org.apache.logging.log4j", loggerConfig);
ctx.updateLoggers();
Với những hạn chế:
- Nếu tập tin cấu hình được thay đổi cấu hình sẽ được tải lại và thay đổi thủ công sẽ bị mất.
- Sửa đổi cấu hình đang chạy yêu cầu tất cả các phương thức được gọi (addAppender và addLogger) phải được đồng bộ hóa.
giải pháp này tránh sử dụng phương pháp từ việc thực hiện cốt lõi org.apache.logging.log4j.core.Logger
, và nó tránh cast bẩn như thế:
import org.apache.logging.log4j.Logger;
Logger logger = (Logger) LogManager.getLogger(this.getClass());
((org.apache.logging.log4j.core.Logger) logger).addAppender(...); // Bypassing the public API
Nếu bạn dự định tô bóng ngăn chứa bộ ghi để ẩn hoàn toàn, hãy thêm dòng đầu tiên: LogManager.setFactory (new Log4jContextFactory()); Bây giờ bạn cũng có thể bỏ qua tất cả các tệp cấu hình và thuộc tính bằng bộ lọc bóng râm. – bebbo