2011-06-21 51 views
1

鑑於我在嘗試通過log4j.xml應用外部log4j配置時遇到問題,我現在有興趣採用關於將資源文件加載到Java項目的約定。有關將資源文件加載到Java項目的約定

儘管代碼能夠顯示沒有警告或錯誤的消息,但我懷疑配置並未真正應用,因爲更改ConversionPattern對控制檯輸出沒有任何影響。

Program.java

package the.project.path; 

import java.io.File; 
import org.apache.log4j.Logger; 
import org.apache.log4j.BasicConfigurator; 
import org.apache.log4j.PropertyConfigurator; 

class Program { 

    static final Logger logger = Logger.getLogger("SampleLogger"); 
    static final File config = new File("the.project.path/conf/log4j.xml"); 
    static final String message = "The quick brown fox jumps over the lazy dog."; 

    public static void main(String[] args) { 

    if (config.exists()) { 
     PropertyConfigurator.configure(config.getPath()); 
    } else { 
     BasicConfigurator.configure(); 
    } 

    try { 
     logger.debug(message); 
     logger.info(message); 
     logger.warn(message); 
     logger.error(message); 
     logger.fatal(message); 

    } catch (Exception exception) { 
     System.out.println(exception.toString()); 
    } 
    } 
} 

的log4j.xml

<?xml version="1.0" encoding="UTF-8" ?> 
<!DOCTYPE log4j:configuration SYSTEM "log4j.dtd"> 
<log4j:configuration xmlns:log4j="http://jakarta.apache.org/log4j/"> 
    <appender name="SampleConsoleAppender" class="org.apache.log4j.ConsoleAppender"> 
    <layout class="org.apache.log4j.PatternLayout"> 
    <!-- 
    TTCC is a message format used by log4j. 
    TTCC is acronym for Time Thread Category Component. 
    It uses the following pattern: %r [%t] %-5p %c %x - %m%n 
    --> 
    <param name="ConversionPattern" value="[%t] [%-5p] - %m%n" /> 
    </layout> 
    </appender> 
    <root> 
    <appender-ref ref="SampleConsoleAppender" /> 
    </root> 
</log4j:configuration> 

任何意見將非常感激。非常感謝。

回答

2

嘗試使用DOMConfigurator,即:

// Load log4j config file... 
String path = "/path/to/log4j.xml"); 
DOMConfigurator.configure(path); 

// Start Logging 
LOG = Logger.getLogger(Program.class); 

(代碼從我目前的項目撕開了,所以我知道它的工作原理);-)

除了上述使用DOMConfigurator的,您可以選擇設置監視週期,因此Log4J的輪詢更改,每次XX米利斯xml文件,然後重新加載變化:

// Load log4j config file... 
String path = "/path/to/log4j.xml"); 
DOMConfigurator.configureAndWatch(path, 30000); // 30sec poll 

// Start Logging 
LOG = Logger.getLogger(Program.class); 

HTH

+0

感謝您的評論,但不幸的是您的代碼段不能編譯。 –

+0

這是因爲它只是一個片段,而不是一個完整的方法。 LOG引用是對Logger變量的引用,我相信當我從自己的代碼中提取它時,可以刪除多餘的支架。 – Crollster

+0

解決這個問題的細節是使用'.configureAndWatch()'而不是'.configure()',即使使用'PropertyConfigurator'也能工作。謝謝! –

1

您可以嘗試設置-Dlog4j.debug = true以查看哪些選項正在應用於log4j。 它不回答您的資源加載問題,但它通常會幫助您知道。

+0

介意再闡述一下你的建議?我在Linux上使用Eclipse。 –

+1

如果在啓動應用程序(而不是Eclipse本身)時將-Dlog4j.debug = true添加到您的jvm參數中,Log4j將編寫由配置程序應用到System.out的選項。一旦啓動應用程序,您將能夠看到正確的配置是否已加載。這些調試信息行將被前綴「log4j:」,所以你不會錯過它們。 – aliher