【问题标题】:Get console wrapper to log message on correct line [duplicate]获取控制台包装器以在正确的行上记录消息 [重复]
【发布时间】:2014-12-12 17:55:52
【问题描述】:

我为控制台日志创建了一个包装器。我一直无法让它显示调用包装函数的记录行号。我查看了其他帖子来处理这个问题,但我似乎无法得到他们提到的内容。他们基本上是将 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>

【问题讨论】:

  • not with console.log this question 有其他选择。
  • 我很害怕 :( 谢谢你的链接,我读完了。
  • @scrappedcola 如果您想留下答案,请给它贴上标签,因为我得到了我需要的东西,不幸的是,它不如内置的行链接好,但您能做什么:/.

标签: javascript logging


【解决方案1】:

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

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

【讨论】:

    【解决方案2】:

    我不确定你想要什么。

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

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

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

    这就是我们通过使用 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.
    

    【讨论】:

    • 我无法获得正确的行号,它很接近但还不够。谢谢。
    • @Tony 我认为您只能通过直接调用日志记录函数而不是通过调用另一个帮助您进行日志记录的函数来获得正确的数字。但是您可以通过某种方式获得一个可以满足您要求的新记录器,然后直接调用它,请查看我更新的答案,看看这是否有帮助。
    猜你喜欢
    • 2014-06-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-04-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多