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

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

例如:

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

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

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

所以我的问题:

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

【问题讨论】:

  • 您使用什么记录应用程序来放置行号和文件名?
  • 默认检查器,可用于 Chrome、Safari 等

标签: javascript logging abstraction


【解决方案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'));
      }
      

      【讨论】:

      • 谢谢,能不能具体点,具体是做什么的,什么时候用,怎么用?
      猜你喜欢
      • 1970-01-01
      • 2017-03-31
      • 1970-01-01
      • 2011-06-05
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多