javascript 抽象控制台日志记录

Posted

技术标签:

【中文标题】javascript 抽象控制台日志记录【英文标题】:javascript abstract console logging 【发布时间】:2011-10-11 00:10:22 【问题描述】:

我想做一个函数,像这样。

例如:

function Logger() 
    this.log = function(msg) 
        console.log(msg);
    

我想在函数/模块等中使用它,一切正常。 但是我浏览器中的默认控制台通常会给出 fileName + lineNumber。

现在,当我抽象此功能时,fileNamelineNumber 不在我放置 instance.log() 的位置。因为它会说从哪里调用 console.log,而不是函数本身。

所以我的问题:

如何从我想使用我的记录器的地方获取正确的信息? 或者请给我任何改进此功能的提示。

【问题讨论】:

您使用什么记录应用程序来放置行号和文件名? 默认检查器,可用于 Chrome、Safari 等 【参考方案1】:
function Logger() 
    this.log = console.log.bind(console);

我前段时间问过这个问题:Create shortcut to console.log() in Chrome。

【讨论】:

【参考方案2】:

尝试分配函数:

(function () 
    window.log = (console && console.log 
        ? console.log 
        : function ()  
              // Alternative log
          );
)();

稍后只需在您的代码中调用log('Message')

【讨论】:

【参考方案3】:

尝试使用类似这样的回溯功能:

function printStackTrace() 
    var callstack = [];
    var isCallstackPopulated = false;
    try 
        i.dont.exist += 0; //doesn't exist- that's the point
     catch (e) 
        if (e.stack)  //Firefox
            var lines = e.stack.split('\n');
            for (var i = 0, len = lines.length; i & lt; len; i++) 
                if (lines[i].match(/^\s*[A-Za-z0-9\-_\$]+\(/)) 
                    callstack.push(lines[i]);
                
            
            //Remove call to printStackTrace()
            callstack.shift();
            isCallstackPopulated = true;
        
        else if (window.opera & amp; & amp; e.message)  //Opera
            var lines = e.message.split('\n');
            for (var i = 0, len = lines.length; i & lt; len; i++) 
                if (lines[i].match(/^\s*[A-Za-z0-9\-_\$]+\(/)) 
                    var entry = lines[i];
                    //Append next line also since it has the file info
                    if (lines[i + 1]) 
                        entry += ' at ' + lines[i + 1];
                        i++;
                    
                    callstack.push(entry);
                
            
            //Remove call to printStackTrace()
            callstack.shift();
            isCallstackPopulated = true;
        
    
    if (!isCallstackPopulated)  //IE and Safari
        var currentFunction = arguments.callee.caller;
        while (currentFunction) 
            var fn = currentFunction.toString();
            var fname = fn.substring(fn.indexOf( & amp; quot;

            function & amp; quot;) + 8, fn.indexOf('')) || 'anonymous';
            callstack.push(fname);
            currentFunction = currentFunction.caller;
        
    
    output(callstack);


function output(arr) 
    //Optput however you want
    alert(arr.join('\n\n'));

【讨论】:

谢谢,能不能具体点,具体是做什么的,什么时候用,怎么用?

以上是关于javascript 抽象控制台日志记录的主要内容,如果未能解决你的问题,请参考以下文章

使用 Firefox 将 JavaScript 控制台记录到日志文件中

我可以在 javascript 中扩展控制台对象(用于重新路由日志记录)吗?

SLF4J - 一个允许你统一日志记录API的抽象层

一个记录到我们后端的 JavaScript 前端日志系统?

在Java中处理日志记录

Javascript 提供了哪些调试日志记录工具? [关闭]