2011-08-28 59 views
3

我有一个(智能)GWT应用程序,它在服务器端使用Spring,并通过log4j将其日志记录在那里。这可以工作(部署在tomcat6/ubuntu 10.04 LTS上)。配置gwt-log的remoteLogger;使用log4j把它放在一个单独的文件

在客户端,我使用正确配置的gwt-log远程日志记录库。在运行调试模式时,我在Eclipse的“开发模式”窗格中看到gwt-logs。但是,当部署时,我没有看到gwt-log日志。我已经配置如下事情:

<log4j:configuration xmlns:log4j="http://jakarta.apache.org/log4j/"> 
... 
<appender name="FILE_LOG2" class="org.apache.log4j.FileAppender"> 
    <param name="File" value="${PuzzelVandaag-instance-root}WEB-INF/logs/Sytematic.log" /> 
    <param name="Append" value="true" />   
    <layout class="org.apache.log4j.PatternLayout"> 
    <param name="ConversionPattern" value="--- %d [%.4t] %-5p %c{1} - %m%n"/> 
    </layout>  
</appender> 
... 
<!-- this one works, normal server-side code --> 
<category name="com.isomorphic"> 
    <priority value="DEBUG" /> 
    <appender-ref ref="FILE_LOG2" /> 
</category> 
<!-- currently I use this to configure gwt-log stuff. Is this the right way? --> 
<category name="gwt-log"> 
    <level value="DEBUG" /> 
    <appender-ref ref="FILE_LOG2"/> 
</category> 

服务器端包日志记录的作品,但我有一个客户端的麻烦。我非常确定远程日志记录servlet的工作原理,因为我没有看到任何错误。我有它配置如下,在web.xml:

<servlet> 
    <servlet-name>gwt-log-remote-logger-servlet</servlet-name> 
    <servlet-class>com.allen_sauer.gwt.log.server.RemoteLoggerServiceImpl</servlet-class> 
</servlet> 
<servlet-mapping> 
    <servlet-name>gwt-log-remote-logger-servlet</servlet-name> 
    <url-pattern>/[modulename]/gwt-log</url-pattern> 
</servlet-mapping> 

当我登录的东西,我不喜欢Log.debug("some msg")通话,而进口com.allen_sauer.gwt.log.client.Log

总而言之,我认为我遵循了正确的方法。我还与-Dlog4j.debug参数运行托管模式,而这也正是它告诉我:

log4j: Retreiving an instance of org.apache.log4j.Logger. 
log4j: Setting [gwt-log] additivity to [true]. 
log4j: Level value for gwt-log is [DEBUG]. 
log4j: gwt-log level set to DEBUG 
log4j: Adding appender named [STDOUT] to category [gwt-log]. 
log4j: Adding appender named [SmartClientLog] to category [gwt-log]. 
log4j: Adding appender named [FILE_LOG2] to category [gwt-log]. 

完成,这里是.gwt.xml的相关部分:

<inherits name="com.allen_sauer.gwt.log.gwt-log-DEBUG"/> 
<set-property name="log_DivLogger" value="DISABLED"/> 
<!-- In gwt-log-3.0.3 or later --> 
<inherits name="com.allen_sauer.gwt.log.gwt-log-RemoteLogger"/> 

上午我错过了明显的东西?我是一个log4j新手...任何帮助将不胜感激!

回答

4

如果查看com.google.gwt.logging.server.RemoteLoggingServiceImpl代码,您将看到它使用java.util.logging.Logger执行日志记录。

您正在使用Log4j。

有两种选择让您的日志出现在Log4j中。

  1. 实现自己RemoteLoggingService
  2. 使用SLF4J为 “桥” 与log4j的日志记录java.util.logging中

选项1不是太难。 我有我为此创建的类下面。记住将你的web.xml指向这个新类。

import java.util.logging.LogRecord; 

    import com.google.gwt.logging.shared.RemoteLoggingService; 
    import com.google.gwt.user.server.rpc.RemoteServiceServlet; 

    import java.util.logging.Level; 
    import org.springframework.stereotype.Component; 

    public class MyRemoteLoggingServlet extends RemoteServiceServlet implements RemoteLoggingService { 

     private final MyLogger logger = MyLoggerFactory.getLogger(getClass()); 

     @Override 
     public String logOnServer(LogRecord record) { 

      Level level = record.getLevel(); 
      String message = record.getMessage(); 

      if (Level.INFO.equals(level)) { 
       logger.info(message); 
      } else if (Level.SEVERE.equals(level)) { 
       logger.error(message); 
      } else if (Level.WARNING.equals(level)) { 
       logger.warn(message); 
      } else if (Level.FINE.equals(level)) { 
       logger.debug(message); 
      } 

      return null; 
     } 

    } 

选项2

在此选项中使用SLF4J为您记录和配置将使用java.util.logging.Logger重定向到的Log4j的桥梁。 我自己没有实施这种方法,但你可以在这里阅读: JUL to SLF4J Bridge

0

我采取了这种方法,适合我。

public class UILogging extends RemoteServiceServlet implements 
    RemoteLoggingService { 

private static final String SYMBOL_MAPS = "symbolMaps"; 

private static StackTraceDeobfuscator deobfuscator = null; 

private static Logger logger = Logger.getLogger(UILogging.class); 

@Override 
public void init(ServletConfig config) throws ServletException { 
    super.init(config); 
    setSymbolMapsDirectory(config.getInitParameter(SYMBOL_MAPS)); 
} 

/** 
* Logs a Log Record which has been serialized using GWT RPC on the server. 
* 
* @return either an error message, or null if logging is successful. 
*/ 
public final String logOnServer(LogRecord lr) { 
    String strongName = getPermutationStrongName(); 
    try { 
     if (deobfuscator != null) { 
      lr = deobfuscator.deobfuscateLogRecord(lr, strongName); 
     } 
     if (lr.getLevel().equals(Level.SEVERE)) { 
      logger.error(lr.getMessage(),lr.getThrown()); 
     } else if (lr.getLevel().equals(Level.INFO)) { 
      logger.info(lr.getMessage(),lr.getThrown()); 
     } else if (lr.getLevel().equals(Level.WARNING)) { 
      logger.warn(lr.getMessage(),lr.getThrown()); 
     } else if (lr.getLevel().equals(Level.FINE)) { 
      logger.debug(lr.getMessage(),lr.getThrown()); 
     } else if (lr.getLevel().equals(Level.ALL)) { 
      logger.trace(lr.getMessage(),lr.getThrown()); 
     } 
    } catch (Exception e) { 
     logger.error("Remote logging failed", e); 
     return "Remote logging failed, check stack trace for details."; 
    } 
    return null; 
} 

/** 
* By default, this service does not do any deobfuscation. In order to do 
* server side deobfuscation, you must copy the symbolMaps files to a 
* directory visible to the server and set the directory using this method. 
* 
* @param symbolMapsDir 
*/ 
public void setSymbolMapsDirectory(String symbolMapsDir) { 
    if (deobfuscator == null) { 
     deobfuscator = new StackTraceDeobfuscator(symbolMapsDir); 
    } else { 
     deobfuscator.setSymbolMapsDirectory(symbolMapsDir); 
    } 
} 
} 
相关问题