【问题标题】:log4javascript - open the same PopUpAppender so all the log is in one log windowlog4javascript - 打开相同的 PopUpAppender,以便所有日志都在一个日志窗口中
【发布时间】:2013-10-15 16:11:46
【问题描述】:

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

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

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

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

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

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

【问题讨论】:

  • 我会考虑一下并回复你。
  • 嗨,蒂姆 - 你有时间看看我的“所有日志在一个窗口中”问题吗?
  • 它在我的清单上。我确实打算看看它。
  • 因为我们越来越接近我的问题的“六个月纪念日”,所以我想知道您是否考虑过。

标签: javascript logging log4javascript


【解决方案1】:

我可能会在 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);

【讨论】:

  • 尝试使用这个,但无法调用wrappedAppender.show() - 我该怎么办?
【解决方案2】:

如果您查看 log4javascript.js 内部,您会看到 PopUpAppender 被配置为在每次显示时清除其记录的事件列表(未压缩版本中的第 4839 行):

        while (queuedLoggingEvents.length > 0) {
            queuedLoggingEvents.shift().append();
        }

如果您希望在弹出窗口关闭然后重新打开后仍保留日志条目,快速解决方法是将上述代码 sn-p 更改为:

        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。希望这可以帮助! :)

【讨论】:

    【解决方案3】:

    @提姆

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

    我现在遇到了以下情况:

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

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

    自定义 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);
            }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2016-06-07
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-03-27
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多