Come stampare sulla console in GWT


92

Sto eseguendo il debug di un'applicazione GWT e ho bisogno di stampare alcune cose sulla console a scopo di test. System.out.printlne GWT.lognon funzionano. Qualcuno ha qualche idea?


1
Provate le risposte postato qui: stackoverflow.com/questions/17463928/...
Chepech

Risposte:


76

Citando la documentazione:

L'aggiunta della registrazione GWT è davvero molto semplice, semplice come il seguente esempio di codice. Tuttavia, capire come funziona la registrazione e come configurarla correttamente è importante, quindi dedica del tempo alla lettura del resto di questo documento.

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

Il modo più semplice per abilitare la registrazione è:

# 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
Penso che il commento su GWT.log non funziona è il motivo per cui sei stato bocciato.
checketts

11
Sì, GWT.log funziona solo in DevMode, quindi se stai compilando il codice con il compilatore GWT non vedrai mai alcun output da GWT.log ().
Andrew Mackenzie

2
@Andrew Ooops. Hai davvero ragione. È passato così tanto tempo da questa risposta, che me ne sono già dimenticato :) GWT.log non funziona in modalità Web.
Strelok

1
Questo potrebbe non funzionare nel logger della console di IE a causa di questo bug . Dicono che sia stato risolto in GWT 2.6.
Brad Cupit

2
Qual è l'importazione della classe Logger che hai usato? Questo è davvero frustrante.
CrazySabbath

50

Avevo bisogno di farlo nel contesto di un'applicazione GWT che è stata distribuita su un dispositivo / emulatore Android tramite PhoneGap (e gwt-phonegap). Né System.out.println () né la registrazione GWT come sopra (con dichiarazione del modulo) sono state visualizzate nel logcat di Android, quindi ho fatto ricorso a un semplice wrapper JSNI per 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 );
  }-*/;

Per tutti gli utenti di IE: per evitare eccezioni quando gli strumenti di sviluppo non sono aperti, è meglio racchiudere la chiamata in un blocco try catch o utilizzare una delle soluzioni indicate qui: stackoverflow.com/q/7742781/1845976
schnatterer

Potresti dare un'occhiata a questa domanda ?
displayname

27

Nella versione 2.6.0 di GWT, il metodo GWT.log scrive il messaggio nella console del browser, non è necessario scrivere metodi nativi.


1
Speravo che funzionasse. Ho aggiunto un GWT.log ("Facile da trovare") e poi ho cercato nell'intero progetto la stringa "Facile da trovare". Era solo nella mia fonte. Ho controllato i documenti GWT. Dice che "GWT.log" è solo per la modalità dev nella finestra dev. gwtproject.org/doc/latest/DevGuideLogging.html
ChrisCantrell

No, GWT.log è solo per la modalità DEV / SUPERDEV, ma non per uso di produzione (verrà tagliato dal compilatore di GWT).
Wladimir Schmidt

24

Per accedere alla console dei browser puoi farlo utilizzando native, in un modo molto semplice. Molto utile per il debug.

Se aggiungi un metodo nativo come in seguito, puoi inviargli una stringa da dove desideri e verrà registrato nella console del browser.

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

Per ulteriori informazioni sull'utilizzo del nativo in GWT: http://www.gwtproject.org/doc/latest/DevGuideCodingBasicsJSNI.html


Inoltre, invece di dare il parametro come String, puoi dargli qualcos'altro (esempio: JavaScriptObject) e console quello.
erkinyldz

7

Sto solo riassumendo le diverse possibilità mostrate nelle risposte di mreppy e Strelok in uno snippet. Ho anche aggiunto una possibile soluzione alternativa per le eccezioni di IE come descritto qui: Perché JavaScript funziona solo dopo aver aperto gli strumenti per sviluppatori in IE una volta?

    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

Ancora un'altra variazione utilizzando la console nativa ...

Aggiungi questa classe:

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

Quindi, abilita il debug con esso ad un certo punto, come all'avvio dell'app:

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

Quindi usalo in questo modo:

Debug.log("Hello World!");

0

Anch'io ho avuto questo problema. Il registro di GWT funziona ma poiché è tutto convertito in javascript, viene stampato nell'output del client, quindi visualizza la console del tuo browser e saranno lì. In Google Chrome fai clic sul pulsante Personalizza a tre righe in alto a destra, fai clic su Strumenti -> Strumenti per sviluppatori e verrà visualizzata la console. Le tue ambite dichiarazioni saranno lì. Inoltre, Ctrl + Maiusc + I è la scorciatoia che lo fa apparire. Se vuoi stampare sul server, credo che i gestori di logger e simili siano in ordine?



0

Ti suggerisco di utilizzare la modalità GWT Developer Aggiunge un piccolo sovraccarico perché la compilazione automatica e l'allocazione del codice sul server del codice, ma è abbastanza chiaro quando sorgono alcune eccezioni nel lato client della tua applicazione. Voglio dire, a volte la console chrome (o firebug o qualsiasi altro strumento integrato per il debug del browser) non dice troppo in quelle situazioni, credimi, trovare una NullPointerException è una seccatura quando cerchi di capire cosa sta succedendo avvisando il tuo codice.


0

Per la stampa sulla console del browser sto usando qualcosa del genere:

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
        });
    }
}-*/;
}
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.