时至今日,当在Google上搜索时,那些当年查看的日志库(如log4js和log4javascript)仍然是搜索结果的前几名,这可能意味着自定义解决方案的需求仍然存在。然而,如果这些库中的任何一个能满足需求,可能不应该自己从头开始构建...
基本上有两个要求:
实现了一个日志“模块”(没有花哨的模块,只是简单的揭示模块模式),一个控制台输出器模块和一个服务输出器模块。
日志系统提供了常见的日志方法,检查相应的级别是否启用,然后将调用转发给注册的输出器:
// JavaScript
function isLogLevelEnabled(logLevel) {
return app.config.logger['is' + logLevel + 'Enabled'] === true;
},
debug = function(message, category) {
log(category, "Debug", message);
},
// ...
error = function(message, category) {
log(category, "Error", message);
},
log = function(category, logLevel, message) {
if (isLogLevelEnabled(logLevel)) {
for (var i = 0; i < appenders.length; i++) {
appenders[i].log(category, logLevel, message);
}
}
};
服务输出器再次检查日志级别是否启用(特别是对于服务输出器,因此可以使用不同的输出器记录不同级别的日志)。它还允许通过设置cookie来启用特定用户的日志记录。这在需要调试特定用户的问题时非常有用。
// JavaScript
var log = function(category, logLevel, message) {
if (isLogLevelEnabled(logLevel) || isUserEnabled()) {
var logData = {
'category': category,
'logLevel': logLevel,
'message': message
};
$.post(app.config.serviceAppender.logServiceUrl, logData);
}
},
isLogLevelEnabled = function(logLevel) {
return app.config.serviceAppender['is' + logLevel + 'Enabled'] === true;
},
isUserEnabled = function() {
return typeof(app.config.serviceAppender.allowServiceLoggingByCookie) !== 'undefined' &&
app.config.serviceAppender.allowServiceLoggingByCookie === true &&
$.cookie("enableServiceLogging") === "true";
};
// JavaScript
window.app.config = {};
window.app.config.logger = { isDebugEnabled: false, isInfoEnabled: true, isWarnEnabled: true, isErrorEnabled: true };
window.app.config.serviceAppender = {
allowServiceLoggingByCookie: true, logServiceUrl: '@Url.Content("~/api/log")', isDebugEnabled: false, isInfoEnabled: false, isWarnEnabled: true, isErrorEnabled: true
};
window.app.config.consoleAppender = {
isDebugEnabled: false, isInfoEnabled: true, isWarnEnabled: true, isErrorEnabled: true
};