上一次我们介绍并演示了如果使用 Consul 做为我们微服务的注册中心,来实现服务的注册与发现。那么本次我们讲会演示如何做日志聚合。日志聚合比较常用的有 ELK 等,但是这次我想要介绍的是一款比较小众的日志聚合工具 - Seq 。

日志聚合

日志是我们写程序离不开的一个东西。在我们排查问题的时候日志就是我们的救命稻草。我们的每个服务都在不停的生产日志。但是实施微服务后,如果按照传统的写本地文件的日志方案,显然会面临跟修改配置一样麻烦的境地。不同的日志分散在各个服务器、容器内,这种情况下查日志简直是生不如死。
日志聚合组件为我们解决了这个问题。所有的服务通过接口发送日志到聚合服务,再由聚合服务进行统一存储,并且提供统一的查询、分析的能力。
日志聚合组件业界有 ELK、Exceptionless、Seq 等。

Seq

Seq 是一款使用现代化技术构建的结构化日志存储,查询,分析工具。比起 ELK 这种组合要轻量级许多。只需要一个安装包就具有数据存储,查询,图表分析功能。它对 windows 友好,直接提供了安装包。当然也可以使用 docker 来部署。Seq 对于单个用户是免费的,这对于一些小团队并没有什么问题。Seq 一个比较强大的功能是提供了类似 Sql 语句的数据查询及处理能力,使得用户可以直接写 Select from 来得到自己想要的数据。

seq 的 dashboard 页面。

seq 的查询界面

使用 docker 安装

docker run --name seq -e ACCEPT_EULA=Y -p 8900:80 -p 5341:5341 datalust/seq

使用 docker run 运行一个实例。8900 绑定容器的 80 端口,该端口是 web 管理界面的入口。5341 绑定容器的 5341 端口,该端口是日志写入时候真正的端口。

使用 docker-compose 安装

  seq_server:image: datalust/seqrestart: alwayscontainer_name: seq_serverhostname: seq_serverenvironment:- ACCEPT_EULA=Yports:- 8900:80- 5341:5341

把上面的 docker 命令改写成 docker-compose 命令。
安装好 seq 之后,我们访问一下 http://localhost:8090 如果管理后台出现说明我们安装成功了。

NLog 集成 Seq

seq 安装成功之后,我们可以开始跟 asp.net core 项目进行集成了。这里采用 Nlog 日志组件进行演示,如何跟 seq 集成。

点击 “API KEYS” 、“ADD API KEY” 弹出新增 API KEY 界面。

我们可以在这个界面为每个服务指定一个 APIKEY 当写入 Seq 的是用来区分服务。填写 title 信息,选择具有的权限,还可以自定义一些属性,这些属性会附加到每个日志记录上。比如我们这里为 membercenter 这个 apikey 自定义一个 app = membercenter 的属性。

Install-Package NLog.Targets.Seq

nuget 安装 Nlog 的 Seq 扩展。

<?xml version="1.0" encoding="utf-8" ?>
<nlog xmlns="http://www.nlog-project.org/schemas/NLog.xsd"xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"autoReload="true"internalLogLevel="info"internalLogFile="logs/internal-nlog.txt"><extensions><add assembly="NLog.Targets.Seq"/></extensions><!-- the targets to write to --><targets><!-- write to the void aka just remove --><target xsi:type="Null" name="blackhole" /><target name="seq" xsi:type="BufferingWrapper" bufferSize="1000" flushTimeout="2000"  ><target xsi:type="Seq" serverUrl="http://192.168.18.164:5341" apiKey="vuRYxr8bMXuvKNbwVNUp"><property name="ThreadId" value="${threadid}" as="number" /><property name="stacktrace" value="${onexception:inner=${stacktrace}}"/></target></target></targets><!-- rules to map from logger name to target --><rules><!--Skip Microsoft logs and so log only own logs--><logger name="Microsoft.*" minlevel="Trace" writeTo="blackhole" final="true" /><logger name="*" minlevel="Trace" writeTo="seq" /></rules>
</nlog>

在项目根目录添加一个 nlog.config 的 xml 配置文件。添加一个 seq 的 target ,在这个 target 上填写 serverUrl(seq的服务地址),apiKey。

        public static IHostBuilder CreateHostBuilder(string[] args) =>Host.CreateDefaultBuilder(args).ConfigureWebHostDefaults(webBuilder =>{webBuilder.ConfigureKestrel(options =>{options.ListenAnyIP(6003);});webBuilder.UseStartup<Startup>();}).UseNLog();

在 Program 文件的 CreateHostBuilder 方法最后追加 UseNLog 调用。

    [ApiController][Route("[controller]")]public class TestController : ControllerBase{private readonly ILogger _logger;public TestController(ILoggerFactory loggerFactory){_logger = loggerFactory.CreateLogger<TestController>();}[HttpGet("TestLogSeq")]public string TestLogSeq(){_logger.LogTrace("this is a test log for trace level .");_logger.LogDebug("this is a test log for debug level .");_logger.LogInformation("this is a test log for info level .");_logger.LogWarning("this is a test log for warning level .");_logger.LogError(new Exception("this is a ex for seq log ."), "this is a test log for error level .");return "ok";}}

添加一个 TestController 编写一个 TestLogSeq 方法,在这里打一些日志。

我们访问一下这个接口,打开 seq 的站点可以看到我们的日志已经写到 seq 里面了。

查询

我们的服务每天都会产生数以万计的日志,现在把所有服务的日志都聚合在一起,那数量就更加庞大。在海量日志中查找需要的日志,显然变得很困难。
还好 Seq 带有强大的查询功能。我们可以像在数据库里查询那样,使用 Sql 语句来进行查询。
下面演示几个查询例子:

  1. like 查询

@Message like '%init%'

查询日志消息里带有 init 关键字的日志

  1. = 查询

@Level = 'Error'

查询日志级别为 Error 的日志。

app = 'hotel_base'

查询所有 hotel_base 服务的日志。

  1. 聚合函数

select count(1) from stream group by @Level

按日志级别分组,统计每个级别的数量。

以上简单的演示了几个查询方案,Seq 的查询相当的强大,具体请查考官方文档:the-seq-query-language

总结

通过以上内容,我们简单的演示了 Seq 日志聚合工具的安装、与.net core 进行集成,查询日志等功能。Seq 虽然比起 ELK 比较冷门,但是最近跟一些朋友交流下来,发现很多朋友都开始使用 Seq 来做为日志聚合工具了。这也说明 Seq 确实有一定的实力,大家不妨一试。

项目地址

https://github.com/kklldog/myhotel_microservice

相关文章

NET Core with 微服务 - 什么是微服务
.Net Core with 微服务 - 架构图
.Net Core with 微服务 - Ocelot 网关
.Net Core with 微服务 - Consul 注册中心

关注我的公众号一起玩转技术

.Net Core with 微服务 - Seq 日志聚合相关推荐

  1. .Net Core with 微服务 - 可靠消息最终一致性分布式事务

    前面我们讲了分布式事务的2PC.3PCTCC 的原理.这些事务其实都在尽力的模拟数据库的事务,我们可以简单的认为他们是一个同步行的事务.特别是 2PC,3PC 他们完全利用数据库的事务能力,在一阶段开 ...

  2. .Net Core with 微服务 - 分布式事务 - 2PC、3PC

    最近比较忙,好久没更新了.这次我们来聊一聊分布式事务. 在微服务体系下,我们的应用被分割成多个服务,每个服务都配置一个数据库.如果我们的服务划分的不够完美,那么为了完成业务会出现非常多的跨库事务.即使 ...

  3. .Net Core with 微服务 - Polly 服务降级熔断

    在我们实施微服务之后,服务间的调用变的异常频繁.多个服务之间可能是互相依赖的关系.某个服务出现故障或者是服务间的网络出现故障都会造成服务调用的失败,进而影响到某个业务服务处理失败.某一个服务调用失败轻 ...

  4. .NET Core with 微服务 - Consul 配置中心

    上一次我们介绍了Elastic APM组件.这一次我们继续介绍微服务相关组件配置中心的使用方法.本来打算介绍下携程开源的重型配置中心框架 apollo 但是体系实在是太过于庞大,还是让我爱不起来.因为 ...

  5. .NET Core with 微服务 - Elastic APM

    上一次我们介绍了Seq日志聚合组件.这次要给大家介绍的是Elastic APM ,一款应用程序性能监控组件.APM 监控围绕对应用.服务.容器的健康监控,对接口的调用链.性能进行监控.在我们实施微服务 ...

  6. .Net Core with 微服务 - 架构图

    上一次我们简单介绍了什么是微服务(.NET Core with 微服务 - 什么是微服务).介绍了微服务的来龙去脉,一些基础性的概念.有大佬在评论区指出说这根本不是微服务.由于本人的能力有限,大概也只 ...

  7. .Net Core with 微服务 - Ocelot 网关

    上一次我们通过一张架构图(.Net Core with 微服务 - 架构图)来讲述了微服务的结构,分层等内容.从现在开始我们开始慢慢搭建一个最简单的微服务架构.这次我们先用几个简单的 web api ...

  8. .Net Core with 微服务 - 使用 AgileDT 快速实现基于可靠消息的分布式事务

    前面对于分布式事务也讲了好几篇了(可靠消息最终一致性分布式事务 - TCC分布式事务 - 2PC.3PC https://github.com/kklldog/AgileDT 开源不易,大家多多 ✨✨ ...

  9. .Net Core with 微服务 - Consul 注册中心

    上一次我们介绍了 Ocelot 网关的基本用法.这次我们开始介绍服务注册发现组件 Consul 的简单使用方法. 服务注册发现 首先先让我们回顾下服务注册发现的概念. 在实施微服务之后,我们的调用都变 ...

最新文章

  1. kubernetes相关概念
  2. PHP程序员的学习路线
  3. python中两个矩阵之间的点乘_Python基础--数据分析库--Numpy
  4. DNS主从服务器不同步的解决方法
  5. Delphi中使用API将目录删除函数
  6. 信息学奥赛一本通(1164:digit函数)
  7. linux远程复制文件命令小总结
  8. spacy存在内存泄露问题
  9. ICLR 2022 论文列表公布,接收率高达 32%
  10. 2天玩转单反相机(第二讲)
  11. 真正的云主机到底是什么样的?转发
  12. iphone开发每日一练【2011-10-06】
  13. Linux系统删除文件夹命令
  14. mysql崩 数据同步_MySQL5.7 大大降低了半同步复制-数据丢失的风险
  15. 今日恐慌与贪婪指数为10 恐慌程度稍有上升
  16. java中的package_JAVA中的PACKAGE机制——(好文转帖)
  17. hp台式计算机硬盘如何取出,惠普台式机不读硬盘怎么办
  18. IntelliJ IDEA-2017版设置背景颜色
  19. 【MySQL】# mysql计算两个时间的差值
  20. 内存管理--PoolChunkPoolSubPage

热门文章

  1. 隧道6in4 和隧道6to4(GNS3)
  2. linux如何查看所有的用户(user)、用户组(group)、密码(password/passwd)
  3. 【agc004f】Namori Grundy
  4. 写给深圳首期Python自动化开发周未班的信
  5. 编写高质量代码:改善Java的151个建议四(基本类型)21-30
  6. TCP/IP 协议简单分析(建立连接握手过程)
  7. C#委托,事件理解入门 (译稿)
  8. stm32cubeide外部中断_【STM32】HAL库 STM32CubeMX教程三----外部中断(HAL库GPIO讲解)
  9. 谷歌云使用账号密码_如何使用Google密码检查
  10. python 新闻摘要_每日新闻摘要:Microsoft内部禁止应用程序,这样就可以了