Tôi đang gỡ lỗi một ứng dụng GWT và tôi cần in một số nội dung vào bảng điều khiển cho mục đích thử nghiệm. System.out.println
và GWT.log
không hoạt động. Có ai có ý tưởng nào?
Câu trả lời:
Trích dẫn tài liệu:
Việc thêm ghi nhật ký GWT thực sự khá đơn giản, đơn giản như ví dụ mã sau. Tuy nhiên - việc hiểu cách ghi nhật ký hoạt động và cách định cấu hình chính xác là điều quan trọng, vì vậy hãy dành thời gian đọc phần còn lại của tài liệu này.
http://code.google.com/webtoolkit/doc/latest/DevGuideLogging.html
Cách đơn giản nhất để kích hoạt ghi nhật ký là:
# 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");
Tôi cần thực hiện việc này trong bối cảnh ứng dụng GWT đã được triển khai tới thiết bị / trình mô phỏng Android qua PhoneGap (và gwt-phonegap). Ghi nhật ký System.out.println () và GWT như ở trên (với khai báo mô-đun) đều không hiển thị trong logcat của Android, vì vậy tôi đã sử dụng trình bao bọc JSNI đơn giản cho 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 );
}-*/;
Trong GWT phiên bản 2.6.0, phương thức GWT.log ghi thông báo vào bảng điều khiển của trình duyệt, bạn không cần phải viết các phương thức gốc.
Để đăng nhập vào bảng điều khiển của trình duyệt, bạn có thể thực hiện bằng cách sử dụng bản địa, một cách rất đơn giản. Rất hữu ích trong việc gỡ lỗi.
Nếu bạn thêm một phương thức gốc như bên dưới, bạn có thể gửi một chuỗi đến nó từ nơi bạn muốn và nó sẽ ghi nó vào bảng điều khiển của trình duyệt.
public static native void console(String text)
/*-{
console.log(text);
}-*/;
Để biết thêm thông tin về cách sử dụng native trong GWT: http://www.gwtproject.org/doc/latest/DevGuideCodingBasicsJSNI.html
Chỉ cần tổng hợp các khả năng khác nhau được hiển thị trong câu trả lời của mreppy và Strelok trong một đoạn mã. Tôi cũng đã thêm một giải pháp khả thi cho các trường hợp ngoại lệ của IE như được mô tả ở đây: Tại sao JavaScript chỉ hoạt động sau khi mở các công cụ dành cho nhà phát triển trong IE một lần?
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);
Tuy nhiên, một biến thể khác bằng cách sử dụng bảng điều khiển gốc ...
Thêm lớp này:
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 ); }-*/;
}
Sau đó, bật gỡ lỗi với nó tại một số thời điểm, như khi khởi động ứng dụng:
public class XXXXXX implements EntryPoint {
@Override
public void onModuleLoad() {
Debug.enable();
...
}
}
Sau đó, chỉ cần sử dụng nó như vậy:
Debug.log("Hello World!");
Tôi cũng có vấn đề này. Nhật ký GWT hoạt động nhưng vì tất cả được chuyển đổi sang javascript, nó in ra đầu ra của ứng dụng khách, vì vậy chỉ cần xem bảng điều khiển của trình duyệt của bạn và chúng sẽ ở đó. Trong Google Chrome, nhấp vào nút Tùy chỉnh ba dòng ở trên cùng bên phải, nhấp vào Công cụ -> Công cụ dành cho nhà phát triển và bảng điều khiển sẽ bật lên. Các tuyên bố sau khi tìm kiếm của bạn sẽ ở đó. Ngoài ra, Ctrl + Shift + I là phím tắt đưa nó lên. Nếu bạn muốn in tới máy chủ, tôi tin rằng các trình xử lý trình ghi nhật ký và như vậy là theo thứ tự?
Url tài liệu trong câu trả lời đầu tiên đã cung cấp tùy chọn cấu hình khác nhau để đăng nhập vào những nơi khác nhau. Khung mà tôi đã viết này cung cấp cho bạn một api hữu ích và cho phép bạn chọn triển khai ghi nhật ký phía máy chủ của mình. Hãy xem: https://code.google.com/p/gwt-usefull-logging/
Tôi khuyên bạn nên sử dụng chế độ Nhà phát triển GWT Nó thêm một chút chi phí gây ra việc biên dịch tự động và phân bổ mã trên máy chủ mã, nhưng khá rõ ràng khi một số ngoại lệ phát sinh trong phía máy khách của ứng dụng của bạn. Ý tôi là, đôi khi bảng điều khiển chrome (hoặc firebug hoặc bất kỳ công cụ gỡ lỗi trình duyệt nào được tích hợp sẵn) không nói quá nhiều trong những tình huống đó, tin tôi đi, việc tìm kiếm một NullPointerException là một cơn đau thắt cổ khi bạn cố gắng tìm ra điều gì đang xảy ra bằng cách cảnh báo mã của bạn.
Để in ra bảng điều khiển trình duyệt, tôi đang sử dụng một cái gì đó như sau:
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
});
}
}-*/;
}