如何在 GWT 中打印到控制台

我正在调试一个 GWT 应用程序,为了测试的目的,我需要将一些内容打印到控制台。System.out.printlnGWT.log不起作用。有人知道吗?

78010 次浏览

Quoting the documentation:

Adding GWT logging is really quite simple, as simple as the following code example. However — understanding how logging works, and how to correctly configure it is important, so please do take the time to read the rest of this document.

http://code.google.com/webtoolkit/doc/latest/DevGuideLogging.html

The simplest way to enable logging is:

# In your .gwt.xml file
<inherits name="com.google.gwt.logging.Logging"/>


# In your .java file
Logger logger = java.util.logging.Logger.getLogger("NameOfYourLogger");
logger.log(Level.SEVERE, "this message should get logged");

I needed to do this in the context of a GWT application that was deployed to an Android device/emulator via PhoneGap (and gwt-phonegap). Neither System.out.println() nor GWT logging as above (with module declaration) showed up in Android's logcat, so I resorted to a simple JSNI wrapper to console.log:

  public void onModuleLoad()
{
Logger logger = Logger.getLogger("Test1.java");
logger.log(Level.INFO, "ash: starting onModuleLoad (1)"); // not in logcat
System.out.println( "ash: starting onModuleLoad (2)" ); // not in logcat
consoleLog( "ash: starting onModuleLoad (3)" ); // This shows up
...
}


native void consoleLog( String message) /*-{
console.log( "me:" + message );
}-*/;

I had this problem as well. The GWT log works but because it's all converted to javascript, it prints to the client output, so just view your browser's console and they will be there. In Google Chrome click the triple-line Customize button in the top right, click Tools-->Developer tools and the console will pop up. Your sought-after statements will be there. Also, Ctrl+Shift+I is the shortcut that brings it up. If you want to print to the server, I believe logger handlers and such are in order?

The documentation url in the first answer already gives the different configuration option to log to different places. This framework i wrote offers you a usefull api and allows you to choose your server-side logging implementation. Have a look : https://code.google.com/p/gwt-usefull-logging/

I suggest you use GWT Developer mode It adds a little overhead cause the automatic compilation and code-allocating on the code server, but it's pretty clear when some exceptions arises in client side of your application. I mean, some times chrome console (or firebug or whatever browser debugging built-in tool) doesn't say too much in those situations, trust me, finding a NullPointerException is a pain in the neck when you try to figure out what is happening by alerting your code.

For printing to the browser console I am using something like this:

EventLogger.java

public class EventLogger {
public static void logEvent(String subsys, String grp, String type) {
logEvent(GWT.getModuleName(), subsys, grp,
Duration.currentTimeMillis(), type);
}


public static native void logEvent(String module, String subsys,
String grp, double millis, String type)
/*-{
if ($wnd.__gwtStatsEvent) {
$wnd.__gwtStatsEvent({
'moduleName':module,
'subSystem':subsys,
'evtGroup':grp,
'millis':millis,
'type':type
});
}
}-*/;
}

To log to browsers console you can do it using native, in a very simple way. Very helpful in debugging.

If you add a native method like in below, you can send a string to it from where you want and it will log it in the browsers console.

public static native void console(String text)
/*-{
console.log(text);
}-*/;

For more information about using native in GWT: http://www.gwtproject.org/doc/latest/DevGuideCodingBasicsJSNI.html

In GWT version 2.6.0, method GWT.log writes message to browser console, you don't need to write native methods.

Just summing up the different possibilities shown in the answer's of mreppy and Strelok in one snippet. I also added one possible workaround for IE exceptions as described here: Why does JavaScript only work after opening developer tools in IE once?

    java.util.logging.Logger logger = Logger.getLogger(this.getClass().getSimpleName());


native void jsConsoleLog(String message) /*-{
try {
console.log(message);
} catch (e) {
}
}-*/;


private void log(final String message) {
// Logs to Dev mode console only
GWT.log(message);
// Logs to Dev mode and JavaScript console (requires configuration)
this.logger.log(Level.FINEST, message);
// Logs to JavaScript console only
jsConsoleLog(message);

Yet another variation using the native console...

Add this class:

package XXX.XXX.XXX.XXX;


public class Debug {
private static boolean isEnabled_ = false;
public static void enable() { isEnabled_ = true; }
public static void setEnabled( final boolean isEnabled )
{ isEnabled_ = isEnabled; }


public static void log( final String s )
{ if( isEnabled_ ) nativeConsoleLog( s ); }


private static native void nativeConsoleLog( String s )
/*-{ console.log( s ); }-*/;
}

Then, enable debugging with it at some point, like upon starting the app:

public class XXXXXX implements EntryPoint {
@Override
public void onModuleLoad() {
Debug.enable();
...
}
}

Then just use it like so:

Debug.log("Hello World!");

You can put alaert.Alert(""); in your gwt code compile it and run it you will get pop up on browser when you make request or at the action where you have placed that alert