2012-12-13 116 views
0

我在各種環境中遇到過這種情況,從來沒有找到一致的解釋。我聽說有關Tomcat容器是'混亂'的評論,可能有不同的日誌實現,然後我的應用程序或類加載器不知道要使用哪種配置。爲什麼log4j不能使用log4j.xml文件登錄到我配置的文件?

這是當日志記錄工作一次,然後在一小時後沒有記錄日誌而沒有對log4j.xml文件進行更改的那些瘋狂場景之一。我在我的/ src目錄的根目錄下有log4j.xml文件,所以它被部署到/ WEB-INF/classes目錄的根目錄。我使用的是Java 6,Tomcat 6,它是一個GWT 2.3應用程序,從Windows Helios中的Windows 7機器上運行。

對於它的價值,這裏的的log4j.xml

<?xml version="1.0" encoding="UTF-8"?> 
<!DOCTYPE log4j:configuration SYSTEM "log4j.dtd" > 
<log4j:configuration> 
    <appender name="stdout" class="org.apache.log4j.ConsoleAppender"> 
     <layout class="org.apache.log4j.PatternLayout"> 
      <param name="ConversionPattern" value="%d{ABSOLUTE} 
     %5p %c{1}:%L - %m%n"/> 
     </layout> 
    </appender> 
    <appender name="fileAppender" class="org.apache.log4j.DailyRollingFileAppender"> 
     <param name="File" value="${catalina.home}/logs/log4j.log"/> 
     <param name="DatePattern" value="'.'yyyy-MM-dd"/> 
     <param name="Append" value="true"/> 
     <layout class="org.apache.log4j.PatternLayout"> 
      <param name="ConversionPattern" value="%d 
       %-5p [%c{1}] %m %n" /> 
     </layout> 
    </appender> 
    <root> 
     <priority value="debug"></priority> 
     <appender-ref ref="fileAppender"/> 
    </root> 
</log4j:configuration> 

這裏就是我如何得到我的課的記錄是在做記錄

protected static Logger m_logger = Logger.getLogger(RemoteLoggingServiceImpl.class); 

,然後實際登錄我只是做

m_logger.debug("my log message"); 

使用上面的代碼,它不寫入logj4.log文件。

然後我嘗試了以下方法,它將它記錄到log4j.log文件中,但沒有按照我的預期記錄到otherFile.log文件。下面是更新後的log4j.xml文件:

<?xml version="1.0" encoding="UTF-8"?> 
<!DOCTYPE log4j:configuration SYSTEM "log4j.dtd" > 
<log4j:configuration> 
    <appender name="stdout" class="org.apache.log4j.ConsoleAppender"> 
     <layout class="org.apache.log4j.PatternLayout"> 
      <param name="ConversionPattern" value="%d{ABSOLUTE} 
     %5p %c{1}:%L - %m%n"/> 
     </layout> 
    </appender> 
    <appender name="fileAppender" class="org.apache.log4j.DailyRollingFileAppender"> 
     <param name="File" value="${catalina.home}/logs/log4j.log"/> 
     <param name="DatePattern" value="'.'yyyy-MM-dd"/> 
     <param name="Append" value="true"/> 
     <layout class="org.apache.log4j.PatternLayout"> 
      <param name="ConversionPattern" value="%d 
       %-5p [%c{1}] %m %n" /> 
     </layout> 
    </appender> 
    <appender name="otherFileAppender" class="org.apache.log4j.DailyRollingFileAppender"> 
     <param name="File" value="${catalina.home}/logs/otherFile.log"/> 
     <param name="DatePattern" value="'.'yyyy-MM-dd"/> 
     <param name="Append" value="true"/> 
     <layout class="org.apache.log4j.PatternLayout"> 
      <param name="ConversionPattern" value="%d 
       %-5p [%c{1}] %m %n" /> 
     </layout> 
    </appender> 
    <root> 
     <priority value="debug"></priority> 
     <appender-ref ref="fileAppender"/> 
    </root> 
    <logger name="com.mypackage.myLoggingClass"> 
     <level value="debug"/> 
     <appender-ref ref="otherfileAppender"/> 
    </logger> 
</log4j:configuration> 

,我創造這個記錄與此相反:

protected static Logger m_logger = Logger.getLogger("com.mypackage.myLoggingClass"); 

任何人都可以解釋爲什麼它不會在第一個場景中的所有記錄,和/或爲什麼它在第二種情況下記錄到log4j.log而不是otherFile.log?

+0

我使用log4j的版本1.2.9 – user26270

回答

0

至於我可以看到你所有的原始假設是正確的,並應打印日誌,所以這裏的一些事情,我想在這種情況下檢查:

  • 檢查你的classpath中,你有沒有導入其他日誌庫引起衝突(slf4j,通用日誌等)?
  • 檢查您的導入,是否真的org.apache.log4j。*,而不是其他日誌庫
  • 檢查gwt logging guide,它是否與log4j衝突?
  • 檢查log4j.log上的文件系統鎖定,有沒有其他進程鎖定它導致寫入失敗?
  • 檢查你的war/ear文件,是否真的放在WEB-INF/classes上的log4j.xml?
  • 檢查$ {}的catalina.home不解決你打算
1

的路徑首先,你沒有列出您使用的是什麼版本的Log4j的,所以我假設你使用的是相對最新版本的Log4j。

在示例代碼的第一個塊提供你:

<root> 
     <priority value="debug"></priority> 
     <appender-ref ref="fileAppender"/> 
    </root> 

您還沒有更改根附加器的日誌級別。每 log4j 2.x documentation

 
    If no configuration files are present logback will default to the 
    DefaultConfiguration which will set up a minimal logging environment 
    consisting of a ConsoleAppender attached to the root logger. The output 
    will be formatted using a PatternLayout set to the pattern 
    "%d{HH:mm:ss.SSS} [%t] %-5level %logger{36} - %msg%n". 

    Note that by default, the root logger is assigned to Level.ERROR. 

爲了有記錄輸出到文件中,你需要你的根記錄更改爲第一個例子:

<root level="debug"> 
     <appender-ref ref="fileAppender"/> 
    </root>  

一個很好的指標,該調試日誌記錄不因爲默認的日誌記錄級別設置爲「error」,所以你不會在控制檯上看到任何輸出。我總是喜歡在我的記錄器上安裝一個控制檯appender,以便我可以看到我的應用程序實際上正在記錄。

<appender-ref ref="Console"/> 

在第二個示例中,根記錄器沒有登錄到該文件,原因與第一個示例中的原因完全相同。但是,您設法正確設置了「com.mypackage.myLoggingClass」記錄器,這就是爲什麼當您使用基於「com.mypackage.myLoggingClass」類的記錄器時,應用程序具有調試輸出的原因。

+0

%的[Log4j的1.2的javadoc(HTTP://logging.apache .org/log4j/1.2/apidocs/org/apache/log4j/Priority.html]): 「避免直接使用此類,請改用Level類。 – brandonsimpkins

0

您的JRE使用名爲logging.properties的文件來設置處理程序和日誌級別以及其他一些設置,以便在所有Java命令中全局共享。
很多次它的默認值是handlers= java.util.logging.ConsoleHandler,你可以嘗試追加下面的java.util.logging.FileHandler

handlers= java.util.logging.FileHandler, java.util.logging.ConsoleHandler 

也可以嘗試settng文件格式,以SimpleFormatter而不是XML格式

java.util.logging.FileHandler.formatter = java.util.logging.SimpleFormatter 
相關問題