2011-12-21 2 views
12

Tôi cần thay đổi thuộc tính log4j của mình (rootLogger, MaxFileSize, v.v.) khi chạy. Tôi có thể làm như thế nào?Thay đổi thuộc tính log4j tại thời gian chạy

+0

Có lẽ đây có thể trợ giúp: http://www.avajava.com/tutorials/lessons/how-do-i-change-my-log4j-settings-whi le-my-web-application-is-running.html – alonp

+0

Trong log4j 2.x 'org.apache.logging.log4j.core.config.Configurator' có thể hữu ích trong một số trường hợp https://logging.apache.org/ log4j/2.x/faq.html # reconfig_level_from_code –

Trả lời

6

Sử dụng LogManager.resetConfiguration(); để xóa các cấu hình hiện tại và cấu hình nó một lần nữa.

Một cách tiếp cận khác là xây dựng một appender mới và thay thế một cái cũ với nó (hầu hết các appender không hỗ trợ thay đổi cấu hình của họ). Bằng cách này, tất cả các logger (và mức độ của họ, vv) vẫn còn nguyên vẹn.

Để làm việc này, tôi thường thêm appender đầu tiên từ mã (và không phải với tệp cấu hình). Điều đó cho phép tôi lưu một tham chiếu mà làm cho nó đơn giản hơn để loại bỏ nó sau này.

+0

Tôi không hiểu. Bạn có thể giải thích tốt hơn không? Tôi có năm Logger bằng cách sử dụng cấu hình của log4j ... Tôi cần phải thay đổi MaxFileSize (tức là), và thiết lập prop mới này cho tất cả Logger của tôi (lúc chạy) ... – user1110002

+2

Một logger chỉ là một khóa. Nó không có MaxFileSize. Kích thước tệp là thuộc tính của * appender *. Người gửi có thể được gắn vào logger và họ sẽ làm điều gì đó với thông điệp tường trình. Vì vậy, những gì bạn cần làm: Tìm ** appenders ** (logger có phương pháp để có được tất cả các logger đính kèm) và sau đó bạn phải thay thế chúng. –

+1

Ok Aaron. Tôi đã cố gắng làm với mã này: Logger l = Logger.getLogger (myclass); LogManager.resetConfiguration(); l.setLevel (Level.DEBUG); RollingFileAppender appender = new RollingFileAppender(); appender.setMaxBackupIndex (numberOfLogsToKeep); logger.addAppender (appender); Nó không hoạt động. Làm thế nào tôi có thể thay đổi appender của logger của tôi? – user1110002

5

https://github.com/apache/jena/blob/master/jena-tdb/log4j.properties có tệp thuộc tính log4j.

Dựa vào nó Tôi đang sử dụng các chức năng configureLog4j helper hiển thị dưới đây như thế này:

bộ mức jena khai thác gỗ trong thời gian chạy

String level=org.apache.log4j.Level.OFF.toString(); 
if (debug) 
    level=org.apache.log4j.Level.INFO.toString(); 
configureLog4j(level); 

chức năng configureLog4J

/** 
    * configure Log4J 
    * @param level -the level to use e.g. "INFO", "DEBUG", "OFF" 
    * see org.apache.log4j.Level 
    */ 
    private void configureLog4j(String level) { 
    Properties props = new Properties(); 
    props.put("log4j.rootLogger", level+", stdlog"); 
    props.put("log4j.appender.stdlog", "org.apache.log4j.ConsoleAppender"); 
    props.put("log4j.appender.stdlog.target", "System.out"); 
    props.put("log4j.appender.stdlog.layout", "org.apache.log4j.PatternLayout"); 
    props.put("log4j.appender.stdlog.layout.ConversionPattern", 
     "%d{HH:mm:ss} %-5p %-25c{1} :: %m%n"); 
    // Execution logging 
    props.put("log4j.logger.com.hp.hpl.jena.arq.info", level); 
    props.put("log4j.logger.com.hp.hpl.jena.arq.exec", level); 
    // TDB loader 
    props.put("log4j.logger.org.apache.jena.tdb.loader", level); 
    // Everything else in Jena 
    props.put("log4j.logger.com.hp.hpl.jena", level); 
    props.put("log4j.logger.org.apache.jena.riot", level); 
    // TDB 
    // TDB syslog. 
    props.put("log4j.logger.TDB", level); 
    props.put("log4j.logger.com.hp.hpl.jena.tdb", level); 
    props.put("log4j.logger.com.hp.hpl.jena.tdb.transaction", level); 
    props.put("log4j.logger.com.hp.hpl.jena.tdb.transaction.NodeTableTrans", 
     level); 
    props.put("log4j.logger.com.hp.hpl.jena.tdb.transaction.TransactionManager",level); 
    props.put("log4j.logger.com.hp.hpl.jena.tdb.transaction.TestTransSystem",level); 
    // Joseki server 
    props.put("log4j.logger.org.joseki", level); 
    LogManager.resetConfiguration(); 
    PropertyConfigurator.configure(props); 
    }