Я налагоджую програму 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 і Стрілець в одному фрагменті. Я також додав одне можливе рішення для винятків 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. Це додає трохи накладних витрат, оскільки автоматична компіляція та розподіл коду на сервері коду, але цілком зрозуміло, коли виникають деякі винятки на стороні клієнта вашої програми. Я маю на увазі, що іноді chrome console (або firebug або будь-який інший вбудований інструмент для налагодження браузера) не говорить занадто багато в цих ситуаціях, повірте мені, пошук 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
});
}
}-*/;
}