微服务架构中的日志服务实现

在独立应用程序的世界中,通常的做法是将日志程序直接集成到应用程序中,并为每个应用程序单独配置。但在微服务生态系统中,可能有数十个微服务,每个微服务都需要复杂的配置和安装才能使用标准方法进行日志记录,这会带来许多需要解决的问题。

首先,需要为每个服务单独配置所选的日志框架。每个微服务都需要访问存储日志的数据库。如果想更新日志记录器,需要单独更新每个微服务。另一方面,企业中的微服务越来越倾向于安装在云中,使用一些容器,甚至在不同的操作系统中。

另一个关注点是安全性,需要为每个服务提供对数据库系统的访问权限,如果想将日志记录到数据库中。

日志服务方法

既然微服务很好,为什么不使用相同的概念来创建日志系统呢?使用日志作为服务可以给带来很多优势,首先,日志框架只安装在一个微服务中,其余的只需要使用某种网络协议将信息发送到日志,最小化数据库资源的暴露。

这种架构还带来了以下优势:

  • 首先,服务的更新只需要在一个服务中完成:日志微服务,如果不改变与日志客户端的接口,可以更新日志框架,甚至在只在一个服务中更换其他服务,而不需要触及系统的其余部分。
  • 第二个大胜利是,只需要在这个唯一的服务中配置对数据库的访问,而不是全部。
  • 另一个好处是,可以将数据库隐藏在公司内部网的深处,日志服务需要对公司内部网内的微服务开放,提供一定程度的安全性,但数据库将位于一个完全与使用日志微服务的服务隔离的子网中。
  • 最后,但也是一个很大的价值,因为日志是一个服务,不需要关心客户端运行在什么上面,对来说,它是一个访问服务的人。

实现日志服务

在创建日志服务的一般策略的同时,还可以引入一些设计决策,使服务比传统的服务框架更加灵活。

每个微服务日志在其个别表中

也许会问,日志记录器是如何在数据库中分类不同服务的不同条目的,在这个实现中,决定将每个微服务记录在不同的表中,为了管理这一点,日志请求有一个字段,每个服务都有一个特定的令牌。

令牌用于获取表的名称,将此信息链接在一起的位于应用程序的appsettings.json中,或者如果使用的是.NET的早期版本,则是web.config。如果令牌存在,将选择表,并将信息记录在表中。

错误级别的控制

在方法中,保持服务尽可能简单,使用的实现示例不管理错误级别,然后在客户端.dll中利用它(可以作为NuGet包实现),可以为特定需求创建错误级别的管理,以及何时将信息移动到日志或根据设置级别的拒绝。

这在客户端服务中引入了一些配置级别的内容,但在应用程序的配置中管理一个设置字符串并不是什么大问题。

使用代码

创建了一个日志服务的实现,可以作为开源在Github上下载。在这里解释代码的基本部分。最后,创建的日志是一个简单的服务,能够记录在SQL Server数据库中。将其创建为示例,但代码能够适应生产环境,如果需要的话。

服务的代码基本上有以下结构:

public async Task PostLogEntryAsync([FromBody] LogRequest request) { await bo.PostLogEntryAsync(request); return Ok(); }

要记录的对象如下:

public class LogRequest { public DateTime? CreatedDate { get; set; } public string MachineName { get; set; } public string Level { get; set; } public string Logger { get; set; } public string Message { get; set; } public string Exception { get; set; } }

请求对象中有趣的点有:

  • CreatedTime:是可选的。为什么?可以留给日志记录日志发生的时间,但也可以从服务中设置日期时间。这在想将友好消息与存储在日志中的技术信息关联时特别有用。
  • MachineName:这个字段允许输入发送日志请求的机器的名称。这在微服务中非常有用,当可以有微服务的不同实例时,知道哪台机器发送了信息。
  • Level:这是输入记录信息的级别。典型的值是ERROR FATAL, INFO等。这是一个开放字段。这个想法是,可以使用一个客户端配置错误级别。当用户使用NuGet包时,例如,可以在特定的客户端中设置错误级别,并使其对每个客户端都不同。
  • Logger:这是发送用于识别使用服务的客户端的令牌的字段。这与appSettings.json一起使用,以确定想在哪个表中记录信息。
  • Message和Exception:使用这两个字段输入想要记录的信息。

内部日志

这用于在其适当的表中记录错误,因为错误的令牌、格式错误的请求对象、数据库中缺少表等。内部日志有其自己的设置配置。

内部日志也以一种防止应用程序中错误循环的形式完成。

配置内部日志的参数如下:

{ "InternalLogSettings": { "Table": "ServeLog", "_Comment": "Log Level Values: DEBUG, ERROR", "Level": "DEBUG", "_Comment1": "Time Zone Examples: UTC, Eastern Standard Time", "TimeZone": "UTC" } }

可以在不同的时区中选择记录日志注释。

这里另一个重要的事情是程序如何将令牌与表名匹配。这可以通过appSettings.json文件轻松完成。

{ "Tables": { "TESTTOKEN": "TestLog", "YOURTOKEN": "YourTableLog" } }

第一个条目是用于内部日志的,可以添加更多的条目以记录在不同的表中,就像拥有的客户一样。在示例中,添加了一个额外的条目。

沪ICP备2024098111号-1
上海秋旦网络科技中心:上海市奉贤区金大公路8218号1幢 联系电话:17898875485