Estoy depurando una aplicación GWT y necesito imprimir algunas cosas en la consola para realizar pruebas. System.out.println
y GWT.log
no trabajes. ¿Alguien tiene alguna idea?
Respuestas:
Citando la documentación:
Agregar el registro de GWT es realmente bastante simple, tan simple como el siguiente ejemplo de código. Sin embargo, es importante comprender cómo funciona el registro y cómo configurarlo correctamente, así que tómese el tiempo para leer el resto de este documento.
http://code.google.com/webtoolkit/doc/latest/DevGuideLogging.html
La forma más sencilla de habilitar el registro es:
# 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");
Necesitaba hacer esto en el contexto de una aplicación GWT que se implementó en un dispositivo / emulador de Android a través de PhoneGap (y gwt-phonegap). Ni System.out.println () ni el registro de GWT como el anterior (con la declaración del módulo) aparecieron en el logcat de Android, así que recurrí a un contenedor JSNI simple para 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 );
}-*/;
En GWT versión 2.6.0, el método GWT.log escribe el mensaje en la consola del navegador, no es necesario que escriba métodos nativos.
Para iniciar sesión en la consola de los navegadores puedes hacerlo usando nativo, de una manera muy sencilla. Muy útil en la depuración.
Si agrega un método nativo como el que se muestra a continuación, puede enviarle una cadena desde donde desee y lo registrará en la consola del navegador.
public static native void console(String text)
/*-{
console.log(text);
}-*/;
Para obtener más información sobre el uso de nativo en GWT: http://www.gwtproject.org/doc/latest/DevGuideCodingBasicsJSNI.html
Simplemente resumiendo las diferentes posibilidades que se muestran en las respuestas de mreppy y Strelok en un solo fragmento. También agregué una posible solución para las excepciones de IE como se describe aquí: ¿Por qué JavaScript solo funciona después de abrir las herramientas de desarrollador en IE una vez?
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);
Otra variación más usando la consola nativa ...
Agrega esta clase:
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 ); }-*/;
}
Luego, habilite la depuración con él en algún momento, como al iniciar la aplicación:
public class XXXXXX implements EntryPoint {
@Override
public void onModuleLoad() {
Debug.enable();
...
}
}
Entonces utilícelo así:
Debug.log("Hello World!");
Yo tuve este problema también. El registro de GWT funciona, pero debido a que todo está convertido a javascript, se imprime en la salida del cliente, así que solo vea la consola de su navegador y estarán allí. En Google Chrome, haga clic en el botón Personalizar de tres líneas en la parte superior derecha, haga clic en Herramientas -> Herramientas para desarrolladores y aparecerá la consola. Sus declaraciones solicitadas estarán allí. Además, Ctrl + Shift + I es el atajo que lo muestra. Si desea imprimir en el servidor, creo que los controladores de registro y demás están en orden.
La URL de documentación en la primera respuesta ya brinda la opción de configuración diferente para iniciar sesión en diferentes lugares. Este marco que escribí le ofrece una api útil y le permite elegir su implementación de registro del lado del servidor. Eche un vistazo: https://code.google.com/p/gwt-usefull-logging/
Le sugiero que use el modo de desarrollador de GWT. Agrega un poco de sobrecarga debido a la compilación automática y la asignación de código en el servidor de código, pero es bastante claro cuando surgen algunas excepciones en el lado del cliente de su aplicación. Quiero decir, algunas veces la consola Chrome (o Firebug o cualquier herramienta incorporada de depuración del navegador) no dice demasiado en esas situaciones, créame, encontrar una NullPointerException es un dolor en el cuello cuando intenta averiguar qué está sucediendo alertando a su código.
Para imprimir en la consola del navegador, estoy usando algo como esto:
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
});
}
}-*/;
}