【发布时间】:2011-01-26 12:01:36
【问题描述】:
我正在使用 GWT 2.1 java.util.logging emulation 来记录客户端消息。根据文档,提供了两个适用于客户端日志记录的格式化程序(TextFormatter 和 HTMLFormatter)。
谁能提供一个关于如何设置格式化程序并将其附加到 GWT 中的处理程序的示例?
谢谢
【问题讨论】:
我正在使用 GWT 2.1 java.util.logging emulation 来记录客户端消息。根据文档,提供了两个适用于客户端日志记录的格式化程序(TextFormatter 和 HTMLFormatter)。
谁能提供一个关于如何设置格式化程序并将其附加到 GWT 中的处理程序的示例?
谢谢
【问题讨论】:
请参阅 GWT 文档以记录 here。这实际上取决于您希望日志显示在哪里,但是如果您只关心在 Dev 模式下进行日志记录,那么您只需要 SystemLogHandler 和 DevelopmentModeLogHandler。 ConsoleLogHandler 和 FirebugLogHandler 用于 Web 模式日志记录到 chrome、firebug 和 firebug lite。 PopupLogHandler 和 HasWidgetsLogHandler 将日志消息添加到某种 UI 元素。以上所有内容都应该能够在 .gwt.xml 中启用/禁用,但 HasWidgetsLogHandler 除外,它需要关联的小部件容器。这应该可以通过添加以下内容来实现:
<inherits name="com.google.gwt.logging.Logging"/>
<set-property name="gwt.logging.logLevel" value="SEVERE"/> # To change the default logLevel
<set-property name="gwt.logging.enabled" value="FALSE"/> # To disable logging
<set-property name="gwt.logging.consoleHandler" value="DISABLED"/> # To disable a default Handler
<set-property name="gwt.logging.developmentModeHandler" value="DISABLED" />
<set-property name="gwt.logging.popupHandler" value="DISABLED" />
<set-property name="gwt.logging.systemHandler" value="DISABLED" />
<set-property name="gwt.logging.firebugHandler" value="DISABLED" />
<set-property name="gwt.logging.simpleRemoteHandler" value="ENABLED" />
etc...
【讨论】:
这是一个将日志处理程序添加到根记录器的简单示例。记录器使用 HTMLLogFormatter 并将消息放入 HTML 小部件中。
HTML html = new HTML();
// add the html widget somewhere in your code.
Logger.getLogger("").addHandler(new Handler() {
{
// set the formatter, in this case HtmlLogFormatter
setFormatter(new HtmlLogFormatter(true));
setLevel(Level.ALL);
}
@Override
public void publish(LogRecord record) {
if (!isLoggable(record)) {
Formatter formatter = getFormatter();
String msg = formatter.format(record);
html.setHTML(msg);
}
}
});
还可以看看HasWidgetsLogHandler,它基本上完成了上面示例中的处理程序所做的事情。
【讨论】:
import java.util.logging.Formatter; import java.util.logging.Handler; import java.util.logging.Level; import java.util.logging.LogRecord; import java.util.logging.Logger; import com.google.gwt.user.client.ui.HTML; import com.google.gwt.logging.client.HtmlLogFormatter;。您还需要为由此创建的匿名处理程序实现close() 和flush()(未显示)。
这是我最终使用的两个类:
import java.util.Date;
import java.util.logging.LogRecord;
import com.google.gwt.logging.impl.FormatterImpl;
public class LogFormatter extends FormatterImpl {
private static final StringBuilder sb = new StringBuilder();
@Override
public String format(LogRecord rec) {
synchronized (sb) {
sb.setLength(0);
sb.append(new Date(rec.getMillis()).toString());
sb.append(": ");
sb.append(rec.getMessage());
sb.append("\n");
return sb.toString();
}
}
}
import java.util.logging.Handler;
import java.util.logging.Level;
import java.util.logging.Logger;
public class ALog {
/* IMPORTANT: User blank string (root logger) here or else it WILL NOT have the formatter being used */
private static final Logger logger = Logger.getLogger("");
static {
for (Handler handler : logger.getHandlers()) {
handler.setFormatter(new LogFormatter());
handler.setLevel(Level.ALL);
}
}
public static void log(String msg) {
logger.log(Level.INFO, msg);
}
public static void log(String msg, Throwable e) {
logger.log(Level.INFO, msg, e);
}
}
【讨论】: