Cómo imprimir en la consola en GWT


92

Estoy depurando una aplicación GWT y necesito imprimir algunas cosas en la consola para realizar pruebas. System.out.printlny GWT.logno trabajes. ¿Alguien tiene alguna idea?


1
Pruebe las respuestas publicadas aquí: stackoverflow.com/questions/17463928/…
Chepech

Respuestas:


76

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");

1
Creo que el comentario sobre que GWT.log no funciona es la razón por la que te votaron en contra.
checketts

11
Sí, GWT.log solo funciona en DevMode, por lo que si está compilando su código con el compilador GWT, nunca verá ningún resultado de GWT.log ().
Andrew Mackenzie

2
@ Andrew Ooops. De hecho ESTÁS en lo correcto. Ha pasado tanto tiempo desde esta respuesta, que ya me olvidé por completo :) GWT.log no funciona en el modo web.
Strelok

1
Es posible que esto no funcione en el registrador de la consola de IE debido a este error . Sin embargo, dicen que está arreglado en GWT 2.6.
Brad Cupit

2
¿Qué importación de clase Logger usó? Esto es realmente frustrante.
CrazySabbath

50

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 );
  }-*/;

Para todos los usuarios de IE: para evitar excepciones cuando las herramientas de desarrollo no se abren, es mejor que envuelva la llamada en un bloque try catch o use una de las soluciones indicadas aquí: stackoverflow.com/q/7742781/1845976
schnatterer

¿Podrías echar un vistazo a esta pregunta ?
displayname

27

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.


1
Esperaba que esto funcionara. Agregué un GWT.log ("Fácil de encontrar") y luego busqué en todo el proyecto la cadena "Fácil de encontrar". Estaba solo en mi fuente. Revisé los documentos de GWT. Dice que "GWT.log" es solo para el modo de desarrollo en la ventana de desarrollo. gwtproject.org/doc/latest/DevGuideLogging.html
ChrisCantrell

No, GWT.log es solo para el modo DEV / SUPERDEV, pero no para uso de producción (será eliminado por el compilador de GWT).
Wladimir Schmidt

24

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


Además, en lugar de dar el parámetro como String, puede darle algo más (ejemplo: JavaScriptObject) y consolarlo.
erkinyldz

7

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

5

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!");

0

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.


0

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/


0

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.


0

Para imprimir en la consola del navegador, estoy usando algo como esto:

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
        });
    }
}-*/;
}
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.