使用console.log功能实现客户端记录器

问题描述 投票:0回答:1

为了在浏览器中扩展

console.log
,并添加一些额外功能(例如时间戳和日志级别),我想出了以下实现:

  const LOG_LEVELS = {
    DEBUG: 0,
    INFO: 1,
    WARN: 2,
    ERROR: 3,
    NONE: 4,
  };

  const Logger = {
    debug:
      loglevel === LOG_LEVELS.DEBUG
        ? Function.prototype.bind.call(
            console.log,
            console,
            new Date().toISOString() + ": [DEBUG]"
          )
        : function () {},
    info:
      loglevel <= LOG_LEVELS.INFO
        ? Function.prototype.bind.call(
            console.log,
            console,
            new Date().toISOString() + ": [INFO]"
          )
        : function () {},
    warn:
      loglevel <= LOG_LEVELS.WARN
        ? Function.prototype.bind.call(
            console.log,
            console,
            new Date().toISOString() + ": [WARN]"
          )
        : function () {},
    error:
      loglevel <= LOG_LEVELS.ERROR
        ? Function.prototype.bind.call(
            console.error,
            console,
            new Date().toISOString() + ": [ERROR]"
          )
        : function () {},
  };

它的优点是可以以与

console.xxx
调用相同的方式维持文件和代码行信息。

但是:显然日期信息是与

bind
一起生成的,而不是在调用
Logger.debug
等时生成的,因此所有日志条目都显示相同的日期/时间信息。

有没有办法(也许使用 apply?)在

Logger.xxxx
函数执行时生成日期信息?我尝试了一些方法,但没有一个能接近。这就是为什么我发布原始代码。

logging browser console log-level
1个回答
0
投票

我想出了一个解决方法......尽管我宁愿以不同的方式解决它

有了这个

  const LOG_LEVELS = {
    DEBUG: 0,
    INFO: 1,
    WARN: 2,
    ERROR: 3,
    NONE: 4,
  };

  const Logger = {
    debug:
      loglevel === LOG_LEVELS.DEBUG
        ? function () {
            const timestamp = new Date().toISOString() + ": [DEBUG]";
            return Function.prototype.bind.call(
              console.log,
              console,
              timestamp
            );
          }
        : function () {},
    info:
      loglevel <= LOG_LEVELS.INFO
        ? function () {
            const timestamp = new Date().toISOString() + ": [INFO]";
            return Function.prototype.bind.call(
              console.log,
              console,
              timestamp
            );
          }
        : function () {},
    warn:
      loglevel <= LOG_LEVELS.WARN
        ? function () {
            const timestamp = new Date().toISOString() + ": [WARN]";
            return Function.prototype.bind.call(
              console.log,
              console,
              timestamp
            );
          }
        : function () {},
    error:
      loglevel <= LOG_LEVELS.ERROR
        ? function () {
            const timestamp = new Date().toISOString() + ": [ERROR]";
            return Function.prototype.bind.call(
              console.error,
              console,
              timestamp
            );
          }
        : function () {},
  };

一切似乎都很顺利。我唯一需要做的就是将

Logger.debug("xxxx")
替换为
Logger.debug()("xxxx")
。虽然不是很好,但效果完美。

© www.soinside.com 2019 - 2024. All rights reserved.