log4javascript可以重用相同的(完全相同的)PopUpAppender吗?
我的意思是:一旦开始记录,PopUpAppender就会创建一个新窗口(通常带有' windowId '类似于''log4javascriptConsoleWindow_1381843187828_742325019557029'*)。
现在,appender(PopUpAppender)设置为: appender.setReopenWhenClosed(true) - 在这种情况下,即使窗口关闭,下一条日志消息也会为它打开一个新窗口。 我想要的是取回先前关闭的窗口(具有奇怪的 windowId 的窗口),以便我的所有日志消息都在一个地方。
用几句话来说 - 我只想在1个窗口中显示所有日志消息。
这样做的一种方法(我认为) - 是修改代表PopUpAppender的HTML并修改生成 windowId 的行 - 这样每次都会创建相同的窗口。到目前为止一切都很好 - 只有“LogEntry”数组被清空。因此,在记录之前,您可能需要保存它们,然后以某种方式将它们插入(在开始时)新窗口中。
我愿意尝试这个 - 我不确定这是正确的方法 - 所以如果有人有更好的想法,请与我们分享(我)。
答案 0 :(得分:3)
我可以在log4javascript 2.0中添加对此的支持。与此同时,我建议创建一个包装PopUpAppender的appender对象,并存储所有通过的日志事件,以便在弹出窗口重新打开时重新附加它们。
function WrappedPopUpAppender(popUpAppender) {
var appender = this;
this.popUpAppender = popUpAppender;
this.loggingEvents = [];
this.closed = false;
popUpAppender.addEventListener("unload", function() {
appender.closed = true;
});
}
WrappedPopUpAppender.prototype = new log4javascript.Appender();
WrappedPopUpAppender.prototype.append = function(loggingEvent) {
this.loggingEvents.push(loggingEvent);
if (this.closed) {
for (var i = 0, evt; evt = this.loggingEvents[i++]; ) {
this.popUpAppender.append(evt);
}
this.closed = false;
} else {
this.popUpAppender.append(loggingEvent);
}
};
var popUpAppender = new log4javascript.PopUpAppender();
popUpAppender.setReopenWhenClosed(true);
var wrappedAppender = new WrappedPopUpAppender(popUpAppender);
var log = log4javascript.getLogger("main");
log.addAppender(wrappedAppender);
答案 1 :(得分:1)
如果您查看log4javascript.js,您将看到PopUpAppender配置为每次显示时都清除其记录的事件列表(未压缩版本中的第4839行):
while (queuedLoggingEvents.length > 0) {
queuedLoggingEvents.shift().append();
}
如果您希望在弹出窗口关闭然后重新打开后保留日志条目,则快速修复以上代码片段为:
for ( var i = 0; i < queuedLoggingEvents.length; i++ )
queuedLoggingEvents[i].append();
理想情况下,开发人员应该在PopUpAppender类中添加它作为选项,您可以通过添加以下行来实现:
第5254行,在PopUpAppender定义中:
var clearMessagesAfterOpening = this.defaults.clearMessagesAfterOpening;
第5284行,在PopUpAppender定义中:
this.isClearMessagesAfterOpening = function()
{
return clearMessagesAfterOpening;
};
this.setClearMessagesAfterOpening = function( clearMessagesAfterOpeningParam )
{
// This property can be safely altered after logging has started
clearMessagesAfterOpening = bool( clearMessagesAfterOpeningParam );
};
第5459行,在PopUpAppender.prototype.defaults定义中:
clearMessagesAfterOpening : false,
最后,更改第4839行的初始代码,以考虑新添加的选项:
for ( var i = 0; i < queuedLoggingEvents.length; i++ )
queuedLoggingEvents[i].append();
if ( clearMessagesAfterOpening )
queuedLoggingEvents.clear();
现在,您可以使用PopUpAppender&#34; clearMessagesAfterOpening&#34;来控制此行为。选项,默认情况下在上面的代码中为false。希望这可以帮助! :)
答案 2 :(得分:0)
@tim
我试着做你的建议,但不知何故它一直困扰着我:)
我现在最终遇到以下情况:
我的调试有两个选项(仅使用弹出窗口进行调试):
1:你可以添加一个url参数“debug = true”,它最初打开popupappender窗口并记录消息。 2:您也可以从菜单选项中打开/关闭popupappender。
问题是: 如果动态关闭/打开,popupappender会打开。
我需要什么: popupappender不能重新打开清理,但重新打开所有旧的日志记录事件。
解决方案:
我添加了第二个appender,它总是以静默方式记录所有内容(或者如果它被打开也会附加到popupappender),因此当ui重新打开时,我可以手动将所有静默记录的消息推送到popupappender。 / p>
与popupappender相关的东西:
var popupAppender = new log4javascript.PopUpAppender(),
layout = new log4javascript.PatternLayout('%d{yyyy MMM dd HH:mm:ss,SSS} %-5p %m');
popupAppender.setLayout(layout);
popupAppender.setThreshold(log4javascript.Level.TRACE);
......以后:
toggleAppender: function () {
var appender = log.getEffectiveAppenders();
if (!appender.length || appender.length <= 1) {
// just to make sure...
log.addAppender(popupAppender);
}
if (!popupAppender.isVisible()) {
// got some "old" logging events?!
for (var index = 0; index < loggingEvents.length; index++) {
popupAppender.append(loggingEvents[index]);
}
popupAppender.show();
} else {
popupAppender.hide();
}
},
isPopupAppenderVisible: function () {
return popupAppender.isVisible();
},
registerHeaderEventListener: function () {
// just some angularing stuff for changing the "open"/"close" string
var headerScope = angular.element('#headerBar').scope();
popupAppender.addEventListener("unload", function() {
headerScope.popupAppenderIsVisible = false;
});
popupAppender.addEventListener("load", function() {
headerScope.popupAppenderIsVisible = true;
});
}
自定义appender相关内容:
function CustomAppender() {}
CustomAppender.prototype = new log4javascript.PopUpAppender();
CustomAppender.prototype.layout = new log4javascript.PatternLayout('%d{yyyy MMM dd HH:mm:ss,SSS} %-5p %m');
CustomAppender.prototype.threshold = log4javascript.Level.TRACE;
CustomAppender.prototype.toString = function () {
return 'silent custom appender';
};
CustomAppender.prototype.append = function (loggingEvent) {
if (loggingEvent.length > 1) {
for (var index = 0; index < loggingEvent.length; index++) {
loggingEvents.push(loggingEvent[index]);
// update the popup appender if it is visible
if (popupAppender.isVisible()) {
popupAppender.append(loggingEvent[index]);
}
}
} else {
loggingEvents.push(loggingEvent);
// update the popup appender if it is visible
if (popupAppender.isVisible()) {
popupAppender.append(loggingEvent);
}
}
};
和一些初始化:
log4javascript.CustomAppender = CustomAppender;
var log = new log4javascript.getLogger('myLogger');
log.setLevel(log4javascript.Level.TRACE);
var customAppender = new log4javascript.CustomAppender();
log.addAppender(customAppender);
// the DEBUG var is true if the url wants it to be true
if (DEBUG) {
log.addAppender(popupAppender);
}