Je débogue une application GWT et j'ai besoin d'imprimer des éléments sur la console à des fins de test. System.out.println
et GWT.log
ne fonctionne pas. Quelqu'un a-t-il une idée?
Réponses:
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");
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 );
}-*/;
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.
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
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);
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!");
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?
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/
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.
Pour imprimer sur la console du navigateur, j'utilise quelque chose comme ceci:
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
});
}
}-*/;
}