2016-08-30 65 views
0

我最近更新了Java Web服務應用程序中的log4j,從v1.2到v2.6.2;該應用程序託管在Tomcat 7.0.21上,使用Java 7.0_67-b01;使用Eclipse Juno編碼/編譯(v4.2.0)。創建但未編寫log4j2文件

我在新的lo4j2.xml配置文件中複製了log4j.properties功能。代碼示例如下,我試圖除了標準的控制檯appender之外還使用RollingFile appender和文件appender。

正在創建日誌文件的預期位置,但它們仍爲空。控制檯本身正在記錄我的應用程序拋出的所有消息;卡塔利娜。 yyyy-mm-dd .log文件正在記錄Info級別和更高級別。如上所述,創建了tearLog.log和tearsLogRF.log文件,但根本沒有寫入日誌消息。

log4j2.xml:

<?xml version="1.0" encoding="UTF-8"?> 
<Configuration status="trace"> 
    <Properties> 
     <Property name="log-path">${sys:catalina.home}/logs</Property> 
    </Properties> 
    <Appenders> 
     <Console name="Console" 
       target="SYSTEM_OUT"> 
      <PatternLayout pattern="%d{yyyy-MM-dd HH:mm:ss.SSS} %-5p %t [%t] (%F:%L) - %m%n" /> 
     </Console> 

     <File name="MyFile" 
       append="true" immediateFlush="true" 
       fileName="${log-path}/tearsLog.log"> 
      <PatternLayout pattern="%d{yyyy-MM-dd HH:mm:ss.SSS} %-5p %t [%t] (%F:%L) - %m%n" /> 
     </File> 

     <RollingFile name="MyRollingFile" 
       append="true" immediateFlush="true" 
       fileName="${log-path}/tearsLogRF.log" 
       filePattern="${log-path}/tearsLogRF_%d{yyyy-MM-dd_HH-mm-ss}.log"> 
      <PatternLayout pattern="%d{yyyy-MM-dd HH:mm:ss.SSS} %-5p %t [%t] (%F:%L) - %m%n" /> 
      <Policies> 
       <TimeBasedTriggeringPolicy /> 
       <SizeBasedTriggeringPolicy size="100 KB" /> 
      </Policies> 
      <DefaultRolloverStrategy max="10" /> 
     </RollingFile> 
    </Appenders> 

    <Loggers> 
     <Logger name="us.ak.state.adfg.tears.service.TearsService" level="info" additivity="false"> 
      <AppenderRef ref="Console" /> 
      <AppenderRef ref="MyFile" level="trace" /> 
      <AppenderRef ref="MyRollingFile" /> 
     </Logger> 

     <Logger name="us.ak.state.adfg.tears.data.GenericDao" level="info" additivity="false"> 
      <AppenderRef ref="MyFile" level="trace" /> 
      <AppenderRef ref="MyRollingFile" /> 
     </Logger> 

     <Logger name="us.ak.state.adfg.tears.data.EmployeeDao" level="info" additivity="false"> 
      <AppenderRef ref="MyFile" level="trace" /> 
      <AppenderRef ref="MyRollingFile" /> 
     </Logger> 

     <Logger name="us.ak.state.adfg.tears.data.TimesheetDao" level="info" additivity="false"> 
      <AppenderRef ref="MyFile" level="trace" /> 
      <AppenderRef ref="MyRollingFile" /> 
     </Logger> 

     <Logger name="us.ak.state.adfg.tears.data.SecurityDao" level="info" additivity="false"> 
      <AppenderRef ref="MyFile" level="trace" /> 
      <AppenderRef ref="MyRollingFile" /> 
     </Logger> 

     <Root level="debug"> 
      <AppenderRef ref="Console" /> 
      <AppenderRef ref="MyFile" level="trace" additivity="false" /> 
      <AppenderRef ref="MyRollingFile" additivity="false" /> 
     </Root> 
    </Loggers> 
</Configuration> 

樣品*的.java類:

package us.ak.state.adfg.tears.service; 

import java.util.Date; 

import org.apache.logging.log4j.LogManager; 
import org.apache.logging.log4j.Logger; 


public class TearsService { 
    static Logger log = LogManager.getLogger(TearsService.class); 

    public TearsService() { 
    } 

    public int saveTimesheet(User user, Timesheet ts) throws Exception {   
     String msg = ""; 
     if (user == null) { 
      msg = "Null user."; 
      log.error(msg); 
      throw new Exception(msg); 
     } 
     ... 
     return 0; 
    } 

我一直在揮舞而去,看了很多很多的代碼示例,Apache的log4j文檔和SO問題/答案,使用示例代碼和建議...無法弄清楚什麼是錯的。我知道它很接近,只是一些小問題讓我無法修復它。希望得到一些幫助。在此先感謝...

+0

請勿在評論中發佈。編輯問題。刪除評論。 – Andreas

回答

1

您看到的控制檯上的消息可能是由tomcat發佈的。如果您僅運行此示例代碼,則可以確保日誌中沒有任何內容 - 唯一的日誌是在出錯時完成的。更改代碼:

public int saveTimesheet(User user, Timesheet ts) throws Exception {   
    String msg = ""; 
    log.info("Message:{}",msg); 
    if (user == null) { 
     msg = "Null user."; 
     log.error(msg); 
     throw new Exception(msg); 
    } 
    ... 
    return 0; 
} 

順便說一句,你不應該定義爲每個類記錄儀,它是足夠的公共記錄的一切:

<Loggers> 
    <root level="debug"> 
     ... 
    </root> 
    <Logger name="us.ak.state.adfg.tears" level="info" additivity="false"> 
     <AppenderRef ref="Console" /> 
     <AppenderRef ref="MyFile" level="trace"/> 
     <AppenderRef ref="MyRollingFile" /> 
    </Logger> 

</Loggers> 
+0

感謝您的提示,我希望我可以減少代碼重複。你得到一個A的努力......但最終,重新啓動Tomcat服務器神奇地解決了這個問題。奇怪的是必要的,代碼和log4j模塊都是自包含在應用程序中,我認爲重新部署會使它工作(它創建的文件)?無論如何,它現在似乎在工作。 – jwdvorak

+0

努力的A?爲什麼不upvote呢? –

0

最後,重新啓動Tomcat服務器神奇地固定問題。奇怪的是,代碼和log4j模塊都是自包含在應用程序中,我認爲只需重新部署應用程序將使其工作(它創建的文件)?無論如何,它現在似乎在工作。