ฉันกำลังดีบักแอปพลิเคชัน 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
        });
    }
}-*/;
}