为了在浏览器中扩展
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
函数执行时生成日期信息?我尝试了一些方法,但没有一个能接近。这就是为什么我发布原始代码。
我想出了一个解决方法......尽管我宁愿以不同的方式解决它
有了这个
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")
。虽然不是很好,但效果完美。