2014-10-31 15 views
10

Tôi muốn sử dụng log4j mà không cần bất kỳ tệp cấu hình nào. Những gì tôi wan để làm là một cái gì đó như:Cách cấu hình Logger Lập trình trong log4j2.02?

logger = (Logger) LogManager.getLogger(this.getClass()); 
String pattern = "[%level] %m%n"; 
//do something to make this logger output to an local file "/xxx/yyy/zzz.log" 

Tôi đã tìm thấy câu trả lời này: Configuring Log4j Loggers Programmatically.

Nhưng các tài liệu của Logger#addAppender nói: Phương pháp này là không tiếp xúc thông qua các API công cộng và được sử dụng chủ yếu cho kiểm tra đơn vị.

Tôi không chắc liệu đó có phải là cách thích hợp để sử dụng phương pháp này trong mã của tôi không hoặc có giải pháp nào khác tốt hơn để giải quyết vấn đề của tôi.

Trả lời

19

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ế:

  1. 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.
  2. 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 
+0

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

0

Nếu tôi chỉ phản hồi yêu cầu của bạn, tôi có thể đề xuất ba tùy chọn. Tôi sử dụng cái đầu tiên cho một cấu hình bootstrap Logger; tuy nhiên tôi nghĩ thứ hai là cần thiết lúc đầu. Lựa chọn thứ ba của bạn có vẻ cồng kềnh vì bạn cần gọi các API log4j khác nhau để được cấu hình.

Sử dụng Log4j so với khung đăng nhập đơn giản cho Java ...

  1. Thực hiện một hoặc file log4j.properties 'mặc định' 'tối thiểu' tài nguyên của bạn cho các tập tin JAR. Sau đó khai báo một số tĩnh học ...

    private static final URL LOGGER_CONFIG_URL = resolveConfigUrl(); 
        : 
    
    private static URL resolveConfigUrl(){ 
    
        URL url = LogConfig.class.getResource(LOGGER_CONFIG_NAME); 
    
        if(null == url) // Second chance, try for a file. 
        { 
         url = FileHelp.resolveUrlNameAsUrlToFile(LOGGER_CONFIG_NAME); 
            //-- Make this function with: url = tmpFile.toURI().toURL() 
            // Plus appropriate try/catch and error checks. 
         } 
         return url; 
    } 
    
    private static void configureLogger(){ 
    
        BasicConfigurator.configure(); 
        PropertyConfigurator.configure(LOGGER_CONFIG_URL ); 
        LOG.info("Logging config done: " + LOGGER_CONFIG_NAME); 
    } 
    
  2. Viết cấu hình của bạn đến một StreamWriter thay vì đặt một tập tin trong JAR của bạn, và sau đó cung cấp Stream với cấu hình nhật ký dưới dạng StringReader và sử dụng các ví dụ trên (nhiều hơn hoặc ít hơn).

  3. Bạn có thể sử dụng slf4j API để làm cấu hình nhật ký của mình, thay vì viết trực tiếp vào Log4j. Hầu hết các nơi tôi đã thích tuyến SLF4J.

Cá nhân, tôi thích tùy chọn # 1; nó rất dễ bảo trì. đơn giản và bạn luôn có thể sắp xếp lại mã để chấp nhận/tìm kiếm tệp để tải trước. Có một số con đường bên khác mà bạn có thể xem xét, chẳng hạn như thiết lập các biến môi trường lập trình khi khởi động. Điều đó dường như gây ra cho tôi.

Cách tôi sử dụng # 1 là thiết lập cấu hình trình khởi động mặc định/bootstrap thông qua tệp tài nguyên, chính tệp này được đưa vào tệp JAR. Bạn có thể định cấu hình lại mọi thứ 'sau' trong khi tùy chọn này cung cấp cho bạn cấu hình khởi động hoặc khởi động nhỏ gọn. Trong giai đoạn đầu, tôi thấy mọi thứ vẫn chưa được đăng nhập vì khởi tạo nhật ký chưa xảy ra trên các ứng dụng nhúng. Vì vậy, tôi giữ tùy chọn đơn giản cho bootstrap (hoặc mặc định) như là một cơ bản từ bao giờ. Hi vọng điêu nay co ich.

0

Với phiên bản mới nhất của log4j2, tất cả tạo ra các API như

PatternLayout.createLayout, 
FileAppender.createAppender, 
LoggerConfig.createLogger 

đã không được chấp nhận, tốt hơn là sử dụng nhật ký tùy chỉnh ConfigurationFactory cùng với ConfigurationBuilder để xác định cấu hình nhật ký theo lập trình.

Các vấn đề liên quan