Jak drukować na konsoli w GWT

92

Debuguję aplikację GWT i muszę wydrukować kilka rzeczy na konsoli do celów testowych. System.out.printlni GWT.lognie działa. Czy ktoś ma jakieś pomysły?

andrewsi
źródło
1
Wypróbuj odpowiedzi zamieszczone tutaj: stackoverflow.com/questions/17463928/ ...
Chepech

Odpowiedzi:

77

Cytując dokumentację:

Dodawanie rejestrowania GWT jest naprawdę dość proste, tak proste, jak poniższy przykład kodu. Jednak - zrozumienie, jak działa logowanie i jak je poprawnie skonfigurować, jest ważne, więc poświęć trochę czasu na przeczytanie pozostałej części tego dokumentu.

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

Najprostszym sposobem włączenia rejestrowania jest:

# 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
źródło
1
Myślę, że komentarz o niedziałającym GWT.log jest powodem, dla którego zostałeś odrzucony.
czeki
11
Tak, GWT.log działa tylko w DevMode, więc jeśli kompilujesz swój kod za pomocą kompilatora GWT, nigdy nie zobaczysz żadnych danych wyjściowych z GWT.log ().
Andrew Mackenzie,
2
@Andrew Ups. Naprawdę masz rację. Od tej odpowiedzi minęło tak dawno, że już o niej zapomniałem :) GWT.log nie działa w trybie WWW.
Strelok,
1
Może to nie działać w dzienniku konsoli IE z powodu tego błędu . Mówią jednak, że zostało to naprawione w GWT 2.6.
Brad Cupit
2
Czym jest użyty import klasy Logger? To naprawdę frustrujące.
CrazySabbath
50

Musiałem to zrobić w kontekście aplikacji GWT, która została wdrożona na urządzeniu / emulatorze z Androidem za pośrednictwem PhoneGap (i gwt-phonegap). Ani System.out.println (), ani logowanie GWT, jak powyżej (z deklaracją modułu), nie pojawiły się w logcat Androida, więc skorzystałem z prostego opakowania JSNI w 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
źródło
Dla wszystkich użytkowników IE: aby uniknąć wyjątków, gdy narzędzia programistyczne nie są otwarte, lepiej zawiń wywołanie blokiem try catch lub użyj jednego z rozwiązań podanych tutaj: stackoverflow.com/q/7742781/1845976
schnatterer
Czy mógłbyś spojrzeć na to pytanie ?
Stefan Falk
27

W wersji 2.6.0 GWT metoda GWT.log zapisuje wiadomość w konsoli przeglądarki, nie musisz pisać natywnych metod.

zergood
źródło
1
Miałem nadzieję, że to zadziała. Dodałem GWT.log („Łatwy do znalezienia”), a następnie przeszukałem cały projekt pod kątem ciągu „Łatwe do znalezienia”. To było tylko w moim źródle. Sprawdziłem dokumenty GWT. Mówi, że "GWT.log" jest tylko dla trybu programisty w oknie programisty. gwtproject.org/doc/latest/DevGuideLogging.html
ChrisCantrell
Nie, GWT.log jest tylko dla trybu DEV / SUPERDEV, ale nie do użytku produkcyjnego (zostanie wycięty przez kompilator GWT).
Wladimir Schmidt
25

Aby zalogować się do konsoli przeglądarki, możesz to zrobić używając natywnego, w bardzo prosty sposób. Bardzo pomocny w debugowaniu.

Jeśli dodasz natywną metodę, jak poniżej, możesz wysłać do niej ciąg znaków z dowolnego miejsca i zarejestruje to w konsoli przeglądarki.

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

Więcej informacji o używaniu natywnych w GWT: http://www.gwtproject.org/doc/latest/DevGuideCodingBasicsJSNI.html

erkinyldz
źródło
Zamiast podawać parametr jako String, możesz podać mu coś innego (przykład: JavaScriptObject) i to skonsolidować.
erkinyldz
7

Wystarczy podsumować różne możliwości przedstawione w odpowiedziach mreppy i Strelok w jednym fragmencie. Dodałem również jedno możliwe obejście wyjątków IE, jak opisano tutaj: Dlaczego JavaScript działa tylko po jednokrotnym otwarciu narzędzi programistycznych w 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
źródło
5

Jeszcze inna odmiana wykorzystująca natywną konsolę ...

Dodaj tę klasę:

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

Następnie włącz debugowanie w pewnym momencie, na przykład podczas uruchamiania aplikacji:

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

Następnie użyj go w ten sposób:

Debug.log("Hello World!");
BuvinJ
źródło
0

Ja też miałem ten problem. Dziennik GWT działa, ale ponieważ wszystko jest konwertowane na javascript, drukuje na wyjściu klienta, więc po prostu wyświetl konsolę przeglądarki, a będą tam. W Google Chrome kliknij trzywierszowy przycisk Dostosuj w prawym górnym rogu, kliknij Narzędzia -> Narzędzia programistyczne, a konsola wyskoczy. Twoje poszukiwane wypowiedzi będą tam. Ponadto Ctrl + Shift + I to skrót, który go wywołuje. Jeśli chcesz drukować na serwerze, uważam, że programy obsługujące rejestratory i takie są w porządku?

Glenninator
źródło
0

Adres URL dokumentacji w pierwszej odpowiedzi już daje inną opcję konfiguracji, aby zalogować się w różnych miejscach. Ten framework, który napisałem, oferuje użyteczne API i pozwala wybrać implementację logowania po stronie serwera. Spójrz: https://code.google.com/p/gwt-usefull-logging/

François Wauquier
źródło
0

Sugeruję użycie trybu programisty GWT. Dodaje trochę narzutów, ponieważ powoduje automatyczną kompilację i alokację kodu na serwerze kodu, ale jest całkiem jasne, gdy pojawiają się wyjątki po stronie klienta aplikacji. Chodzi mi o to, że czasami konsola chrome (lub firebug lub jakiekolwiek inne wbudowane narzędzie do debugowania przeglądarki) nie mówi zbyt wiele w takich sytuacjach, zaufaj mi, znalezienie NullPointerException to ból w karku, gdy próbujesz dowiedzieć się, co się dzieje ostrzegając swój kod.


źródło
0

Do drukowania na konsoli przeglądarki używam czegoś takiego:

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
źródło