GWTアプリケーションをデバッグしていますが、テストのためにいくつかのものをコンソールに出力する必要があります。 System.out.println
およびGWT.log
動作しません。誰にもアイデアはありますか?
ドキュメントの引用:
GWTロギングの追加は、次のコード例のように非常に簡単です。ただし、ロギングの仕組み、およびロギングを正しく構成する方法を理解することは重要です。したがって、このドキュメントの残りの部分を時間をかけて読んでください。
http://code.google.com/webtoolkit/doc/latest/DevGuideLogging.html
ロギングを有効にする最も簡単な方法は次のとおりです。
# 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");
PhoneGap(およびgwt-phonegap)を介してAndroidデバイス/エミュレーター)にデプロイされたGWTアプリケーションのコンテキストでこれを行う必要がありました。System.out.println()もGWTロギングも上記のように(モジュール宣言付き)Androidのlogcatに表示されたため、console.logへの単純なJSNIラッパーに頼りました。
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 );
}-*/;
GWTバージョン2.6.0では、メソッドGWT.logがメッセージをブラウザーコンソールに書き込みます。ネイティブメソッドを記述する必要はありません。
ブラウザコンソールにログを記録するには、ネイティブを使用して非常に簡単な方法でログを記録できます。デバッグに非常に役立ちます。
以下のようなネイティブメソッドを追加する場合、必要な場所から文字列を送信できます。ブラウザコンソールにログが記録されます。
public static native void console(String text)
/*-{
console.log(text);
}-*/;
GWTでのネイティブの使用に関する詳細: http://www.gwtproject.org/doc/latest/DevGuideCodingBasicsJSNI.html
mreppy と Strelok の答えに示されているさまざまな可能性を1つのスニペットにまとめるだけです。ここで説明されているIE例外の回避策も1つ追加しました。 IEで開発者ツールを1回開いた後にのみJavaScriptが機能するのはなぜですか?
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);
ネイティブコンソールを使用したさらに別のバリエーション...
このクラスを追加します。
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 ); }-*/;
}
次に、アプリの起動時など、ある時点でデバッグを有効にします。
public class XXXXXX implements EntryPoint {
@Override
public void onModuleLoad() {
Debug.enable();
...
}
}
次に、次のように使用します。
Debug.log("Hello World!");
ブラウザコンソールに印刷するには、次のようなものを使用しています。
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
});
}
}-*/;
}
GWT Developer mode を使用することをお勧めします。これにより、コードサーバーでの自動コンパイルとコード割り当てのオーバーヘッドが少し増えますが、アプリケーションのクライアント側で例外が発生した場合はかなり明確です。つまり、時々、chrome console(またはfirebugまたはブラウザのデバッグ組み込みツール)は、これらの状況ではあまり言いません。私を信じて、NullPointerExceptionを見つけることは首の痛みですコードに警告することで何が起こっているのかを理解しようとするとき。
最初の回答のドキュメントURLには、さまざまな場所にログを記録するためのさまざまな構成オプションが既に用意されています。私が書いたこのフレームワークは、有用なAPIを提供し、サーバー側のロギング実装を選択できるようにします。ご覧ください: https://code.google.com/p/gwt-usefull-logging/
私もこの問題を抱えていました。 GWTログは機能しますが、すべてJavaScriptに変換されるため、クライアント出力に出力されるので、ブラウザーのコンソールを表示するだけで、そこに表示されます。 GoogleでChrome右上の[カスタマイズ]ボタンを3行クリックし、[ツール]-> [開発ツール]をクリックすると、コンソールがポップアップ表示されます。サーバーに印刷したい場合は、ロガーハンドラーなどが正常に動作していると思います。