获取控制台包装器以在正确的行上记录消息

时间:2014-12-12 17:55:52

标签: javascript logging

我为控制台日志记录创建了一个包装器。我无法让它显示调用包装函数的记录行号。我已经看过其他帖子来处理这个问题,但我似乎无法得到他们提到的内容。它们基本上将console.log绑定到外部函数,但我需要在使用之前进行其他工作。

我的设置可以吗?

Error Free JsFiddle



var logger = (function (window, console) {

    // logger object
    function logger() {

        // use to initialize the logger
        function init() {
            fixConsole();
        }

        // fix missing console
        function fixConsole() {
            var logmethod;
            var noop = function () { };
            var logmethods = [
                'assert', 'clear', 'count', 'debug', 'dir', 'dirxml', 'error',
                'exception', 'group', 'groupCollapsed', 'groupEnd', 'info', 'log',
                'markTimeline', 'profile', 'profileEnd', 'table', 'time', 'timeEnd',
                'timeStamp', 'trace', 'warn'
            ];

            var length = logmethods.length;
            console = (window.console = window.console || {});

            while (length--) {
                logmethod = logmethods[length];

                // Only stub undefined methods.
                if (!console[logmethod]) {
                    console[logmethod] = noop;
                }
            }
        }

        // initializing the logger
        init();
    }

    // logging methods
    logger.prototype = {
        info: function (msg, title) {
            
            if (title)
                console.log(title + ": " + msg);
            else
                console.log(msg);
        }
    }

    // create logger
    function _create() {

        // create logger
        var log = new logger();

        // return logger
        return log;
    }

    // exposed functions
    return {
        create: _create
    }

})(window, console);

var log = logger.create();

log.info('Hello, I am trying to get the logger to log under the line number info is used on.');





log.info('For instance I want line number 75 to show.');

<h1> Press F12 and look at the console to see</h1>
&#13;
&#13;
&#13;

2 个答案:

答案 0 :(得分:0)

我不确定你想要什么。

但是如果你想获得调用它的正确行号,也许你需要追踪堆栈。

尝试console.trace()功能。

// 2016-6-24更新

我最近遇到了同样的问题,我发现你能找到正确行号的唯一方法是在正确的地方调用记录功能,你永远无法通过调用获得正确的号码另一个帮助您进行日志记录的功能。

你不能以这种方式做任何事情,但不知怎的,你可以做一些事情来获得一个新的记录器然后直接调用它(就像你说的那样,使用.bind)。

这就是我们在项目中所做的事情,在我们的例子中,我们需要将许多信息包装到我们所有的console.log中,并且所有信息只能由req对象访问。 (快递中)

所以我们写一个中间件来帮助。

export default function logFactory() {
  return (req, res, next) => {
    function getLogger(type = 'log', ...args) {
      let user = 'unknown';
      try {
        user = req.session.cas.user;
      } catch (e) {
      }

      if (!console[type]) {
        console.error('invalid console type', type);
      }

      return console[type].bind(console[type], `${req.sn}|${user}|${req.ip}|`, ...args);
    }

    req.getLogger = getLogger;

    req.log = {
      debug: getLogger('log'),
      info: getLogger('log'),
      log: getLogger('log'),
      warn: getLogger('warn'),
      error: getLogger('error')
    };
  }
}

然后我们可以使用我们需要的所有信息来执行console.log并通过调用req.log.info('Any business infos here')获取正确的行号。

这就是我们通过使用winston获取日志文件的内容。

2016-06-24 17:47:52|4497|DEBUG|RequestUtils.js:256|0e84f1c3-d5b7-4578-9b83-f03fe9951fb1| unknown| 10.240.138.19| Receiving response from POST /statics/add_pv_uv?portal_auth_key=af27c0bc-cc04-4821-a4de-cbb93c0ed19f  200  60ms.

答案 1 :(得分:0)

准确地说我做了什么来获取错误号码,包括抓取它所需的正则表达式。

        var err = getErrorObject();
        var caller_line = err.stack.split("\n")[4];
        var index = caller_line.indexOf("at ");
        var clean = caller_line.slice(index+2, caller_line.length);
        var number = clean.match(/(?!:)\d*(?=\:)/g);
        console.log(number[0]);