Revision: 8482
Author: [email protected]
Date: Wed Aug 4 16:16:12 2010
Log: Add logging to scaffold and expenses apps
Review at http://gwt-code-reviews.appspot.com/725803
Review by: [email protected]
http://code.google.com/p/google-web-toolkit/source/detail?r=8482
Modified:
/trunk/bikeshed/src/com/google/gwt/sample/expenses/gwt/ExpensesCommon.gwt.xml
/trunk/bikeshed/src/com/google/gwt/sample/expenses/gwt/Scaffold.gwt.xml
/trunk/bikeshed/src/com/google/gwt/sample/expenses/gwt/ScaffoldCommon.gwt.xml
/trunk/user/src/com/google/gwt/requestfactory/client/RequestFactoryLogHandler.java
/trunk/user/src/com/google/gwt/requestfactory/client/impl/RequestFactoryJsonImpl.java
=======================================
---
/trunk/bikeshed/src/com/google/gwt/sample/expenses/gwt/ExpensesCommon.gwt.xml
Wed Jun 9 09:35:40 2010
+++
/trunk/bikeshed/src/com/google/gwt/sample/expenses/gwt/ExpensesCommon.gwt.xml
Wed Aug 4 16:16:12 2010
@@ -6,6 +6,7 @@
<inherits name='com.google.gwt.sample.bikeshed.style.Style'/>
<inherits name='com.google.gwt.mobile.Mobile'/>
<inherits name='com.google.gwt.user.cellview.CellView'/>
+ <inherits name='com.google.gwt.logging.Logging'/>
<source path='client'/>
<source path='request'/>
@@ -15,4 +16,16 @@
<!-- Default Locale. -->
<extend-property name="locale" values="en"/>
<set-property-fallback name="locale" value="en"/>
+
+ <!-- Logging Configuration -->
+ <set-property name="gwt.logging.enabled" value="TRUE"/>
+ <set-property name="gwt.logging.logLevel" value="INFO"/>
+ <set-property name="gwt.logging.consoleHandler" value="ENABLED" />
+ <set-property name="gwt.logging.developmentModeHandler" value="ENABLED"
/>
+ <set-property name="gwt.logging.firebugHandler" value="ENABLED" />
+ <set-property name="gwt.logging.hasWidgetsHandler" value="DISABLED" />
+ <set-property name="gwt.logging.popupHandler" value="DISABLED" />
+ <set-property name="gwt.logging.systemHandler" value="ENABLED" />
+ <set-property name="gwt.logging.simpleRemoteHandler" value="DISABLED" />
+
</module>
=======================================
--- /trunk/bikeshed/src/com/google/gwt/sample/expenses/gwt/Scaffold.gwt.xml
Wed Jul 28 16:39:40 2010
+++ /trunk/bikeshed/src/com/google/gwt/sample/expenses/gwt/Scaffold.gwt.xml
Wed Aug 4 16:16:12 2010
@@ -22,17 +22,4 @@
<inherits name="com.google.gwt.sample.expenses.gwt.ExpensesCommon" />
<entry-point class="com.google.gwt.sample.expenses.gwt.client.Scaffold"
/>
- <!-- Logging Configuration -->
- <!-- Right now, App Engine Dev Mode logging is borken for everything
other
- than the system handler, so only that one is enabled for now
- <set-property name="gwt.logging.enabled" value="TRUE"/>
- <set-property name="gwt.logging.logLevel" value="INFO"/>
- <set-property name="gwt.logging.consoleHandler" value="DISABLED" />
- <set-property name="gwt.logging.developmentModeHandler" value="DISABLED"
/>
- <set-property name="gwt.logging.firebugHandler" value="DISABLED" />
- <set-property name="gwt.logging.hasWidgetsHandler" value="DISABLED" />
- <set-property name="gwt.logging.popupHandler" value="DISABLED" />
- <set-property name="gwt.logging.systemHandler" value="ENABLED" />
- <set-property name="gwt.logging.simpleRemoteHandler" value="DISABLED" />
--->
</module>
=======================================
---
/trunk/bikeshed/src/com/google/gwt/sample/expenses/gwt/ScaffoldCommon.gwt.xml
Mon Jun 7 12:20:31 2010
+++
/trunk/bikeshed/src/com/google/gwt/sample/expenses/gwt/ScaffoldCommon.gwt.xml
Wed Aug 4 16:16:12 2010
@@ -6,9 +6,22 @@
<inherits name='com.google.gwt.sample.bikeshed.style.Style'/>
<inherits name='com.google.gwt.mobile.Mobile'/>
<inherits name='com.google.gwt.user.cellview.CellView'/>
-
+ <inherits name='com.google.gwt.logging.Logging'/>
+
<source path='client'/>
<source path='request'/>
<source path='place'/>
<source path='ui'/>
+
+ <!-- Logging Configuration -->
+ <set-property name="gwt.logging.enabled" value="TRUE"/>
+ <set-property name="gwt.logging.logLevel" value="INFO"/>
+ <set-property name="gwt.logging.consoleHandler" value="ENABLED" />
+ <set-property name="gwt.logging.developmentModeHandler" value="ENABLED"
/>
+ <set-property name="gwt.logging.firebugHandler" value="ENABLED" />
+ <set-property name="gwt.logging.hasWidgetsHandler" value="DISABLED" />
+ <set-property name="gwt.logging.popupHandler" value="DISABLED" />
+ <set-property name="gwt.logging.systemHandler" value="ENABLED" />
+ <set-property name="gwt.logging.simpleRemoteHandler" value="DISABLED" />
+
</module>
=======================================
---
/trunk/user/src/com/google/gwt/requestfactory/client/RequestFactoryLogHandler.java
Fri Jul 30 07:51:15 2010
+++
/trunk/user/src/com/google/gwt/requestfactory/client/RequestFactoryLogHandler.java
Wed Aug 4 16:16:12 2010
@@ -20,8 +20,6 @@
import com.google.gwt.requestfactory.shared.RequestFactory;
import com.google.gwt.valuestore.shared.SyncResult;
-import java.util.ArrayList;
-import java.util.List;
import java.util.Set;
import java.util.logging.Handler;
import java.util.logging.Level;
@@ -46,59 +44,51 @@
Logger.getLogger(RequestFactoryLogHandler.class.getName());
private boolean closed;
- private List<LogRecord> records;
private RequestFactory requestFactory;
-
- public RequestFactoryLogHandler(RequestFactory requestFactory) {
- this(requestFactory, Level.INFO);
- }
+ private String ignoredLoggerSubstring;
/**
* Since records from this handler go accross the wire, it should only be
* used for important messages, and it's Level will often be higher than
the
- * Level being used app-wide.
- * Do not set the level of this handler below FINER messages, since it
logs
- * messages at that level to acknowledge success/failure, and would cause
- * an infinite loop.
+ * Level being used app-wide. This handler also takes a string which it
will
+ * use to exclude the messages from some loggers. This usually includes
the
+ * name of the logger(s) which will be used to log acknowledgements of
+ * activity going accross the wire. If we did not exclude these loggers,
an
+ * infinite loop would occur.
*/
- public RequestFactoryLogHandler(RequestFactory requestFactory, Level
level) {
+ public RequestFactoryLogHandler(RequestFactory requestFactory, Level
level,
+ String ignoredLoggerSubstring) {
this.requestFactory = requestFactory;
+ this.ignoredLoggerSubstring = ignoredLoggerSubstring;
closed = false;
- records = new ArrayList<LogRecord>();
setLevel(level);
}
@Override
public void close() {
- flush();
closed = true;
}
@Override
public void flush() {
- if (!closed) {
- // We go ahead and just send a request for every message. The request
- // factory will take care of the batching for us. Once we can send
- // something more complex than Strings to the logMessage function,
then
- // we can do batching here.
- for (LogRecord record : records) {
- Receiver<Long> loggingReceiver = new LoggingReceiver();
- requestFactory.loggingRequest().logMessage(
- record.getLevel().toString(),
- record.getLoggerName(),
- record.getMessage()).fire(loggingReceiver);
- }
- }
+ // Do nothing
}
@Override
public void publish(LogRecord record) {
- if (!closed && isLoggable(record)) {
- records.add(record);
- // For now, just flush every time since a new request is sent for
every
- // record anyway.
- flush();
- }
+ if (closed || !isLoggable(record)) {
+ return;
+ }
+
+ if (record.getLoggerName().contains(ignoredLoggerSubstring)) {
+ return;
+ }
+
+ Receiver<Long> loggingReceiver = new LoggingReceiver();
+ requestFactory.loggingRequest().logMessage(
+ record.getLevel().toString(),
+ record.getLoggerName(),
+ record.getMessage()).fire(loggingReceiver);
}
}
=======================================
---
/trunk/user/src/com/google/gwt/requestfactory/client/impl/RequestFactoryJsonImpl.java
Wed Aug 4 14:25:37 2010
+++
/trunk/user/src/com/google/gwt/requestfactory/client/impl/RequestFactoryJsonImpl.java
Wed Aug 4 16:16:12 2010
@@ -22,6 +22,7 @@
import com.google.gwt.http.client.RequestCallback;
import com.google.gwt.http.client.RequestException;
import com.google.gwt.http.client.Response;
+import com.google.gwt.requestfactory.client.RequestFactoryLogHandler;
import com.google.gwt.requestfactory.shared.RequestEvent;
import com.google.gwt.requestfactory.shared.RequestFactory;
import com.google.gwt.requestfactory.shared.RequestObject;
@@ -66,7 +67,14 @@
}
}
- private static Logger logger =
Logger.getLogger(RequestFactory.class.getName());
+ private static Logger logger =
+ Logger.getLogger(RequestFactory.class.getName());
+
+ // A separate logger for wire activity, which does not get logged by the
+ // remote log handler, so we avoid infinite loops. All log messages that
+ // could happen every time a request is made from the server should be
logged
+ // to this logger.
+ private static Logger wireLogger =
Logger.getLogger("WireActivityLogger");
private static String SERVER_ERROR = "Server Error";
@@ -107,16 +115,22 @@
public void onError(Request request, Throwable exception) {
postRequestEvent(State.RECEIVED, null);
- logger.log(Level.SEVERE, SERVER_ERROR, exception);
+ wireLogger.log(Level.SEVERE, SERVER_ERROR, exception);
}
public void onResponseReceived(Request request, Response response) {
- logger.finest("Response received");
+ wireLogger.finest("Response received");
if (200 == response.getStatusCode()) {
String text = response.getText();
requestObject.handleResponseText(text);
- } else {
- logger.severe(SERVER_ERROR + " (" + response.getStatusText()
+ ")");
+ } else if (response.SC_UNAUTHORIZED == response.getStatusCode()) {
+ wireLogger.finest("Need to log in");
+ } else if (response.getStatusCode() > 0) {
+ // During the redirection for logging in, we get a response with
no
+ // status code, but it's not an error, so we only log errors with
+ // bad status codes here.
+ wireLogger.severe(SERVER_ERROR + " " + response.getStatusCode() +
+ " " + response.getText());
}
postRequestEvent(State.RECEIVED, response);
}
@@ -124,11 +138,11 @@
});
try {
- logger.finest("Sending fire request");
+ wireLogger.finest("Sending fire request");
builder.send();
postRequestEvent(State.SENT, null);
} catch (RequestException e) {
- logger.log(Level.SEVERE, SERVER_ERROR + " (" + e.getMessage() + ")",
e);
+ wireLogger.log(Level.SEVERE, SERVER_ERROR + " (" + e.getMessage()
+ ")", e);
}
}
@@ -142,16 +156,9 @@
protected void init(HandlerManager handlerManager, RecordToTypeMap map) {
this.valueStore = new ValueStoreJsonImpl(handlerManager, map);
this.handlerManager = handlerManager;
- // This Handler should really get added to the Root Logger here, but
until
- // App Engine Dev Mode logging is fixed, we can't use client side
handlers
- // on the Root Logger. Instead, just add it to our own logger as a
proof of
- // concept, and then log a Severe message to it to prove that it's
working
- // All the "finest" messages that this class normally logs are not
logged
- // to this handler since it would cause an infinite loop.
- // TODO(unnurg): Once this is all set up, ensure that the severe
messages
- // in this class do not cause infinite loops during legitimate errors.
- // logger.addHandler(new RequestFactoryLogHandler(this));
- logger.severe("Successful initialization!");
+ Logger.getLogger("").addHandler(new RequestFactoryLogHandler(
+ this, Level.WARNING, wireLogger.getName()));
+ logger.fine("Successfully initialized RequestFactory");
}
private void postRequestEvent(State received, Response response) {
--
http://groups.google.com/group/Google-Web-Toolkit-Contributors