GWT远程日志记录转到System.out而不是日志文件

时间:2014-03-26 18:28:35

标签: gwt

我已根据gwt文档设置了gwt远程日志记录,但是我的日志将转到System.out而不是写入日志文件。

我的gwt模块看起来像:

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

我的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>

当记录错误时,我在控制台中看到输出如下:

Mar 26, 2014 2:10:36 PM com.google.gwt.logging.server.RemoteLoggingServiceUtil logOnServer
SEVERE: Exception caught: (NotFoundError) 
....Rest of error....

我期待这个输出在我的战争中的某个地方写入日志文件。此外,我真的希望能够指定此文件的位置,但是我无法找到任何文档。

非常感谢任何帮助。

注意:我没有通过开发模式运行它,这是使用已编译的代码。

谢谢!

2 个答案:

答案 0 :(得分:2)

根据您的要求,在gwt.xml中尝试以下选项:

<!-- 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" /> 

如果上述配置仍然无效,请尝试以下代码以及上述配置。

添加log4j.xml文件以定义日志级别

的日志文件位置
<?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>

通过实施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;

/**
 * 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>

答案 1 :(得分:2)

RemoteServiceServlet使用java.util.logging进行记录,by default使用System.err登录到控制台(System.out,而不是java.util.logging BTW。

如果要登录文件,则必须配置lib/logging.properties;编辑全局java.util.logging.config.file(不推荐),使用您自己使用logging.properties系统属性传递给JVM的配置文件,或者以编程方式编辑。

根据您的servlet容器,可以通过不同方式进行配置。例如,Tomcat将在WEB-INF/classes中读取{{1}}个文件:http://tomcat.apache.org/tomcat-7.0-doc/logging.html#Using_java.util.logging_(default)