【问题标题】:How to print to the console in GWT如何在 GWT 中打印到控制台
【发布时间】:2012-03-04 01:57:50
【问题描述】:

我正在调试一个 GWT 应用程序,我需要将一些内容打印到控制台以进行测试。 System.out.println 和 GWT.log 不起作用。有人有什么想法吗?

【问题讨论】:

标签: gwt


【解决方案1】:

引用文档:

添加 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.log 不起作用的评论是您被否决的原因。
  • 是的,GWT.log 仅适用于 DevMode,因此如果您使用 GWT 编译器编译代码,您将永远看不到 GWT.log() 的任何输出。
  • @Andrew 哎呀。你确实是正确的。这个答案已经很久了,我已经忘记了它:) GWT.log not 在 Web 模式下工作。
  • 由于this bug,这可能在 IE 的控制台记录器中不起作用。他们说它在 GWT 2.6 中已修复。
  • 您使用的 Logger 类导入是什么?这真是令人沮丧。
【解决方案2】:

我需要在通过 PhoneGap(和 gwt-phonegap)部署到 Android 设备/模拟器的 GWT 应用程序的上下文中执行此操作。上面的 System.out.println() 和 GWT 日志记录(带有模块声明)都没有出现在 Android 的 logcat 中,所以我对 console.log 使用了一个简单的 JSNI 包装器:

  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 );
  }-*/;

【讨论】:

【解决方案3】:

我也有这个问题。 GWT 日志有效,但因为它全部转换为 javascript,它会打印到客户端输出,所以只需查看浏览器的控制台,它们就会出现。在谷歌浏览器中点击右上角的三行自定义按钮,点击工具-->开发者工具,会弹出控制台。您的抢手陈述将在那里。此外,Ctrl+Shift+I 是启动它的快捷方式。如果您想打印到服务器,我相信记录器处理程序等是有序的?

【讨论】:

    【解决方案4】:

    第一个答案中的文档 url 已经提供了不同的配置选项来登录到不同的位置。 我编写的这个框架为您提供了一个有用的 API,并允许您选择您的服务器端日志记录实现。 看一看 : https://code.google.com/p/gwt-usefull-logging/

    【讨论】:

      【解决方案5】:

      我建议您使用GWT Developer mode 它会增加一点开销,导致代码服务器上的自动编译和代码分配,但是当您的应用程序的客户端出现一些异常时,它是非常清楚的。我的意思是,有时 chrome 控制台(或 firebug 或任何浏览器调试内置工具)在这些情况下并没有说太多,相信我,当你试图弄清楚发生了什么时,找到 NullPointerException 是一件很痛苦的事情通过提醒您的代码。

      【讨论】:

        【解决方案6】:

        为了打印到浏览器控制台,我使用的是这样的:

        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
                });
            }
        }-*/;
        }
        

        【讨论】:

          【解决方案7】:

          要登录到浏览器控制台,您可以使用本机以非常简单的方式进行。对调试很有帮助。

          如果你像下面这样添加一个本地方法,你可以从你想要的地方向它发送一个字符串,它会在浏览器控制台中记录它。

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

          有关在 GWT 中使用本机的更多信息: http://www.gwtproject.org/doc/latest/DevGuideCodingBasicsJSNI.html

          【讨论】:

          • 另外,您可以给它其他东西(例如:JavaScriptObject)并控制它,而不是将参数作为字符串提供。
          【解决方案8】:

          在 GWT 2.6.0 版本中,方法 GWT.log 将消息写入浏览器控制台,您不需要编写本地方法。

          【讨论】:

          • 我希望这会奏效。我添加了一个 GWT.log("Easy to find"),然后在整个项目中搜索字符串“Easy to find”。它只在我的来源中。我检查了 GWT 文档。它说“GWT.log”仅适用于开发窗口中的开发模式。 gwtproject.org/doc/latest/DevGuideLogging.html
          • 不,GWT.log 仅用于 DEV/SUPERDEV 模式,不能用于生产(它会被 GWT 的编译器剪掉)。
          【解决方案9】:

          只是在一个 sn-p 中总结了mreppy 和Strelok 的答案中显示的不同可能性。我还为 IE 异常添加了一种可能的解决方法,如下所述:Why does JavaScript only work after opening developer tools in IE once?

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

          【讨论】:

            【解决方案10】:

            使用本机控制台的另一个变体...

            添加这个类:

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

            【讨论】:

              【解决方案11】:

              你可以把 alaert.Alert("");在您的 gwt 代码中编译并运行它,当您发出请求或在您放置警报的操作时,您将在浏览器上弹出窗口

              【讨论】:

                猜你喜欢
                • 2014-08-28
                • 2013-05-22
                • 2013-01-27
                • 2013-01-21
                • 1970-01-01
                • 1970-01-01
                • 2018-12-15
                • 2016-09-21
                • 1970-01-01
                相关资源
                最近更新 更多