Настройка gwt-log remoteLogger; используйте log4j, чтобы поместить его в отдельный файл - PullRequest
3 голосов
/ 28 августа 2011

У меня есть (Smart) GWT-приложение, которое использует Spring на стороне сервера и регистрирует там свои вещи через log4j.Это работает (развертывание на tomcat6 / ubuntu 10.04 LTS).

На стороне клиента я использую библиотеку удаленного ведения журнала gwt-log, настроенную правильно.При работе в режиме отладки я вижу gwt-logs на панели Eclipse «Режим разработки».Однако при развертывании я не вижу логи 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> 

Журналирование пакетов на стороне сервера работает, но у меня проблемы с клиентской стороной.Я уверен, что сервлет удаленной регистрации работает, так как я не вижу никаких ошибок в этом.У меня он настроен следующим образом, в 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.

All-in-Я думаю, я следовал правильному подходу.Я также запускаю хост-режим с параметром -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 ... Любая помощь будет принята с благодарностью!

Ответы [ 2 ]

4 голосов
/ 10 апреля 2012

Если вы посмотрите на код com.google.gwt.logging.server.RemoteLoggingServiceImpl, то увидите, что он использует java.util.logging.Logger для ведения журнала.

Вы используете Log4j.

Существует два варианта отображения журналов в Log4j.

  1. Реализация собственного сервиса RemoteLoggingService
  2. Используйте slf4j для "моста" java.util.logging с log4j 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. Я не реализовал этот метод сам, но вы можете прочитать об этом здесь: Мост с июля по SLF4J

0 голосов
/ 06 сентября 2012

Я выбрал этот подход, у меня работает.

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