我有一个(智能)GWT 应用程序,它在服务器端使用 Spring,并通过 log4j 记录它的内容。这有效(部署在 tomcat6/ubuntu 10.04 LTS 上)。
在客户端,我使用正确配置的 gwt-log 远程日志记录库。运行 Debug模式时,我在 Eclipse 的“开发模式” Pane 中看到了 gwt 日志。但是,部署后,我看不到 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 新手...任何帮助将不胜感激!
最佳答案
如果您查看 com.google.gwt.logging.server.RemoteLoggingServiceImpl 代码,您会发现它使用 java.util.logging.Logger 来执行日志记录。
您正在使用 Log4j。
有两个选项可以让您的日志出现在 Log4j 中。
- 实现您自己的 RemoteLoggingService
- 使用 slf4j 将 java.util.logging 与 log4j 日志“桥接”
选项 1 并不太难。 我在为此创建的类(class)下面。请记住将您的 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
关于gwt - 配置 gwt-log 的 remoteLogger;使用log4j把它放在一个单独的文件中,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7222124/