客户端日志记录的现代化解决方案

在现代Web开发中,日志记录是监控和诊断应用程序问题的关键工具。服务器端日志记录已经相当成熟,但客户端日志记录仍然是一个挑战。JSNLog项目旨在提供一个与服务器端日志系统集成的客户端日志记录解决方案。本文将概述JSNLog项目的发展,并征求反馈,以了解这是否对有用,以及如何改进。

什么是客户端日志记录

客户端日志记录与服务器端日志记录非常相似,例如使用Log4Net或NLog等包。使用JSNLog这样的客户端日志记录包,可以在JavaScript代码中创建记录器,并在发生有趣的事情时使用它们来写入日志消息。可以设置严重性级别来管理哪些记录器是活动的,使用附加器来存储日志消息等。例如:

JL("clientsidelogger").error("Something interesting happened");

一个主要的区别是客户端日志消息需要通过互联网发送到服务器进行存储,这会增加服务器的负载。引入JSNLog的原因之一是使管理这种负载变得更加容易。

使用客户端日志记录减少生产错误

在客户端拥有可靠的无错误代码与在服务器端拥有同样重要(如果怀疑,请询问经理或客户)。不幸的是,客户端编程在这里提出了一些挑战:

  • JavaScript非常适合快速脚本编写,但对于大规模可维护软件来说并不理想。
  • 浏览器兼容性问题。

无论编程多么谨慎,或者部署前测试多么彻底,都无法保证生产代码中没有错误。随着时间的推移,减少生产错误的可靠方法之一是使用日志记录:

  • 捕获所有异常并记录它们,这样至少知道生产代码何时出现问题:
  • try { // ... } catch (err) { JL().fatalException("something went wrong!", err); }
  • 不要忘记设置全局onerror处理程序,以捕获未捕获的异常:
  • window.onerror = function (errorMsg, url, lineNumber, column, errorObj) { JL("onerrorLogger").fatalException({ "msg": "Exception!", "errorMsg": errorMsg, "url": url, "line number": lineNumber, "column": column }, errorObj); return false; };
  • 在代码中包含对异常情况的检查(为什么):
  • if (shouldBePositive < 0) { throw "shouldBePositive is negative!"; }

为了更容易地解决客户端代码中的异常,请在代码中引入额外的记录器以获取更多信息。通常这些记录器是禁用的 - 只有在需要时才会启用。

function DoSomething(a, b, c) { JL("DoSomething").trace("a=" + a + ", b=" + b + ", c=" + c); // ... }

有了这一切,有很好的机会发现生产错误并解决它们,以免它们导致尴尬的错误报告或愤怒的经理。

传统客户端日志记录包的问题

已经有很多客户端日志记录包。然而,它们往往存在以下问题:

  • 缺乏服务器端集成 - 没有开箱即用的支持在服务器上接收和存储日志消息。没有能力在web.config中配置客户端记录器。没有能力看到哪些客户端和服务器端日志消息与给定请求相关。
  • 管理通过互联网的日志消息流的选项很少 - 通过互联网发送日志消息相对昂贵。然而,传统包提供很少或没有选项,例如批量日志消息或只有一定比例的客户发送日志消息。
  • 缺乏客户端特定选项启用记录器 - 如果一个错误只影响IE7,希望能够只为该浏览器启用记录器。
  • 缺乏性能测量 - 如果AJAX调用获取所需数据的时间太长,想知道。

JSNLog功能

  • 核心功能
    • 记录器、附加器、严重性级别等。
    • 允许记录对象以及字符串。
    • 如果给定条件不成立,则记录错误消息。
    • 直接支持记录异常,包括堆栈跟踪和行号,可能还有内部异常。
    • 允许记录器不仅通过名称或父名称(Log4Net风格)识别,还可以通过与正则表达式匹配。
  • 与服务器端日志记录集成
    • 开箱即用地在服务器端接收日志消息。
    • 使用Common.Logging接口,使用服务器端包(NLog、Log4Net等)在服务器上存储日志消息。
    • 在web.config中配置记录器和附加器。
    • 支持在客户端和服务器端日志消息中存储请求特定的GUID,以识别与特定请求相关的所有消息。
  • 管理通过互联网的消息流
    • 通过批量大小批量日志消息(例如,累积2条消息,然后一次性发送)。
    • 在给定时间间隔内记录不超过X条消息,并丢弃其余消息。
    • 基于正则表达式抑制重复消息。
    • 只为所有请求的一定比例启用客户端日志记录(例如,只为10%的请求)。
    • 抑制瞬态消息。例如,让记录器只在1秒内有多于2条消息时才发送消息。
    • 引入一个附加器,将最后N条消息存储在浏览器内存中而不是发送到服务器。允许设置一个链接到某个记录器,以便如果记录器发送消息,则存储在内存中的消息也将被发送。
  • 客户端特定选项
    • 通过与用户代理字符串匹配正则表达式,仅为特定浏览器类型启用记录器。
    • 仅为特定客户端IP地址启用记录器。
  • 性能测量
沪ICP备2024098111号-1
上海秋旦网络科技中心:上海市奉贤区金大公路8218号1幢 联系电话:17898875485