在独立应用程序的世界中,通常的做法是将日志程序直接集成到应用程序中,并为每个应用程序单独配置。但在微服务生态系统中,可能有数十个微服务,每个微服务都需要复杂的配置和安装才能使用标准方法进行日志记录,这会带来许多需要解决的问题。
首先,需要为每个服务单独配置所选的日志框架。每个微服务都需要访问存储日志的数据库。如果想更新日志记录器,需要单独更新每个微服务。另一方面,企业中的微服务越来越倾向于安装在云中,使用一些容器,甚至在不同的操作系统中。
另一个关注点是安全性,需要为每个服务提供对数据库系统的访问权限,如果想将日志记录到数据库中。
既然微服务很好,为什么不使用相同的概念来创建日志系统呢?使用日志作为服务可以给带来很多优势,首先,日志框架只安装在一个微服务中,其余的只需要使用某种网络协议将信息发送到日志,最小化数据库资源的暴露。
这种架构还带来了以下优势:
在创建日志服务的一般策略的同时,还可以引入一些设计决策,使服务比传统的服务框架更加灵活。
每个微服务日志在其个别表中
也许会问,日志记录器是如何在数据库中分类不同服务的不同条目的,在这个实现中,决定将每个微服务记录在不同的表中,为了管理这一点,日志请求有一个字段,每个服务都有一个特定的令牌。
令牌用于获取表的名称,将此信息链接在一起的位于应用程序的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; }
}
请求对象中有趣的点有:
内部日志
这用于在其适当的表中记录错误,因为错误的令牌、格式错误的请求对象、数据库中缺少表等。内部日志有其自己的设置配置。
内部日志也以一种防止应用程序中错误循环的形式完成。
配置内部日志的参数如下:
{
"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"
}
}
第一个条目是用于内部日志的,可以添加更多的条目以记录在不同的表中,就像拥有的客户一样。在示例中,添加了一个额外的条目。