Debuguję aplikację GWT i muszę wydrukować kilka rzeczy na konsoli do celów testowych. System.out.println
i GWT.log
nie działa. Czy ktoś ma jakieś pomysły?
Odpowiedzi:
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");
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 );
}-*/;
W wersji 2.6.0 GWT metoda GWT.log zapisuje wiadomość w konsoli przeglądarki, nie musisz pisać natywnych metod.
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
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);
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!");
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.
Do drukowania na konsoli przeglądarki używam czegoś takiego:
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
});
}
}-*/;
}