2016-08-30 66 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模块都是自包含在应用程序中,我认为只需重新部署应用程序将使其工作(它创建的文件)?无论如何,它现在似乎在工作。