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?
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.
# 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");
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:
publicvoidonModuleLoad(){
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
...
}
nativevoidconsoleLog( String message)/*-{
console.log( "me:" + message );
}-*/;
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
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.
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?
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/
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.
Odpowiedzi:
Cytując dokumentację:
http://code.google.com/webtoolkit/doc/latest/DevGuideLogging.html
Najprostszym sposobem włączenia rejestrowania jest:
źródło
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 ); }-*/;
źródło
W wersji 2.6.0 GWT metoda GWT.log zapisuje wiadomość w konsoli przeglądarki, nie musisz pisać natywnych metod.
źródło
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
źródło
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);
źródło
Jeszcze inna odmiana wykorzystująca natywną konsolę ...
Dodaj tę klasę:
Następnie włącz debugowanie w pewnym momencie, na przykład podczas uruchamiania aplikacji:
Następnie użyj go w ten sposób:
źródło
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?
źródło
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/
źródło
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
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 }); } }-*/; }
źródło