So drucken Sie in GWT auf der Konsole

92

Ich debugge eine GWT-Anwendung und muss zu Testzwecken einige Dinge auf die Konsole drucken. System.out.printlnund GWT.lognicht arbeiten. Hat jemand irgendwelche Ideen?

andrewsi
quelle
1
Probieren Sie die hier veröffentlichten Antworten aus: stackoverflow.com/questions/17463928/…
Chepech

Antworten:

76

Zitieren der Dokumentation:

Das Hinzufügen der GWT-Protokollierung ist sehr einfach, so einfach wie das folgende Codebeispiel. Es ist jedoch wichtig zu verstehen, wie die Protokollierung funktioniert und wie sie korrekt konfiguriert wird. Nehmen Sie sich daher bitte die Zeit, den Rest dieses Dokuments zu lesen.

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

Der einfachste Weg, die Protokollierung zu aktivieren, ist:

# 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
quelle
1
Ich denke, der Kommentar zu GWT.log funktioniert nicht, weshalb Sie abgelehnt wurden.
Checketts
11
Ja, GWT.log funktioniert nur im DevMode. Wenn Sie also Ihren Code mit dem GWT-Compiler kompilieren, werden Sie nie eine Ausgabe von GWT.log () sehen.
Andrew Mackenzie
2
@ Andrew Ups. Sie sind in der Tat richtig. Es ist seit dieser Antwort so lange her, dass ich schon alles darüber vergessen :) GWT.log funktioniert nicht im Web - Modus arbeiten.
Strelok
1
Dies funktioniert im Konsolenlogger des IE aufgrund dieses Fehlers möglicherweise nicht . Sie sagen, dass es in GWT 2.6 behoben ist.
Brad Cupit
2
Was ist der von Ihnen verwendete Logger-Klassenimport? Das ist wirklich frustrierend.
CrazySabbath
49

Ich musste dies im Kontext einer GWT-Anwendung tun, die über PhoneGap (und gwt-phonegap) auf einem Android-Gerät / Emulator bereitgestellt wurde. Weder die System.out.println () noch die GWT-Protokollierung wie oben (mit Moduldeklaration) wurden in Android's logcat angezeigt, daher habe ich auf einen einfachen JSNI-Wrapper für console.log zurückgegriffen:

  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
quelle
Für alle IE-Benutzer: Um Ausnahmen zu vermeiden, wenn die Entwicklungstools nicht geöffnet werden, sollten Sie den Aufruf besser in einen Try-Catch-Block einschließen
schnatterer
Könnten Sie sich diese Frage ansehen ?
Anzeigename
27

In GWT Version 2.6.0 schreibt die Methode GWT.log eine Nachricht in die Browserkonsole. Sie müssen keine nativen Methoden schreiben.

zergood
quelle
1
Ich hatte gehofft, dass das funktionieren würde. Ich habe ein GWT.log ("Leicht zu finden") hinzugefügt und dann das gesamte Projekt nach der Zeichenfolge "Leicht zu finden" durchsucht. Es war nur in meiner Quelle. Ich habe die GWT-Dokumente überprüft. Es heißt, dass "GWT.log" nur für den Dev-Modus im Dev-Fenster ist. gwtproject.org/doc/latest/DevGuideLogging.html
ChrisCantrell
Nein, GWT.log ist nur für den DEV / SUPERDEV-Modus vorgesehen, jedoch nicht für den Produktionsbetrieb (wird vom GWT-Compiler ausgeschnitten).
Wladimir Schmidt
24

Um sich bei der Browserkonsole anzumelden, können Sie dies auf sehr einfache Weise mit Native tun. Sehr hilfreich beim Debuggen.

Wenn Sie eine native Methode wie unten hinzufügen, können Sie eine Zeichenfolge an die gewünschte Stelle senden, die in der Browserkonsole protokolliert wird.

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

Weitere Informationen zur Verwendung von Native in GWT finden Sie unter: http://www.gwtproject.org/doc/latest/DevGuideCodingBasicsJSNI.html

erkinyldz
quelle
Anstatt Parameter als String anzugeben, können Sie ihm auch etwas anderes geben (Beispiel: JavaScriptObject) und dies trösten.
erkinyldz
7

Fassen Sie einfach die verschiedenen Möglichkeiten zusammen, die in den Antworten von mreppy und Strelok in einem Ausschnitt gezeigt werden. Ich habe auch eine mögliche Problemumgehung für IE-Ausnahmen hinzugefügt, wie hier beschrieben: Warum funktioniert JavaScript nur nach einmaligem Öffnen der Entwicklertools im 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
quelle
5

Noch eine Variation mit der nativen Konsole ...

Fügen Sie diese Klasse hinzu:

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

Aktivieren Sie dann irgendwann das Debuggen, z. B. beim Starten der App:

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

Dann benutze es einfach so:

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

Ich hatte auch dieses Problem. Das GWT-Protokoll funktioniert, aber da alles in Javascript konvertiert ist, wird es auf der Client-Ausgabe gedruckt. Sehen Sie sich also einfach die Konsole Ihres Browsers an und sie werden dort sein. Klicken Sie in Google Chrome oben rechts auf die dreizeilige Schaltfläche Anpassen, klicken Sie auf Extras -> Entwicklertools. Die Konsole wird angezeigt. Ihre begehrten Aussagen werden dort sein. Außerdem ist Strg + Umschalt + I die Verknüpfung, die es aufruft. Wenn Sie auf dem Server drucken möchten, glaube ich, dass Logger-Handler und dergleichen in Ordnung sind?

Glenninator
quelle
0

Die Dokumentations-URL in der ersten Antwort bietet bereits die unterschiedliche Konfigurationsoption, um sich an verschiedenen Stellen anzumelden. Dieses Framework, das ich geschrieben habe, bietet Ihnen eine nützliche API und ermöglicht Ihnen die Auswahl Ihrer serverseitigen Protokollierungsimplementierung. Schauen Sie mal rein : https://code.google.com/p/gwt-usefull-logging/

François Wauquier
quelle
0

Ich schlage vor, Sie verwenden den GWT-Entwicklermodus. Dies führt zu einem geringen Overhead, da die automatische Kompilierung und Codezuweisung auf dem Codeserver erfolgt. Es ist jedoch ziemlich klar, wenn auf der Clientseite Ihrer Anwendung einige Ausnahmen auftreten. Ich meine, manchmal sagt die Chrome-Konsole (oder ein Firebug oder ein integriertes Tool zum Debuggen von Browsern) in solchen Situationen nicht zu viel. Vertrauen Sie mir, das Finden einer NullPointerException ist ein Schmerz im Nacken, wenn Sie versuchen, herauszufinden, was passiert indem Sie Ihren Code alarmieren.


quelle
0

Zum Drucken auf der Browserkonsole verwende ich Folgendes:

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
quelle