2011-08-28 55 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); 
    } 
} 
} 
相關問題