2

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

我的意思是什么:一旦你开始记录 PopUpAppender 将创建一个新窗口(通常带有一个' windowId ',比如 *'log4javascriptConsoleWindow_1381843187828_742325019557029'*)。

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

简而言之 - 我希望我的所有日​​志消息都在一个窗口中。

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

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

4

3 回答 3

3

我可能会在 log4javascript 2.0 中添加对此的支持。同时,我建议创建一个 appender 对象,该对象包装 PopUpAppender 并存储所有通过的日志事件,以便在弹出窗口重新打开时可以重新附加它们。

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);
于 2014-04-25T22:54:57.637 回答
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 的“clearMessagesAfterOpening”选项来控制此行为,在上面的代码中默认为 false。希望这可以帮助!:)

于 2015-01-22T17:10:39.900 回答
0

@蒂姆

我试着按照你的建议去做,但不知何故它一直困扰着我:)

我现在遇到了以下情况:

我有两个调试选项(仅使用弹出窗口进行调试):

1.:您可以添加一个 url 参数“debug=true”,它最初会打开 popupappender 窗口并记录消息。2.:您还可以从菜单选项中打开/关闭 popupappender。

问题是:如果动态关闭/打开,popupappender 会打开清理。

我需要的是:popupappender 不会重新打开清理,而是重新打开所有旧的日志记录事件。

解决方案:

我添加了第二个附加程序,它总是以静默方式记录所有内容(或者如果它被打开,也附加到 popupappender),因此我可以在 ui 重新打开 popupappender 时手动将所有静默记录的消息推送到 popupappender。

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

自定义附加程序相关的东西:

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);
        }
于 2014-05-12T11:16:19.527 回答