Comment imprimer sur la console dans GWT

92

Je débogue une application GWT et j'ai besoin d'imprimer des éléments sur la console à des fins de test. System.out.printlnet GWT.logne fonctionne pas. Quelqu'un a-t-il une idée?

andrewsi
la source
1
Essayez les réponses postées ici: stackoverflow.com/questions/17463928/…
Chepech

Réponses:

76

Citant la documentation:

L'ajout de la journalisation GWT est vraiment assez simple, aussi simple que l'exemple de code suivant. Cependant, il est important de comprendre comment fonctionne la journalisation et comment la configurer correctement, veuillez donc prendre le temps de lire le reste de ce document.

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

Le moyen le plus simple d'activer la journalisation est:

# 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");
Strelok
la source
1
Je pense que le commentaire sur le fait que GWT.log ne fonctionne pas est la raison pour laquelle vous avez été rejeté.
checketts le
11
Ouais, GWT.log ne fonctionne qu'en DevMode, donc si vous compilez votre code avec le compilateur GWT, vous ne verrez jamais aucune sortie de GWT.log ().
Andrew Mackenzie le
2
@Andrew Ooops. Vous avez en effet raison. Cela fait si longtemps depuis cette réponse, que j'ai déjà tout oublié :) GWT.log ne fonctionne pas en mode Web.
Strelok
1
Cela peut ne pas fonctionner dans le journal de console d'IE à cause de ce bogue . Ils disent cependant que c'est corrigé dans GWT 2.6.
Brad Cupit
2
Quelle est l'importation de classe Logger que vous avez utilisée? C'est vraiment frustrant.
CrazySabbath
50

J'avais besoin de le faire dans le contexte d'une application GWT qui a été déployée sur un appareil / émulateur Android via PhoneGap (et gwt-phonegap). Ni System.out.println () ni la journalisation GWT comme ci-dessus (avec la déclaration de module) ne se sont affichées dans le logcat d'Android, j'ai donc eu recours à un simple wrapper JSNI pour 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 );
  }-*/;
mreppy
la source
Pour tous les utilisateurs d'IE: afin d'éviter les exceptions lorsque les outils de développement ne sont pas ouverts, mieux vaut encapsuler l'appel dans un bloc try catch ou utiliser l'une des solutions énoncées ici: stackoverflow.com/q/7742781/1845976
schnatterer
Pourriez-vous jeter un œil à cette question ?
displayname
27

Dans GWT version 2.6.0, la méthode GWT.log écrit le message dans la console du navigateur, vous n'avez pas besoin d'écrire des méthodes natives.

zergood
la source
1
J'espérais que cela fonctionnerait. J'ai ajouté un GWT.log ("Facile à trouver"), puis j'ai recherché dans tout le projet la chaîne "Facile à trouver". C'était seulement dans ma source. J'ai vérifié les documents GWT. Il dit que "GWT.log" est uniquement pour le mode de développement dans la fenêtre de développement. gwtproject.org/doc/latest/DevGuideLogging.html
ChrisCantrell
Non, GWT.log est uniquement pour le mode DEV / SUPERDEV, mais pas pour une utilisation en production (il sera coupé par le compilateur de GWT).
Wladimir Schmidt
24

Pour vous connecter à la console des navigateurs, vous pouvez le faire en natif, de manière très simple. Très utile pour le débogage.

Si vous ajoutez une méthode native comme ci-dessous, vous pouvez lui envoyer une chaîne à partir de l'endroit où vous le souhaitez et elle l'enregistrera dans la console du navigateur.

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

Pour plus d'informations sur l'utilisation native dans GWT: http://www.gwtproject.org/doc/latest/DevGuideCodingBasicsJSNI.html

Erkinyldz
la source
Aussi, au lieu de donner un paramètre en tant que String, vous pouvez lui donner autre chose (exemple: JavaScriptObject) et le consoler.
erkinyldz
7

Résumant simplement les différentes possibilités présentées dans les réponses de mreppy et Strelok en un seul extrait. J'ai également ajouté une solution de contournement possible pour les exceptions IE comme décrit ici: Pourquoi JavaScript ne fonctionne-t-il qu'après avoir ouvert une fois les outils de développement dans IE?

    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);
schnatterer
la source
5

Encore une autre variante utilisant la console native ...

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

Ensuite, activez le débogage avec celui-ci à un moment donné, comme au démarrage de l'application:

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

Ensuite, utilisez-le comme ceci:

Debug.log("Hello World!");
BuvinJ
la source
0

J'ai eu ce problème aussi. Le journal GWT fonctionne, mais comme tout est converti en javascript, il s'imprime sur la sortie du client, alors affichez simplement la console de votre navigateur et ils seront là. Dans Google Chrome, cliquez sur le bouton Personnaliser à trois lignes en haut à droite, cliquez sur Outils -> Outils de développement et la console apparaîtra. Vos déclarations recherchées seront là. De plus, Ctrl + Maj + I est le raccourci qui l'affiche. Si vous souhaitez imprimer sur le serveur, je crois que les gestionnaires de journaux et autres sont en ordre?

Glenninator
la source
0

L'URL de la documentation dans la première réponse donne déjà l'option de configuration différente pour se connecter à différents endroits. Ce framework que j'ai écrit vous offre une API utile et vous permet de choisir votre implémentation de journalisation côté serveur. Jetez un œil: https://code.google.com/p/gwt-usefull-logging/

François Wauquier
la source
0

Je vous suggère d'utiliser le mode développeur GWT. Cela ajoute un peu de surcharge à la compilation automatique et à l'allocation de code sur le serveur de code, mais il est assez clair lorsque certaines exceptions surviennent du côté client de votre application. Je veux dire, parfois, la console chrome (ou Firebug ou tout autre outil intégré de débogage du navigateur) ne dit pas trop dans ces situations, croyez-moi, trouver une NullPointerException est une douleur dans le cou lorsque vous essayez de comprendre ce qui se passe en alertant votre code.


la source
0

Pour imprimer sur la console du navigateur, j'utilise quelque chose comme ceci:

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
        });
    }
}-*/;
}
Ievgen Derevianko
la source