log4javascript - 打开相同的PopUpAppender,以便所有日志都在一个日志窗口中

时间:2013-10-15 16:11:46

标签: javascript logging log4javascript

log4javascript可以重用相同的(完全相同的)PopUpAppender吗?

我的意思是:一旦开始记录,PopUpAppender就会创建一个新窗口(通常带有' windowId '类似于''log4javascriptConsoleWindow_1381843187828_742325019557029'*)。

现在,appender(PopUpAppender)设置为: appender.setReopenWhenClosed(true) - 在这种情况下,即使窗口关闭,下一条日志消息也会为它打开一个新窗口。 我想要的是取回先前关闭的窗口(具有奇怪的 windowId 的窗口),以便我的所有日​​志消息都在一个地方。

用几句话来说 - 我只想在1个窗口中显示所有日志消息。

这样做的一种方法(我认为) - 是修改代表PopUpAppender的HTML并修改生成 windowId 的行 - 这样每次都会创建相同的窗口。到目前为止一切都很好 - 只有“LogEntry”数组被清空。因此,在记录之前,您可能需要保存它们,然后以某种方式将它们插入(在开始时)新窗口中。

我愿意尝试这个 - 我不确定这是正确的方法 - 所以如果有人有更好的想法,请与我们分享(我)。

3 个答案:

答案 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);
        }