.Net Core with 微服务 - Seq 日志聚合

上一次我们介绍并演示了如果使用 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 注册中心

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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/301375.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

苹果白屏一直显示苹果_最新消息显示:苹果还要发新品

距离2020年结束已经进入了倒计时阶段&#xff0c;但最新消息显示苹果可能还会在这个最后的时间节点上召开一场新品发布会。今日&#xff0c;有外媒援引一份苹果内部备忘录报道&#xff0c;称苹果通过内部备忘录向服务提供商发送通知&#xff0c;计划在美国太平洋标准时间 12月8…

“探月计划”来袭,美国米德天文望远镜助孩子观月赏月

▲数据汪特别推荐点击上图进入玩酷屋孩子对于未知的世界充满了好奇&#xff0c;尤其是对于月亮&#xff0c;总是有问不完的问题。例如月亮上是怎么样的&#xff1f;怎么很多人说十五的月亮十六圆&#xff1f;月亮有动物吗&#xff1f;不是说有月兔吗&#xff1f;月亮怎么有时是…

为什么async/await方法不能有lock或Monitor

相信有不少朋友知道async/await有lock语法的情况一般都会编译错误&#xff0c;这个时候可以通过Monitor来解决编译错误的问题&#xff1b;虽然这样解决的编译错误但本质问题还是没有解决。其实并不是async/await方法不能用lock或Monitor&#xff0c;而是在lock或Monitor的作用域…

每日一笑 | 程序员和产品经理打架了,怎么办?

全世界只有3.14 % 的人关注了数据与算法之美&#xff08;图片来源于网络&#xff0c;侵权删&#xff09;

新建项目EasyUiAutotest,安装Appium-Python-Client

一、前置说明 Appium-Python-Client 是 Appium 的 Python 客户端库&#xff0c;它提供了一系列的类和方法&#xff0c;用于与 Appium 服务器进行通信&#xff0c;并执行各种移动应用测试操作&#xff0c;包括启动应用、模拟用户输入、点击等操作。 二、操作步骤 1. 启动Pych…

VS Code + ML.NET 玩转交互式机器学习

在上一篇文章中&#xff0c;我们介绍了 .NET Interactive Notbook&#xff0c;可以进行代码实时运行和交互式展示。这对于ML.NET来说非常棒&#xff0c;可以运用到许多场景&#xff0c;比如数据探索、绘制数据图表、编制教学课件等。下面&#xff0c;我们就用出租车费预测&…

ts定义数组类型_ts基本数据类型

typescript基础数据类型布尔值 示例代码最基本的数据类型就是简单的true/false值&#xff0c;在JavaScript和TypeScript里叫做boolean(其它语言中也一样)。let a: boolean trueconsole.log(a)let b: boolean falseconsole.log(b)let c: booleanconsole.log(c)执行结果truefal…

神还原女神照片!GAN为百年旧照上色

全世界只有3.14 % 的人关注了数据与算法之美如何把女神的黑白照片变成彩照&#xff1f;今日&#xff0c;数据汪发现新加坡 GovTech 数据科学与人工智能部门在 Medium 上介绍了一个为百年旧照上色的项目。这个项目名为 Colourise.sg&#xff0c;最初是该团队&#xff08;成员包括…

cacti+nagios 整合遇到的问题

cacti安装成功了&#xff0c;下载一个npc插件来套用nagios&#xff0c;nagios要用ndoutils和cacti连接。主要安装ndoutils出现的问题。启动ndoutils时出错&#xff1a;/usr/local/nagios/bin/ndo2db-3x -c /usr/local/nagios/etc/ndo2db.cfg错误提示&#xff1a;Support for th…

谈谈MySQL面试的45个常见问题

前两天&#xff0c;我跟一个面试官聊天&#xff0c;发现一个普遍想象&#xff0c;不少候选人&#xff0c;对数据库的认知&#xff0c;还处在比较基础的阶段&#xff0c;以为会写“增删改查”、做表关联就足够了&#xff0c;那些工作中经常出现的问题&#xff0c;却支支吾吾答不…

TensorFlow的这些骚操作你都知道吗?

TensorFlow Lite 2019 年发展蓝图分为四个关键部分&#xff1a;易用性、性能、优化和可移植性。自 2015 年 11 月 9 号发布之后&#xff0c;TensorFlow 逐渐成为人工智能领域最广泛运用的深度学习框架。那么TensorFlow框架到底是什么&#xff1f;TensorFlow 是一个大规模机器学…

实现图片打乱_疫情过后,是否打乱了你前进的脚步?面对现状,你将如何开展新的征程?...

2020年的这个春节&#xff0c;一场疫情打乱了所有的计划。就在整个城市都躲起来的时候&#xff0c;有一群人却站了出来。他们背对着我们&#xff0c;却直面着生死&#xff0c;他们每一刻都在与时间赛跑&#xff0c;与死神抢人。他们是值得我们尊敬的人&#xff0c;是最敬爱的人…

SystemCenter2012SP1实践(23)私有云的权限设计

SCVMM和SCAC作为微软私有云的两个重要入口&#xff0c;由于私有云的资源是多部门公用的&#xff0c;为了防止权限扩大导致资源浪费和误操作的可能性&#xff0c;我们在企业中部署的时候&#xff0c;需要认真的规划好用户和相应级别管理员的权限设置。我是分隔线本文主要介绍身份…

面向.NET开发人员的Dapr——参考应用程序

目录&#xff1a;面向.NET开发人员的Dapr——前言面向.NET开发人员的Dapr——分布式世界面向.NET开发人员的Dapr——俯瞰Dapr面向.NET开发人员的Dapr——入门Dapr reference applicationDapr 参考应用Earlier in the book, youve learned about the foundational benefits of D…

数据集转换_为什么LSTM看起来那么复杂,以及如何避免时序数据的处理差异和混乱...

LSTM&#xff08;long short term memory&#xff0c;长短期记忆网络&#xff09;是预测时间序列最常用的神经网络模型之一。但是这种神经网络模型相当复杂&#xff0c;需要特定的结构、数据前期处理等操作。当在网上搜寻要学习的代码时&#xff0c;很难将另一个程序员的代码合…

一直被模仿,从未被超越的经典订阅号!

不管你昨天有多优秀&#xff0c;代表不了今天的辉煌&#xff0c;昨天的太阳永远晒不干今天的衣裳&#xff0c;以阳光心态迎接每一天。今天小编就给大家推荐几个越来越优秀的微信公众号希望把快乐和成长带给您长按二维码&#xff0c;选择【识别图中二维码】关注日读好书ID&#…

面向.NET开发人员的Dapr——总结和前景

目录&#xff1a;面向.NET开发人员的Dapr——前言面向.NET开发人员的Dapr——分布式世界面向.NET开发人员的Dapr——俯瞰Dapr面向.NET开发人员的Dapr——入门面向.NET开发人员的Dapr——参考应用程序面向.NET开发人员的Dapr——状态管理面向.NET开发人员的Dapr——发布和订阅面…

每日一笑 | 周一,如何才能保持清醒?

全世界只有3.14 % 的人关注了数据与算法之美&#xff08;图片来源于网络&#xff0c;侵权删&#xff09;难怪数据汪每次喝咖啡都没啥用原来是没用对杯子...

查询两个日期间隔天数怎么算_大厂都是怎么用Java8代替SimpleDateFormat?

1 SimpleDateFormat 之坑1.1 格式化1.1.1 案例初始化一个Calendar&#xff0c;设置日期2020年12月29日​日志​这是由于混淆SimpleDateFormat的各种格式化模式&#xff1a;小写y是年大写Y是week year&#xff0c;即所在的周属于哪一年一年第一周的判断方式从getFirstDayOfWeek(…

Vertex Texture Fetch(VTF) Fragment Texture Fetch ( FTF )

在vertex shader里也可以检索纹理。我本来觉得这没什么好奇怪的&#xff0c;因为我一直也觉得这很当然可以啊~当初橙书(OpenGL Shading Language Edtion2)也说过texture2D这类函数不是fragment shader专用的&#xff0c;倒还有texture2DLod这种在vertex shader里专用的&#xf…