ฉันกำลังดีบักแอปพลิเคชัน GWT และฉันจำเป็นต้องพิมพ์บางอย่างไปยังคอนโซลเพื่อการทดสอบ System.out.println
และGWT.log
ไม่ทำงาน ใครมีความคิดบ้างไหม?
ฉันกำลังดีบักแอปพลิเคชัน 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");
ฉันต้องทำสิ่งนี้ในบริบทของแอปพลิเคชัน GWT ที่ปรับใช้กับอุปกรณ์ / โปรแกรมจำลอง Android ผ่าน PhoneGap (และ gwt-phonegap) ทั้ง System.out.println () หรือการบันทึก GWT ตามด้านบน (พร้อมการประกาศโมดูล) ไม่ปรากฏใน logcat ของ Android ดังนั้นฉันจึงใช้กระดาษห่อ JSNI แบบธรรมดาไปยัง 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 );
}-*/;
ใน 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ในตัวอย่างเดียว ฉันยังเพิ่มวิธีแก้ปัญหาที่เป็นไปได้อย่างหนึ่งสำหรับข้อยกเว้นของ IE ตามที่อธิบายไว้ที่นี่: เหตุใด JavaScript จึงใช้งานได้หลังจากเปิดเครื่องมือสำหรับนักพัฒนาใน 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);
ยังมีรูปแบบอื่นโดยใช้คอนโซลดั้งเดิม ...
เพิ่มชั้นเรียนนี้:
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!");
ฉันมีปัญหานี้เช่นกัน บันทึก GWT ใช้งานได้ แต่เนื่องจากมันถูกแปลงเป็น javascript ทั้งหมดจึงพิมพ์ไปยังเอาต์พุตไคลเอ็นต์ดังนั้นเพียงแค่ดูคอนโซลของเบราว์เซอร์ของคุณและจะอยู่ที่นั่น ใน Google Chrome ให้คลิกปุ่มปรับแต่งสามบรรทัดที่ด้านบนขวาคลิกเครื่องมือ -> เครื่องมือสำหรับนักพัฒนาซอฟต์แวร์และคอนโซลจะปรากฏขึ้น ข้อความที่คุณต้องการจะอยู่ที่นั่น นอกจากนี้ Ctrl + Shift + I เป็นทางลัดที่นำมาใช้ หากคุณต้องการพิมพ์ไปยังเซิร์ฟเวอร์ฉันเชื่อว่าตัวจัดการคนตัดไม้และเป็นไปตามลำดับหรือไม่?
URL เอกสารในคำตอบแรกให้ตัวเลือกการกำหนดค่าที่แตกต่างกันในการบันทึกไปยังที่ต่างๆ เฟรมเวิร์กที่ฉันเขียนนี้เสนอ API ที่มีประโยชน์และช่วยให้คุณสามารถเลือกการใช้งานการบันทึกฝั่งเซิร์ฟเวอร์ของคุณ ดูได้ที่: https://code.google.com/p/gwt-usefull-logging/
ฉันขอแนะนำให้คุณใช้โหมด GWT Developerซึ่งจะเพิ่มค่าใช้จ่ายเล็กน้อยทำให้เกิดการคอมไพล์อัตโนมัติและการจัดสรรโค้ดบนเซิร์ฟเวอร์โค้ด แต่ค่อนข้างชัดเจนเมื่อมีข้อยกเว้นบางประการเกิดขึ้นในฝั่งไคลเอ็นต์ของแอปพลิเคชันของคุณ ฉันหมายถึงบางครั้งคอนโซลโครเมี่ยม (หรือไฟบักหรือเครื่องมือในตัวของเบราว์เซอร์ใดก็ตามที่ดีบัก) ไม่ได้พูดมากเกินไปในสถานการณ์เหล่านั้นเชื่อฉันเถอะการค้นหา NullPointerException เป็นความเจ็บปวดที่คอเมื่อคุณพยายามคิดว่าเกิดอะไรขึ้น โดยแจ้งเตือนรหัสของคุณ
สำหรับการพิมพ์ไปยังคอนโซลของเบราว์เซอร์ฉันใช้สิ่งนี้:
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
});
}
}-*/;
}