GWT远程日志记录转到System.out而不是日志文件 [英] GWT remote logging going to System.out instead of log file
问题描述
我已经根据gwt文档设置了gwt远程日志记录,但是我的日志将转到System.out而不是写入日志文件。
我的gwt模块看起来像:
< module rename-to ='ezdappserver'>
< inherits name =com.google.gwt.logging.Logging/>
< set-property name =gwt.logging.simpleRemoteHandlervalue =ENABLED/>
< set-property name =gwt.logging.logLevelvalue =FINEST/>
< set-property name =gwt.logging.enabledvalue =TRUE/>
< / module>
我的servlet定义是这样设置的:
< servlet的>
< servlet-name> remoteLogging< / servlet-name>
< servlet-class> com.google.gwt.logging.server.RemoteLoggingServiceImpl< / servlet-class>
< / servlet>
< servlet-mapping>
< servlet-name> remoteLogging< / servlet-name>
< url-pattern> / ezdappserver / remote_logging< / url-pattern>
< / servlet-mapping>
当记录错误时,我在控制台中看到如下输出:
2014年3月26日下午2点10分36秒com.google.gwt.logging.server.RemoteLoggingServiceUtil logOnServer
SEVERE:捕获到异常:(NotFoundError )
....其余的错误....
我期待这个输出写入我的战争中某处的日志文件。此外,我真的想能够指定这个文件的位置,但我还没有找到任何文档。
任何帮助都可以非常感谢。
注意:我没有运行这种通过开发模式,这是与编译代码。
谢谢! / p>
根据您的要求,在 gwt.xml
<! - 此处理程序将日志消息发送到服务器,在那里它们将使用服务器端日志记录机制进行记录。 - >
< set-property name =gwt.logging.simpleRemoteHandlervalue =ENABLED/>
<! - 通过调用方法GWT.log记录日志。这些消息只能在DevMode窗口的开发模式中看到。 - >
< set-property name =gwt.logging.developmentModeHandlervalue =ENABLED/>
<! - 这些消息只能在DevMode窗口的开发模式中看到。 - >
<! - 当这个句柄被启用时,记录到驻留在应用程序左上角的弹出窗口。 - >
<! - 记录到Firebug Lite(适用于IE),Safari和Chrome使用的JavaScript控制台。 - >
< set-property name =gwt.logging.consoleHandlervalue =DISABLED/>
<! - 记录到萤火虫控制台。 - >
< set-property name =gwt.logging.firebugHandlervalue =DISABLED/>
如果上述配置仍然不适用于您,尝试下面的代码以及上面的配置。
添加 log4j.xml
文件以定义日志文件位置
<?xml version =1.0encoding =UTF-8?>
<!DOCTYPE log4j:configuration SYSTEMlog4j.dtd>
< log4j:configuration xmlns:log4j =http://jakarta.apache.org/log4j/>
< appender name =STDOUTclass =org.apache.log4j.ConsoleAppender>
< layout class =org.apache.log4j.PatternLayout>
< param name =ConversionPatternvalue =DT =>%d [%.4t]%-5p%c {1} - %m%n/>
< / layout>
< / appender>
< appender name =SERVER_FILE_LOGclass =org.apache.log4j.RollingFileAppender>
< param name =Filevalue =$ {jboss.server.log.dir} /logs/DataTools_Server.log/>
< param name =Appendvalue =true/>
< param name =MaxFileSizevalue =5MB/>
< param name =MaxBackupIndexvalue =10/>
< layout class =org.apache.log4j.PatternLayout>
< param name =ConversionPatternvalue =%d [%.4t]%-5p [%c]%m%n/>
< / layout>
< / appender>
< appender name =CLIENT_FILE_LOGclass =org.apache.log4j.RollingFileAppender>
< param name =Filevalue =$ {jboss.server.log.dir} /logs/DataTools_Client.log/>
< param name =Appendvalue =true/>
< param name =MaxFileSizevalue =5MB/>
< param name =MaxBackupIndexvalue =10/>
< layout class =org.apache.log4j.PatternLayout>
< param name =ConversionPatternvalue =%d [%.4t]%-5p%m%n/>
< / layout>
< / appender>
< category name =com.x.y.server>
< priority value =DEBUG/>
< appender-ref ref =SERVER_FILE_LOG/>
< appender-ref ref =STDOUT/>
< / category>
< category name =gwtRemoteLogging>
< priority value =ERROR/>
< appender-ref ref =CLIENT_FILE_LOG/>
< / category>
< root>
< priority value =ERROR/>
< appender-ref ref =SERVER_FILE_LOG/>
< / root>
< / log4j:配置>
通过执行 RemoteLoggingService
来定义您自己的日志记录servlet。
import java.util.logging.Level;
import java.util.logging.LogRecord;
import javax.servlet.ServletConfig;
import javax.servlet.ServletException;
import com.google.gwt.logging.server.StackTraceDeobfuscator;
import com.google.gwt.logging.shared.RemoteLoggingService;
import com.google.gwt.user.server.rpc.RemoteServiceServlet;
import org.apache.log4j.Logger;
/ **
*类GwtRemoteLogging。
* /
@SuppressWarnings(serial)
public class GwtRemoteLogging extends RemoteServiceServlet实现RemoteLoggingService {
/ **常量记录器。 * /
private StackTraceDeobfuscator deobfuscator = null;
private final static Logger logger = Logger.getLogger(gwtRemoteLogging);
@Override
public void init(ServletConfig config)throws ServletException {
super.init(config);
}
/ **
*记录已在服务器上使用GWT RPC进行序列化的日志记录。
*
* @返回错误信息,如果记录成功则返回null。
* /
public final String logOnServer(LogRecord lr){
try {
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 {
logger.trace(lr.getMessage(),lr.getThrown());
} catch(Exception e){
logger.error(Remote logging failed,e);
返回远程记录失败,请查看堆栈跟踪以了解详细信息。;
}
返回null;
}
/ **
*默认情况下,该服务不会执行任何反混淆处理。为了执行服务器端
*反混淆处理,必须将symbolMaps文件复制到服务器可见的目录,并使用此方法设置目录
*。
*
* @param symbolMapsDir
* /
public void setSymbolMapsDirectory(String symbolMapsDir){
if(deobfuscator == null){
deobfuscator = new StackTraceDeobfuscator(symbolMapsDir);
} else {
deobfuscator.setSymbolMapsDirectory(symbolMapsDir);
}
}
}
web.xml
< servlet>
< servlet-name> remoteLogServlet< / servlet-name>
< servlet-class> com.x.y.server.servlet.GwtRemoteLogging< / servlet-class>
< / servlet>
< servlet-mapping>
< servlet-name> remoteLogServlet< / servlet-name>
< url-pattern> / ezdappserver / remote_logging< / url-pattern>
< / servlet-mapping>
I have setup gwt remote logging based on the gwt documentation, however my logs are going to System.out instead of being written to a log file.
My gwt module looks like:
<module rename-to='ezdappserver'>
<inherits name="com.google.gwt.logging.Logging"/>
<set-property name="gwt.logging.simpleRemoteHandler" value="ENABLED" />
<set-property name="gwt.logging.logLevel" value="FINEST"/>
<set-property name="gwt.logging.enabled" value="TRUE"/>
<set-property name="gwt.logging.consoleHandler" value="ENABLED" />
<set-property name="gwt.logging.popupHandler" value="DISABLED" />
</module>
My servlet definition is setup like:
<servlet>
<servlet-name>remoteLogging</servlet-name>
<servlet-class>com.google.gwt.logging.server.RemoteLoggingServiceImpl</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>remoteLogging</servlet-name>
<url-pattern>/ezdappserver/remote_logging</url-pattern>
</servlet-mapping>
When an error is logged I see output in my console like so:
Mar 26, 2014 2:10:36 PM com.google.gwt.logging.server.RemoteLoggingServiceUtil logOnServer
SEVERE: Exception caught: (NotFoundError)
....Rest of error....
I was expecting this output to be written to a log file somewhere in my war. Also, I would really like to be able to specify where this file is located, however I haven't been able to find any documentation on that either.
Any help would be much appreciated.
NOTE: I am not running this through dev mode, this is with compiled code.
Thanks!
Try below options also in gwt.xml
based on your requirement:
<!-- This handler sends log messages to the server, where they will be logged using the server side logging mechanism. -->
<set-property name="gwt.logging.simpleRemoteHandler" value="ENABLED" />
<!-- Logs by calling method GWT.log. These messages can only be seen in Development Mode in the DevMode window. -->
<set-property name="gwt.logging.developmentModeHandler" value="ENABLED" />
<!-- These messages can only be seen in Development Mode in the DevMode window. -->
<set-property name="gwt.logging.systemHandler" value="ENABLED" />
<!-- Logs to the popup which resides in the upper left hand corner of application when this handler is enabled. -->
<set-property name="gwt.logging.popupHandler" value="DISABLED" />
<!-- Logs to the javascript console, which is used by Firebug Lite (for IE), Safari and Chrome. -->
<set-property name="gwt.logging.consoleHandler" value="DISABLED"/>
<!-- Logs to the firebug console. -->
<set-property name="gwt.logging.firebugHandler" value="DISABLED" />
If above configuration are still not working for you then try below code along with above configuration.
Add log4j.xml
file to define the log file location with log level
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE log4j:configuration SYSTEM "log4j.dtd">
<log4j:configuration xmlns:log4j="http://jakarta.apache.org/log4j/">
<appender name="STDOUT" class="org.apache.log4j.ConsoleAppender">
<layout class="org.apache.log4j.PatternLayout">
<param name="ConversionPattern" value="DT=> %d [%.4t] %-5p %c{1} - %m%n" />
</layout>
</appender>
<appender name="SERVER_FILE_LOG" class="org.apache.log4j.RollingFileAppender">
<param name="File" value="${jboss.server.log.dir}/logs/DataTools_Server.log" />
<param name="Append" value="true" />
<param name="MaxFileSize" value="5MB" />
<param name="MaxBackupIndex" value="10" />
<layout class="org.apache.log4j.PatternLayout">
<param name="ConversionPattern" value="%d [%.4t] %-5p [%c] %m%n" />
</layout>
</appender>
<appender name="CLIENT_FILE_LOG" class="org.apache.log4j.RollingFileAppender">
<param name="File" value="${jboss.server.log.dir}/logs/DataTools_Client.log" />
<param name="Append" value="true" />
<param name="MaxFileSize" value="5MB" />
<param name="MaxBackupIndex" value="10" />
<layout class="org.apache.log4j.PatternLayout">
<param name="ConversionPattern" value="%d [%.4t] %-5p %m%n" />
</layout>
</appender>
<category name="com.x.y.server">
<priority value="DEBUG" />
<appender-ref ref="SERVER_FILE_LOG" />
<appender-ref ref="STDOUT" />
</category>
<category name="gwtRemoteLogging">
<priority value="ERROR" />
<appender-ref ref="CLIENT_FILE_LOG" />
</category>
<root>
<priority value ="ERROR" />
<appender-ref ref="SERVER_FILE_LOG" />
</root>
</log4j:configuration>
Define you own logging servlet by implementing RemoteLoggingService
import java.util.logging.Level;
import java.util.logging.LogRecord;
import javax.servlet.ServletConfig;
import javax.servlet.ServletException;
import com.google.gwt.logging.server.StackTraceDeobfuscator;
import com.google.gwt.logging.shared.RemoteLoggingService;
import com.google.gwt.user.server.rpc.RemoteServiceServlet;
import org.apache.log4j.Logger;
/**
* The Class GwtRemoteLogging.
*/
@SuppressWarnings("serial")
public class GwtRemoteLogging extends RemoteServiceServlet implements RemoteLoggingService {
/** The Constant logger. */
private StackTraceDeobfuscator deobfuscator = null;
private final static Logger logger = Logger.getLogger("gwtRemoteLogging");
@Override
public void init(ServletConfig config) throws ServletException {
super.init(config);
}
/**
* 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) {
try {
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 {
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);
}
}
}
web.xml
<servlet>
<servlet-name>remoteLogServlet</servlet-name>
<servlet-class>com.x.y.server.servlet.GwtRemoteLogging</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>remoteLogServlet</servlet-name>
<url-pattern>/ezdappserver/remote_logging</url-pattern>
</servlet-mapping>
这篇关于GWT远程日志记录转到System.out而不是日志文件的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!