1

我创建了 GWT 应用程序,其中有一个垂直面板,用于记录详细信息。

我正在使用记录器进行客户端日志记录

示例代码是:

         public static VerticalPanel customLogArea = new VerticalPanel();
         public static Logger rootLogger = Logger.getLogger("");
                    logerPanel.setTitle("Log");
        scrollPanel.add(customLogArea);
        logerPanel.add(scrollPanel);
        if (LogConfiguration.loggingIsEnabled()) {
        rootLogger.addHandler(new HasWidgetsLogHandler(customLogArea));

        }

我正在使用此代码更新我的垂直日志面板

         rootLogger.log(Level.INFO,
                        "Already Present in Process Workspace\n");

但现在我的问题是,我必须将服务器端详细信息也记录到我的垂直日志面板中。

我的服务器端 GreetingServiceImpl 代码是:

      public boolean createDirectory(String fileName)
             throws IllegalArgumentException {
    Boolean result = false;
    try {
        rootLogger.log(Level.INFO,
                 "I want to log this to my UI vertical log Panel");

        system.out.println("log this to UI");
        File dir = new File("D:/GenomeSamples/" + fileName);
        if (!dir.exists()) {
            result = dir.mkdir();
        }
    } catch (Exception e) {
        e.printStackTrace();
    }
    return result;
}

现在我想从这里将 sysoutprt 语句记录到我的 UI 中。我怎样才能做到这一点。现在使用 rootLogger.log(Level.INFO, "I want to log this to my UI vertical log Panel"); 将其记录到 Eclipse 控制台的代码。但是如何在客户端将其记录到我的 UI 中。

如果这个问题有任何问题,请告诉我。

4

3 回答 3

3

如果我理解正确,您希望在 Web 界面中查看您的服务器日志条目。当然,java logger 和 printStackTrace() 不会帮助您:您的 gwt 代码被编译为 JavaScript,与控制台和日志文件无关。此外,您的服务器无法将日志条目“推送”到客户端 - 由客户端发出请求。因此,如果您想跟踪新的日志条目并将其移动到客户端,则需要轮询服务器以获取新条目。还有一个问题:您可能有许多客户端轮询您的 servlet,您应该记住这种多线程。

这就是我看到可能实现的方式(这只是概念,可能包含一些错误和拼写错误):

远程接口:

public interface GreetingService extends RemoteService {
    List<String> getLogEntries();
    boolean createDirectory(String fileName)throws IllegalArgumentException;

}

远程小服务程序:

public class GreetingServiceImpl extends RemoteServiceServlet implements GreetingService {

public static final String LOG_ENTRIES = "LogEntries";

public List<String> getLogEntries() {

    List<String> entries = getEntriesFromSession();
    List<String>copy = new ArrayList<String>(entries.size());
    copy.addAll(entries);
    //prevent loading the same entries twice
    entries.clear();
    return copy;

}



public boolean createDirectory(String fileName)throws IllegalArgumentException {
    Boolean result = false;
    try {

        log("I want to log this to my UI vertical log Panel");

        log("log this to UI");
        File dir = new File("D:/GenomeSamples/" + fileName);
        if (!dir.exists()) {
            result = dir.mkdir();
        }
    } catch (Exception e) {
        log("Exception occurred: " + e.getMessage());
    }
    return result;
}

private List<String> getEntriesFromSession()    {
    HttpSession session= getThreadLocalRequest().getSession();
    List<String>entries = (List<String>)session.getAttribute(LOG_ENTRIES);
    if (entries == null)    {
        entries = new ArrayList<String>();
        session.setAttribute(LOG_ENTRIES,entries);
    }

    return entries;

}

private void log(String message)  {
    getEntriesFromSession().add(message);
}

轮询的简单实现(gwt客户端):

Timer t = new Timer() {
  @Override
  public void run() {
    greetingAsyncService.getLogEntries(new AsyncCallBack<List<String>>() {
       void onSuccess(List<String>entries) {
         //put entries to your vertical panel
       }

       void onFailure(Throwable caught){
           //handle exceptions
       }
    });
  }
};

// Schedule the timer to run once in second.
t.scheduleRepeating(1000);

greetingAsyncService.createDirectory(fileName, new AsyncCallBack<Void>(){
    void onSuccess(List<String>entries) {
          //no need to poll anymore
          t.cancel();
       }

       void onFailure(Throwable caught){
           //handle exceptions
       }
});

}

如您所见,我使用 session 来保存日志条目,因为 session 是特定于客户端的,因此不同的客户端将收到不同的日志。由您决定使用什么 - 您可以创建自己的 Logger 类,该类将跟踪用户本身并将适当的日志提供给适当的客户端。

此外,您可能希望保存消息的级别(INFO、ERROR 等),然后以不同的颜色显示消息(例如,红色表示 ERROR)。为此,您需要保存的不是列表,而是一些您的自定义类。

于 2013-09-18T17:47:54.403 回答
0

您将创建一个与日志框架具有相同方法的日志 servlet,以通过 RPC 将日志消息发送到您的服务器。

以下是您可以使用的一些示例 RPC 日志方法:

public interface LogService extends RemoteService {
    public void logException(String logger, String priority, String message, String error, StackTraceElement[] stackTrace, String nativeStack);
}

public interface LogServiceAsync {
    public void logException(String logger, String priority, String message, String error, StackTraceElement[] stackTrace, String nativeStack, AsyncCallback<Void> callback);
}

public class LogServiceImpl extends RemoteServiceServlet implements LogService {

    public void logException(String loggerName, String priority, String logMessage, String errorMessage, StackTraceElement[] stackTrace, String nativeStack) {      
        Logger logger = getLogger(loggerName);
        Level level = getLevel(priority);
        // Create a Throwable to log
        Throwable caught = new Throwable();
        if (errorMessage != null && stackTrace != null) {
            caught = new Throwable(errorMessage);
            caught.setStackTrace(stackTrace);
        }
        //do stuff with the other passed arguments (optional)
        logger.log(level, message, caught);
    }
}
于 2013-09-18T16:31:54.317 回答
0

尽管这些实现非常好,但忘记计时器和重复的服务器查询。我们现在有了更好的东西。

可以使用支持WebSockets的Atmosphere将数据从服务器推送到客户端。

于 2013-09-18T21:54:30.063 回答