【问题标题】:Configuring gwt-log's remoteLogger; use log4j to put it in a separate file配置gwt-log的remoteLogger;使用 log4j 将其放在单独的文件中
【发布时间】:2011-08-28 16:20:08
【问题描述】:

我有一个(智能)GWT 应用程序,它在服务器端使用 Spring,并通过 log4j 在其中记录其内容。这有效(部署在 tomcat6/ubuntu 10.04 LTS 上)。

在客户端,我使用正确配置的 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 新手...任何帮助将不胜感激!

【问题讨论】:

    标签: gwt log4j tomcat6 smartgwt


    【解决方案1】:

    如果您查看 com.google.gwt.logging.server.RemoteLoggingServiceImpl 代码,您会发现它正在使用 java.util.logging.Logger 来执行它的日志记录。

    您正在使用 Log4j。

    有两个选项可以让您的日志出现在 Log4j 中。

    1. 实现您自己的 RemoteLoggingService
    2. 使用 slf4j 将 java.util.logging 与 log4j 日志记录“桥接”

    选项 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

    【讨论】:

      【解决方案2】:

      我采用了这种方法,对我有用。

      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);
          }
      }
      }
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2015-05-29
        • 2022-01-15
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2012-01-12
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多