.Net Core with 微服务 - Seq 日志聚合
上一次我们介绍并演示了如果使用 Consul 做为我们微服务的注册中心,来实现服务的注册与发现。那么本次我们讲会演示如何做日志聚合。日志聚合比较常用的有 ELK 等,但是这次我想要介绍的是一款比较小众的日志聚合工具 - Seq 。
日志聚合
日志是我们写程序离不开的一个东西。在我们排查问题的时候日志就是我们的救命稻草。我们的每个服务都在不停的生产日志。但是实施微服务后,如果按照传统的写本地文件的日志方案,显然会面临跟修改配置一样麻烦的境地。不同的日志分散在各个服务器、容器内,这种情况下查日志简直是生不如死。
日志聚合组件为我们解决了这个问题。所有的服务通过接口发送日志到聚合服务,再由聚合服务进行统一存储,并且提供统一的查询、分析的能力。
日志聚合组件业界有 ELK、Exceptionless、Seq 等。
Seq
Seq 是一款使用现代化技术构建的结构化日志存储,查询,分析工具。比起 ELK 这种组合要轻量级许多。只需要一个安装包就具有数据存储,查询,图表分析功能。它对 windows 友好,直接提供了安装包。当然也可以使用 docker 来部署。Seq 对于单个用户是免费的,这对于一些小团队并没有什么问题。Seq 一个比较强大的功能是提供了类似 Sql 语句的数据查询及处理能力,使得用户可以直接写 Select from 来得到自己想要的数据。
seq 的 dashboard 页面。
seq 的查询界面。
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/seq
restart: always
container_name: seq_server
hostname: seq_server
environment:
- ACCEPT_EULA=Y
ports:
- 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 信息,选择具有的权限,还可以自定义一些属性,这些属性会附加到每个日志记录上。比如我们这里为 member_center 这个 apikey 自定义一个 app = member_center 的属性。
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 语句来进行查询。
下面演示几个查询例子:
- like 查询
@Message like '%init%'
查询日志消息里带有 init 关键字的日志
2. = 查询
@Level = 'Error'
查询日志级别为 Error 的日志。
app = 'hotel_base'
查询所有 hotel_base 服务的日志。
3. 聚合函数
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 日志聚合的更多相关文章
- .Net Core with 微服务 - Elastic APM
上一次我们介绍了Seq日志聚合组件.这次要给大家介绍的是Elastic APM ,一款应用程序性能监控组件.APM 监控围绕对应用.服务.容器的健康监控,对接口的调用链.性能进行监控.在我们实施微服务 ...
- .Net Core with 微服务 - Consul 配置中心
上一次我们介绍了Elastic APM组件.这一次我们继续介绍微服务相关组件配置中心的使用方法.本来打算介绍下携程开源的重型配置中心框架 apollo 但是体系实在是太过于庞大,还是让我爱不起来.因为 ...
- .Net Core with 微服务 - Polly 服务降级熔断
在我们实施微服务之后,服务间的调用变的异常频繁.多个服务之间可能是互相依赖的关系.某个服务出现故障或者是服务间的网络出现故障都会造成服务调用的失败,进而影响到某个业务服务处理失败.某一个服务调用失败轻 ...
- .Net Core with 微服务 - 分布式事务 - 2PC、3PC
最近比较忙,好久没更新了.这次我们来聊一聊分布式事务. 在微服务体系下,我们的应用被分割成多个服务,每个服务都配置一个数据库.如果我们的服务划分的不够完美,那么为了完成业务会出现非常多的跨库事务.即使 ...
- .Net Core with 微服务 - 分布式事务 - TCC
上一次我们讲解了分布式事务的 2PC.3PC .那么这次我们来理一下 TCC 事务.本次还是讲解 TCC 的原理跟 .NET 其实没有关系. TCC Try 准备阶段,尝试执行业务 Confirm 完 ...
- .Net Core with 微服务 - 分布式事务 - 可靠消息最终一致性
前面我们讲了分布式事务的2PC.3PC , TCC 的原理.这些事务其实都在尽力的模拟数据库的事务,我们可以简单的认为他们是一个同步行的事务.特别是 2PC,3PC 他们完全利用数据库的事务能力,在一 ...
- .net core 微服务之日志落盘设计
原文:.net core 微服务之日志落盘设计 目录 1.设计目标 2.日志流程 3.串联请求事务 3.1 请求ID 3.2 处理服务器.服务 3.3 处理接口名 3.4 日志的发生时间 3.5 接口 ...
- .Net Core with 微服务 - 架构图
上一次我们简单介绍了什么是微服务(.NET Core with 微服务 - 什么是微服务 ).介绍了微服务的来龙去脉,一些基础性的概念.有大佬在评论区指出说这根本不是微服务.由于本人的能力有限,大概也 ...
- .Net Core with 微服务 - Ocelot 网关
上一次我们通过一张架构图(.Net Core with 微服务 - 架构图)来讲述了微服务的结构,分层等内容.从现在开始我们开始慢慢搭建一个最简单的微服务架构.这次我们先用几个简单的 web api ...
随机推荐
- mysql.data.entityframeworkcore 已弃用
转官网有方案: https://dev.mysql.com/doc/connector-net/en/connector-net-entityframework-core.html General R ...
- MFC Object 与 Windows Object
MFC Object 和 Windows Object的含义 Window Object(Window对象)是Win32下用句柄表示的Windows操作系统对象.MFC Object(MFC对象)是C ...
- 从系统的角度分析影响程序执行性能的因素——SA20225205 黄兴宇
实验总结分析报告:从系统的角度分析影响程序执行性能的因素 1.请您根据本课程所学内容总结梳理出一个精简的Linux系统概念模型,最大程度统摄整顿本课程及相关的知识信息,模型应该是逻辑上可以运转的.自洽 ...
- Spring Security + OAuth2 + JWT 基本使用
Spring Security + OAuth2 + JWT 基本使用 前面学习了 Spring Security 入门,现在搭配 oauth2 + JWT 进行测试. 1.什么是 OAuth2 OA ...
- Dart 2.13 版现已发布
作者 / Kevin Moore & Michael Thomsen Dart 2.13 版现已发布,其中新增了类型别名功能,这是目前用户呼声第二高的语言功能.Dart 2.13 还改进了 D ...
- Linux后台执行命令:&和nohup nohup和&后台运行,进程查看及终止
nohup和&后台运行,进程查看及终止 阅读目录 nohup和&后台运行,进程查看及终止 1.nohup 2.& 3.nohup和&的区别 &:是指在后台运 ...
- CentOS 7 vs. CentOS 8 版本差异大比拼
CentOS 7 vs. CentOS 8 版本差異大比拼 2020-02-14 CentOS 最近剛好在撰寫課鋼,必須要以最新的 CentOS 8 版本為主,剛好來做一下 CentOS 7 和 Ce ...
- Vim删除空行
Vim删除空行 1 Vim删除空行 打开vim输入:g/^$/d :g将在与正则表达式匹配的行上执行命令. 正则表达式是'空行',命令是:d (删除)
- 单臂路由实现不同vlan间通信
单臂路由实现不同vlan间通信 拓扑图 PC配置 PC1 :192.168.1.1 vlan10 192.168.1.254 PC2 :192.168.2.1 vlan20 192.168.2.254 ...
- gitbook安装使用教程
以下是gitbook的简略安装使用过程,可以参考一下.后续有时间我再回头修改完善实验目的:安装gitbook后,将相关的文件发布到gitlab上安装node.js在cmd下执行安装npm instal ...