JavaScript 日志系统设计与实现

时至今日,当在Google上搜索时,那些当年查看的日志库(如log4js和log4javascript)仍然是搜索结果的前几名,这可能意味着自定义解决方案的需求仍然存在。然而,如果这些库中的任何一个能满足需求,可能不应该自己从头开始构建...

基本上有两个要求:

  • 支持多个输出器(控制台和Web服务)
  • 细粒度的配置选项

实现了一个日志“模块”(没有花哨的模块,只是简单的揭示模块模式),一个控制台输出器模块和一个服务输出器模块。

日志系统提供了常见的日志方法,检查相应的级别是否启用,然后将调用转发给注册的输出器:

// 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 };
沪ICP备2024098111号-1
上海秋旦网络科技中心:上海市奉贤区金大公路8218号1幢 联系电话:17898875485