Como imprimir para o console no GWT

92

Estou depurando um aplicativo GWT e preciso imprimir algumas coisas no console para fins de teste. System.out.printlne GWT.lognão funcionam. Alguém tem alguma idéia?

andrewsi
fonte
1
Tente as respostas postadas aqui: stackoverflow.com/questions/17463928/…
Chepech

Respostas:

76

Citando a documentação:

Adicionar o registro GWT é realmente muito simples, tão simples quanto o exemplo de código a seguir. No entanto, é importante entender como funciona o registro e como configurá-lo corretamente, portanto, reserve um tempo para ler o restante deste documento.

http://code.google.com/webtoolkit/doc/latest/DevGuideLogging.html

A maneira mais simples de habilitar o registro é:

# 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");
Strelok
fonte
1
Acho que o comentário sobre GWT.log não está funcionando é o motivo pelo qual você foi rejeitado.
checketts de
11
Sim, GWT.log só funciona no DevMode, portanto, se você estiver compilando seu código com o compilador GWT, nunca verá nenhuma saída de GWT.log ().
Andrew Mackenzie
2
@Andrew Ooops. Você está realmente correto. Já faz tanto tempo que já me esqueci completamente :) GWT.log não funciona no modo web.
Strelok de
1
Isso pode não funcionar no logger do console do IE por causa desse bug . Eles dizem que está corrigido no GWT 2.6.
Brad Cupit de
2
Qual é a importação de classe Logger que você usou? Isso é realmente frustrante.
CrazySabbath,
49

Eu precisava fazer isso no contexto de um aplicativo GWT que foi implantado em um dispositivo / emulador Android via PhoneGap (e gwt-phonegap). Nem System.out.println () nem registro GWT como acima (com declaração de módulo) apareceram no logcat do Android, então eu recorri a um empacotador JSNI simples para 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 );
  }-*/;
mreppy
fonte
Para todos os usuários do Internet Explorer: para evitar exceções quando as ferramentas de desenvolvimento não estiverem abertas, é melhor encerrar a chamada em um bloco try catch ou usar uma das soluções declaradas aqui: stackoverflow.com/q/7742781/1845976
schnatterer
Você poderia dar uma olhada nesta pergunta ?
displayname
27

No GWT versão 2.6.0, o método GWT.log grava a mensagem no console do navegador, você não precisa escrever métodos nativos.

Zergood
fonte
1
Eu esperava que isso funcionasse. Eu adicionei um GWT.log ("Fácil de encontrar") e então procurei em todo o projeto pela string "Fácil de encontrar". Foi apenas na minha fonte. Verifiquei os documentos do GWT. Diz que o "GWT.log" é apenas para o modo dev na janela dev. gwtproject.org/doc/latest/DevGuideLogging.html
ChrisCantrell
Não, GWT.log é apenas para modo DEV / SUPERDEV, mas não para uso em produção (será cortado pelo compilador do GWT).
Wladimir Schmidt
24

Para acessar o console do navegador, você pode fazer isso usando o nativo, de uma forma muito simples. Muito útil na depuração.

Se você adicionar um método nativo como o abaixo, você pode enviar uma string para ele de onde quiser e ele irá registrá-lo no console do navegador.

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

Para obter mais informações sobre como usar o nativo no GWT: http://www.gwtproject.org/doc/latest/DevGuideCodingBasicsJSNI.html

erkinyldz
fonte
Além disso, em vez de fornecer o parâmetro como String, você pode fornecer outra coisa (exemplo: JavaScriptObject) e consolar isso.
erkinyldz
7

Apenas resumindo as diferentes possibilidades mostradas nas respostas de mreppy e Strelok em um trecho. Também adicionei uma possível solução alternativa para as exceções do IE, conforme descrito aqui: Por que o JavaScript só funciona depois de abrir as ferramentas do desenvolvedor no IE uma vez?

    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);
schnatterer
fonte
5

Mais uma variação usando o console nativo ...

Adicione esta classe:

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

Em seguida, ative a depuração com ele em algum momento, como ao iniciar o aplicativo:

public class XXXXXX implements EntryPoint {
    @Override
    public void onModuleLoad() {
        Debug.enable();
        ...
    }
}

Em seguida, use-o assim:

Debug.log("Hello World!");
BuvinJ
fonte
0

Eu tive esse problema também. O log do GWT funciona, mas como é todo convertido para javascript, ele é impresso na saída do cliente, portanto, basta visualizar o console do seu navegador e eles estarão lá. No Google Chrome, clique no botão Personalizar de linha tripla no canto superior direito, clique em Ferramentas -> Ferramentas do desenvolvedor e o console aparecerá. Suas declarações desejadas estarão lá. Além disso, Ctrl + Shift + I é o atalho que o abre. Se você deseja imprimir para o servidor, acredito que os gerenciadores de log e outros estão em ordem?

Glenninator
fonte
0

O url da documentação na primeira resposta já dá a opção de configuração diferente para logar em locais diferentes. Esta estrutura que escrevi oferece uma API útil e permite que você escolha sua implementação de log do lado do servidor. Dê uma olhada: https://code.google.com/p/gwt-usefull-logging/

François Wauquier
fonte
0

Eu sugiro que você use o modo GWT Developer. Ele adiciona um pouco de sobrecarga devido à compilação automática e alocação de código no servidor de código, mas fica bem claro quando algumas exceções surgem no lado do cliente de seu aplicativo. Quer dizer, algumas vezes o console do Chrome (ou o firebug ou qualquer outra ferramenta embutida de depuração do navegador) não diz muito nessas situações, acredite, encontrar um NullPointerException é uma dor no pescoço quando você tenta descobrir o que está acontecendo alertando seu código.


fonte
0

Para imprimir no console do navegador, estou usando algo assim:

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