【问题标题】:Browsers: console groups浏览器:控制台组
【发布时间】:2013-01-25 04:12:15
【问题描述】:

我有这个代码:

console.log('before');

console.groupCollapsed('main');
console.log('test1')
console.groupEnd();

console.groupCollapsed('main');
console.log('test2')
console.groupEnd();

console.groupCollapsed('main');
console.log('test2')
console.groupEnd();

console.log('after');

它将 3 行添加到浏览器日志中。
问题是日志被分成 3 个不同的组。
如果之前的日志消息和当前的日志消息具有相同的组名 (main),是否可以将日志附加到上一个组?

所以现在输出是:

before
> main
    test1
> main
    test2
> main
    test3
after

我想要这个输出:

before
> main
    test1
    test2
    test3
after

更新:代码是异步的。所以我应该在登录后关闭组,以防止从组外登录到组。

【问题讨论】:

  • 在使用 console.log 之前不使用groupEnd 的明显行为怎么办?像魅力一样工作。

标签: javascript logging browser console


【解决方案1】:

自定义记录器类怎么样

function Logger(){
    var logs = [];
    var gname = "default";
    function group(name){
        gname = name
    }
    function log(){
        !!logs[gname] || (logs[gname] = []);
        logs[gname].push(Array.prototype.slice.call(arguments, 0));
    }
    function flush(){
      console.log(logs) // loop for groups or just output array
      logs=[]; // clear values
    }
    return {group:group,flush:flush,log:log}
}

用法

var l = new Logger()
l.group('main1');
l.log('foo','bar','foobar')
l.log('foo-bar')

l.group('main2');
l.log('foo')
l.log('bar')

l.group('main1');
l.log('foo2bar')
l.log('bar2foo')

l.group('main3');
l.log('foo')
l.log('bar')

l.group('main1');
l.log('foo3')
l.log('bar3')

l.flush()

【讨论】:

    【解决方案2】:

    您只能通过不关闭群组来做到这一点。你可以使用这样的东西:

    var curGroup;
    console.logInGroup = function(group, log) {
        if (curGroup != group) {
            console.groupEnd();
            console.groupCollapsed(curGroup = group);
        }
        console.log.apply(console, [].slice.call(arguments, 1));
    };
    
    console.log('before');
    console.logInGroup('main', 'test1');
    console.logInGroup('main', 'test2');
    console.logInGroup('main', 'test2');
    console.groupEnd();
    console.log('after');
    

    【讨论】:

    • 那不行:console.log('middle')console.logInGroup('main', 'test2'); 之后将登录main 组。
    • 是的,如果您想在组外登录,则需要手动结束。如果您担心在透明地想要隐藏打开/关闭命令时无法跟踪当前打开的组。
    【解决方案3】:

    除非您真的想创建一个新组,否则您不必重新打开一个新组。因此,一旦您打开一个组,您记录 的任何内容都将附加到该组,直到您关闭它为止。

    所以你的例子是

    console.log('before');
    
    console.groupCollapsed('main');
    console.log('test1');
    console.log('test2');
    console.log('test2');
    console.groupEnd();
    
    console.log('after');
    

    它不应该打扰您,但浏览器需要一些时间才能将这些记录成组。只是一个补充说明。

    【讨论】:

    • 异步代码中不可能出现的问题。我可能有一个包装器,可以打开/关闭组,但是我会遇到代码问题,它使用没有这个包装器的普通 console.log。
    • 在这种情况下,我的建议是将这些保留在数组中,直到您可以登录为止。因为如果你碰巧关闭了一个组,就没有办法溜回那个旧组(因为它已经在控制台中输出了)。
    • 问题是代码是异步的,我应该直接登录看看代码流。
    • 我明白了。但是正如我所提到的,一旦您关闭一个组或打开一个新组,除非您的目标组已经完成输出,否则您将无法回到旧组。但是,如果它还没有关闭,你仍然有这个机会。只需保持所需组打开,在某处跟踪当前打开组的名称(理想情况下,对象引用中的整个树)并检查它是否是所需组,并在必要时关闭它是否是内部组。如果我以任何方式让您感到困惑,请告诉我。
    • 如果组内消息之间有日志消息,可以中断组并启动新组。如果我要手动跟踪组,我会遇到代码问题,即没有跟踪组(其他库)。
    猜你喜欢
    • 2018-01-31
    • 1970-01-01
    • 1970-01-01
    • 2019-05-26
    • 2013-08-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多