วิธีพิมพ์ไปยังคอนโซลใน GWT


92

ฉันกำลังดีบักแอปพลิเคชัน GWT และฉันจำเป็นต้องพิมพ์บางอย่างไปยังคอนโซลเพื่อการทดสอบ System.out.printlnและGWT.logไม่ทำงาน ใครมีความคิดบ้างไหม?


1
ลองคำตอบที่โพสต์ไว้ที่นี่: stackoverflow.com/questions/17463928/…
Chepech

คำตอบ:


77

อ้างถึงเอกสาร:

การเพิ่มการบันทึก 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");

1
ฉันคิดว่าความคิดเห็นเกี่ยวกับ GWT.log ไม่ทำงานคือสาเหตุที่คุณได้รับการโหวตลง
เช็คเอาต์

11
ใช่ GWT.log ใช้งานได้ใน DevMode เท่านั้นดังนั้นหากคุณกำลังรวบรวมโค้ดของคุณด้วยคอมไพเลอร์ GWT คุณจะไม่เห็นผลลัพธ์ใด ๆ จาก GWT.log ()
Andrew Mackenzie

2
@ แอนดรูว์อ๊ะ. คุณถูกต้องแน่นอน คำตอบนี้นานมากแล้วฉันก็ลืมไปหมดแล้ว :) GWT.log ไม่ทำงานในโหมดเว็บ
Strelok

1
สิ่งนี้อาจใช้ไม่ได้ในคอนโซลคนตัดไม้ของ IE เนื่องจากข้อบกพร่องนี้ พวกเขาบอกว่าได้รับการแก้ไขใน GWT 2.6 แล้ว
Brad Cupit

2
คุณใช้การนำเข้าคลาส Logger อะไร นี่มันน่าหงุดหงิดจริงๆ
CrazySabbath

50

ฉันต้องทำสิ่งนี้ในบริบทของแอปพลิเคชัน 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 );
  }-*/;

สำหรับผู้ใช้ IE ทั้งหมด: เพื่อหลีกเลี่ยงข้อยกเว้นเมื่อไม่มีการเปิดเครื่องมือการพัฒนาคุณควรปิดกั้นการโทรในบล็อก try catch หรือใช้วิธีใดวิธีหนึ่งที่ระบุไว้ที่นี่: stackoverflow.com/q/7742781/1845976
schnatterer

คุณช่วยดูคำถามนี้ได้ไหม
Stefan Falk

27

ใน GWT เวอร์ชัน 2.6.0 เมธอด GWT.log เขียนข้อความไปยังคอนโซลเบราว์เซอร์คุณไม่จำเป็นต้องเขียนเมธอดดั้งเดิม


1
ฉันหวังว่าจะได้ผล ฉันเพิ่ม GWT.log ("หาง่าย") แล้วค้นหาสตริง "หาง่าย" ทั้งโปรเจ็กต์ มันอยู่ในแหล่งที่มาของฉันเท่านั้น ฉันตรวจสอบเอกสาร GWT มันบอกว่า "GWT.log" ใช้สำหรับโหมด dev ในหน้าต่าง dev เท่านั้น gwtproject.org/doc/latest/DevGuideLogging.html
ChrisCantrell

ไม่ GWT.log ใช้สำหรับโหมด DEV / SUPERDEV เท่านั้น แต่ไม่ใช่สำหรับการใช้งานจริง (คอมไพเลอร์ของ GWT จะถูกตัดออก)
Wladimir Schmidt

25

ในการเข้าสู่คอนโซลของเบราว์เซอร์คุณสามารถทำได้โดยใช้เนทีฟด้วยวิธีง่ายๆ มีประโยชน์มากในการดีบัก

หากคุณเพิ่มวิธีดั้งเดิมเช่นด้านล่างนี้คุณสามารถส่งสตริงจากที่ที่คุณต้องการและจะบันทึกไว้ในคอนโซลของเบราว์เซอร์

public static native void console(String text)
/*-{
    console.log(text);
}-*/;

สำหรับข้อมูลเพิ่มเติมเกี่ยวกับการใช้เนทีฟใน GWT: http://www.gwtproject.org/doc/latest/DevGuideCodingBasicsJSNI.html


นอกจากนี้แทนที่จะให้พารามิเตอร์เป็น String คุณสามารถให้เป็นอย่างอื่น (ตัวอย่าง: JavaScriptObject) และคอนโซลนั้น
erkinyldz

7

เพียงสรุปความเป็นไปได้ต่างๆที่แสดงไว้ในคำตอบของ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);

5

ยังมีรูปแบบอื่นโดยใช้คอนโซลดั้งเดิม ...

เพิ่มชั้นเรียนนี้:

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!");

0

ฉันมีปัญหานี้เช่นกัน บันทึก GWT ใช้งานได้ แต่เนื่องจากมันถูกแปลงเป็น javascript ทั้งหมดจึงพิมพ์ไปยังเอาต์พุตไคลเอ็นต์ดังนั้นเพียงแค่ดูคอนโซลของเบราว์เซอร์ของคุณและจะอยู่ที่นั่น ใน Google Chrome ให้คลิกปุ่มปรับแต่งสามบรรทัดที่ด้านบนขวาคลิกเครื่องมือ -> เครื่องมือสำหรับนักพัฒนาซอฟต์แวร์และคอนโซลจะปรากฏขึ้น ข้อความที่คุณต้องการจะอยู่ที่นั่น นอกจากนี้ Ctrl + Shift + I เป็นทางลัดที่นำมาใช้ หากคุณต้องการพิมพ์ไปยังเซิร์ฟเวอร์ฉันเชื่อว่าตัวจัดการคนตัดไม้และเป็นไปตามลำดับหรือไม่?


0

URL เอกสารในคำตอบแรกให้ตัวเลือกการกำหนดค่าที่แตกต่างกันในการบันทึกไปยังที่ต่างๆ เฟรมเวิร์กที่ฉันเขียนนี้เสนอ API ที่มีประโยชน์และช่วยให้คุณสามารถเลือกการใช้งานการบันทึกฝั่งเซิร์ฟเวอร์ของคุณ ดูได้ที่: https://code.google.com/p/gwt-usefull-logging/


0

ฉันขอแนะนำให้คุณใช้โหมด GWT Developerซึ่งจะเพิ่มค่าใช้จ่ายเล็กน้อยทำให้เกิดการคอมไพล์อัตโนมัติและการจัดสรรโค้ดบนเซิร์ฟเวอร์โค้ด แต่ค่อนข้างชัดเจนเมื่อมีข้อยกเว้นบางประการเกิดขึ้นในฝั่งไคลเอ็นต์ของแอปพลิเคชันของคุณ ฉันหมายถึงบางครั้งคอนโซลโครเมี่ยม (หรือไฟบักหรือเครื่องมือในตัวของเบราว์เซอร์ใดก็ตามที่ดีบัก) ไม่ได้พูดมากเกินไปในสถานการณ์เหล่านั้นเชื่อฉันเถอะการค้นหา NullPointerException เป็นความเจ็บปวดที่คอเมื่อคุณพยายามคิดว่าเกิดอะไรขึ้น โดยแจ้งเตือนรหัสของคุณ


0

สำหรับการพิมพ์ไปยังคอนโซลของเบราว์เซอร์ฉันใช้สิ่งนี้:

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
        });
    }
}-*/;
}
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.