惯性聚合 高效追踪和阅读你感兴趣的博客、新闻、科技资讯
阅读原文 在惯性聚合中打开

推荐订阅源

Martin Fowler
Martin Fowler
CTFtime.org: upcoming CTF events
CTFtime.org: upcoming CTF events
A
About on SuperTechFans
Apple Machine Learning Research
Apple Machine Learning Research
The Register - Security
The Register - Security
Vercel News
Vercel News
H
Hackread – Cybersecurity News, Data Breaches, AI and More
人人都是产品经理
人人都是产品经理
MyScale Blog
MyScale Blog
云风的 BLOG
云风的 BLOG
博客园_首页
U
Unit 42
T
Tailwind CSS Blog
G
GRAHAM CLULEY
F
Full Disclosure
V
Vulnerabilities – Threatpost
T
Tenable Blog
月光博客
月光博客
P
Privacy & Cybersecurity Law Blog
P
Privacy International News Feed
K
Kaspersky official blog
Scott Helme
Scott Helme
cs.AI updates on arXiv.org
cs.AI updates on arXiv.org
N
News and Events Feed by Topic
T
The Exploit Database - CXSecurity.com
N
News and Events Feed by Topic
有赞技术团队
有赞技术团队
Recent Commits to openclaw:main
Recent Commits to openclaw:main
L
LINUX DO - 最新话题
Recorded Future
Recorded Future
Application and Cybersecurity Blog
Application and Cybersecurity Blog
Help Net Security
Help Net Security
The GitHub Blog
The GitHub Blog
Cisco Talos Blog
Cisco Talos Blog
SecWiki News
SecWiki News
P
Proofpoint News Feed
Security Latest
Security Latest
cs.CL updates on arXiv.org
cs.CL updates on arXiv.org
罗磊的独立博客
S
Security Affairs
M
MIT News - Artificial intelligence
L
LINUX DO - 热门话题
美团技术团队
Simon Willison's Weblog
Simon Willison's Weblog
T
Threat Research - Cisco Blogs
Stack Overflow Blog
Stack Overflow Blog
Forbes - Security
Forbes - Security
Hugging Face - Blog
Hugging Face - Blog
博客园 - Franky
V
Visual Studio Blog

元视角

.NET 生态下的 Agent 框架选型:从 ReAct 到原生推理 - 元视角 从「能用」到「好用」:LLM 流式响应实现方式的探索之路 - 元视角 当我用 2000 条聊天记录,让 AI 为我画一幅自画像 - 元视角 基于 Supabase 的 AI 应用开发探索 - 元视角 微博 × MCP:社交媒体新玩法解锁 - 元视角 四点钟海棠花未眠 - 元视角 Semantic Kernel × MCP:智能体的上下文增强探索 - 元视角 基于 K-Means 聚类分析实现人脸照片的快速分类 - 元视角 容器技术驱动下的代码沙箱实践与思考 - 元视角 温故而知新:后端通用查询方案的再思考 - 元视角 浅议 CancellationToken 在前后端协同取消场景中的应用 - 元视角 Semantic Kernel 视角下的 Text2SQL 实践与思考 - 元视角 关于 ChatGPT 的流式传输,你需要知道的一切 - 元视角 RAG 的是与非、Rewrite 和 Rerank - 元视角 使用 EFCore 和 PostgreSQL 实现向量存储及检索 - 元视角 基于 LLaMA 和 LangChain 实践本地 AI 知识库 - 元视角 使用 llama.cpp 在本地部署 AI 大模型的一次尝试 - 元视角 如何为 Git 配置多个 SSH Key - 元视角 C# 使用 LibUsbDotNet 实现 USB 设备检测 - 元视角 基于 C# 实现样式与数据分离的打印方案 - 元视角 基于 SVG 的图形交互方案实践 - 元视角 前端视频播放技术概览 - 元视角 温故而知新,再话 Python 动态导入 - 元视角 后 GPT 时代,NLP 不存在了? - 元视角 视频是不能 P 的系列:使用 Milvus 实现海量人脸快速检索 - 元视角 GDI+下字体大小自适应方案初探 - 元视角 小爱音箱集成 ChatGPT 的不完全教程 - 元视角 程序员视角下的三体世界随想 - 元视角 关于 Docker 容器配置信息的渐进式思考 - 元视角 在 Docker 容器内集成 Crontab 定时任务 - 元视角 为你的服务器集成 LDAP 认证 - 元视角 似花还似非花 - 元视角 视频是不能 P 的系列:使用 Dlib 实现人脸识别 - 元视角 浅议分布式链路追踪与日志的整合 - 元视角 关于 Git 大文件上传这件小事 - 元视角 .NET 进程内队列 Channel 的入门与应用 - 元视角 使用 Fody 实现 .NET 的静态编织 - 元视角 .NET Core + ELK 搭建可视化日志分析平台(下) - 元视角 聊一聊前端图片懒加载背后的故事 - 元视角 支持外部链接跳转的 Vue Router 扩展实现 - 元视角 视频是不能 P 的系列:OpenCV 和 Dlib 实现表情包 - 元视角 不得不说的 ASP.NET Core 集成测试 - 元视角 再议 DDD 视角下的 EFCore 与 领域事件 - 元视角 Vue.js 前端项目容器化部署实践极简教程 - 元视角 再见,人间四月天 - 元视角 Python 图像风格化迁移助力画家梦想 - 元视角 利用 ASP.NET Core 中的标头传播实现分布式链路追踪 - 元视角 利用 gRPC 实现文件的上传与下载 - 元视角 七种武器:延迟队列的原理和实现总结 - 元视角 gRPC 流式传输极简入门指南 - 元视角 Envoy 集成 Jaeger 实现分布式链路追踪 - 元视角 浅议非典型 Web 应用场景下的身份认证 - 元视角 gRPC 借助 Any 类型实现接口的泛化调用 - 元视角 分布式丛林探险系列之 Redis 集群模式 - 元视角 分布式丛林探险系列之 Redis 主从复制模式 - 元视角 通过 Python 预测 2021 年双十一交易额 - 元视角 gRPC 搭配 Swagger 实现微服务文档化 - 元视角 SSL/TLS 加密传输与数字证书的前世今生 - 元视角 使用 Python 自动识别防疫健康码 - 元视角 你不可不知的容器编排进阶技巧 - 元视角 ASP.NET Core 搭载 Envoy 实现 gRPC 服务代理 - 元视角 再话 AOP,从简化缓存操作说起 - 元视角 ASP.NET Core 搭载 Envoy 实现微服务身份认证(JWT) - 元视角 ASP.NET Core 搭载 Envoy 实现微服务的监控预警 - 元视角 ASP.NET Core 搭载 Envoy 实现微服务的反向代理 - 元视角 ASP.NET Core gRPC 打通前端世界的尝试 - 元视角 EFCore 实体命名约定库:EFCore.NamingConventions - 元视角 ASP.NET Core gRPC 集成 Polly 实现优雅重试 - 元视角 ASP.NET Core gRPC 健康检查的探索与实现 - 元视角 ASP.NET Core gRPC 拦截器的使用技巧分享 - 元视角 SnowNLP 使用自定义语料进行模型训练 - 元视角 使用 HttpMessageHandler 实现 HttpClient 请求管道自定义 - 元视角 ABP vNext 的实体与服务扩展技巧分享 - 元视角 ABP vNext 对接 Ant Design Vue 实现分页查询 - 元视角 源代码探案系列之 .NET Core 跨域中间件 CORS - 元视角 源代码探案系列之 .NET Core 限流中间件 AspNetCoreRateLimit - 元视角 源代码探案系列之 .NET Core 并发限制中间件 ConcurrencyLimiter - 元视角 通过 EmbededFileProvider 实现 Blazor 的静态文件访问 - 元视角 低代码,想说爱你不容易 - 元视角 记一次失败的 ThoughtWorks 面试经历 - 元视角 从 C# 1.0 到 C# 9.0,历代 C# 语言特性一览 - 元视角 通过 Python 分析 2020 年全年微博热搜数据 - 元视角 基于 Python 和 Selenium 实现 CSDN 一键三连自动化 - 元视角 使用多线程为你的 Python 爬虫提速的 N 种姿势,你会几种? - 元视角 实现网页长截图的常见思路总结 - 元视角 温故而知新,由 ADO.NET 与 Dapper 所联想到的 - 元视角 视频是不能 P 的系列:OpenCV 人脸检测 - 元视角 作为技术宅的我,是这样追鬼滅の刃的 - 元视角 使用 Python 抽取《半泽直树》原著小说人物关系 - 元视角 厉害了!打工人用 Python 分析西安市职位信息 - 元视角 使用 dotTrace 对 .NET 应用进行性能分析与优化 - 元视角 一道 HashSet 面试题引发的蝴蝶效应 - 元视角 基于选项模式实现.NET Core 的配置热更新 - 元视角 Dapper.Contrib 在 Oracle 环境下引发 ORA-00928 异常问题的解决 - 元视角 .NET Core 中对象池(Object Pool)的使用 - 元视角 利用 MySQL 的 Binlog 实现数据同步与订阅(下):EventBus 篇 - 元视角 利用 MySQL 的 Binlog 实现数据同步与订阅(中):RabbitMQ 篇 - 元视角 利用 MySQL 的 Binlog 实现数据同步与订阅(上):基础篇 - 元视角 记一次从已损坏的 Git 仓库中找回代码的经历 - 元视角 .NET Core 原生 DI 扩展之属性注入实现 - 元视角
.NET Core + ELK 搭建可视化日志分析平台(上) - 元视角
飞鸿踏雪 · 2020-02-16 · via 元视角

Hi,各位朋友,大家好!欢迎大家关注我的博客,我的博客地址是: https://blog.yuanpei.me。今天是远程办公以来的第一个周末,虽然公司计划在远程两周后恢复正常办公,可面对着每天都有人离开的疫情,深知这一切都不会那么容易。窗外的阳光透过玻璃照射进屋子,这一切都昭示着春天的脚步渐渐近了。可春天来了,有的人却没有再回来。那些在 2019 年结束时许下的美好期待、豪言壮语,在这样一场灾难面前,终究是如此的无力而苍白。可不管怎么样,生活还是要继续,在这些无法出门的日子里,在这样一个印象深刻的春节长假里,除了做好勤洗手多通风戴口罩这些防疫保护措施以外,博主还是希望大家能够抽空学习,通过知识来充实这“枯燥"的生活。所以,从今天开始,我将为大家带来 .NET Core + ELK 搭建可视化日志分析平台 系列文章,希望大家喜欢。

什么是 ELK

当接触到一个新的事物的时候,我们最好是从它的概念开始入手。那么,什么是 ELK 呢?ELK,是 ElastaicsearchLogstashKibana 三款软件的简称。其中,Elastaicsearch 是一个开源的全文搜索引擎。如果你没有听说过它,那至少应该听说过 Lucene 这个开源搜索引擎。事实上,ElastaicsearchLucene 的封装,它提供了 REST API 的操作接口 。而 Logstash 则是一个开源的数据收集引擎,具有实时的管道,它可以动态地将不同的数据源的数据统一起来。最后,Kibana 是一个日志可视化分析的平台,它提供了一系列日志分析的 Web 接口,可以使用它对日志进行高效地搜索、分析和可视化操作。至此,我们可以给 ELK 一个简单的定义:

ELK 是一个集日志收集、搜索、日志聚合和日志分析于一身的完整解决方案。

下面这张图,展示了 ElastaicsearchLogstashKibana 三款软件间的协作关系。可以注意到,Logstash 负责从应用服务器收集日志。我们知道,现在的应用程序都是跨端应用,程序可能运行在 PC、移动端、H5、小程序等等各种各样的终端上,而 Logstash 则可以将这些不同的日志信息通过管道转换为统一的数据接口。这些日志将被存储到 Elasticsearch 中。我们提到 Elastaicsearch 是一个开源的全文搜索引擎,故而它在数据查询上相对传统的数据库有着更好的优势,并且 Elasticsearch 可以根据需要搭建单机或者集群。最终,KibanaElasticsearch 中查询数据并绘制可视化图表,并展示在浏览器中。在最新的 ELK 架构中,新增了FireBeat这个软件,它是它是一个轻量级的日志收集处理工具(Agent),适合于在各个服务器上搜集日志后传输给 Logstash

ELK-01.png ELK-01.png

总而言之,ELK 可以让我们以一种更优雅的方式来收集日志,传统的日志收集通常会把日志写到文件或者数据库中。前者,不利于日志的集中管理和查询;后者,则无法应对海量文本检索的需求。所以,使用 ELK 可以为我们带来下面这些便利:分布式日志数据集中式查询和管理;系统监控,譬如对系统硬件和应用各个组件的监控;故障排查;报表功能;日志查询,问题排查,上线检查; 服务器监控、应用监控、错误报警;性能分析、用户行为分析、时间管理等等

如何安装 ELK

安装 ELK 的方式,首推以 Docker 方式安装。关于 Docker 的安装、使用请大家查阅官方文档:https://docs.docker.com/。这里我假设大家都已经掌握了 Linux 和 Docker 的使用。首先我们拉取 ELK 镜像:

接下来,我们利用此镜像来运行一个容器:

docker run -p 5601:5601 -p 9200:9200 -p 5044:5044 --name elk sebp/elk 

通常情况下,完成这两个步骤以后,我们就完成了 ELK 安装。此时,我们可以在浏览器中输入地址:http//localhost:9200,这是 Elasticsearch 的默认端口。如果浏览器中返回了了类似下面的信息,则表示 ELK 安装成功。这里是博主获得的关于 Elasticseach 的信息:

{
  "name" : "elk",
  "cluster_name" : "elasticsearch",
  "cluster_uuid" : "GGlJrOvtT2uSfoHioLCWww",
  "version" : {
    "number" : "7.5.2",
    "build_flavor" : "default",
    "build_type" : "tar",
    "build_hash" : "8bec50e1e0ad29dad5653712cf3bb580cd1afcdf",
    "build_date" : "2020-01-15T12:11:52.313576Z",
    "build_snapshot" : false,
    "lucene_version" : "8.3.0",
    "minimum_wire_compatibility_version" : "6.8.0",
    "minimum_index_compatibility_version" : "6.0.0-beta1"
  },
  "tagline" : "You Know, for Search"
}

接下来,我们继续在浏览器中输入地址:http://localhost:5601/app/kibana。显然,这是 Kibana 的默认地址,至此 ELK 的 “庐山真面目” 终于揭晓,首次安装完 ELK,Kibana 的界面应该试类似下面这样:

ELK的庐山真面目 ELK的庐山真面目

按照指引,我们可以添加示例数据来感受下ELK全家桶的魅力:

ELK示例 - Global Flight Dashboard ELK示例 - Global Flight Dashboard

这样,我们就完成 ELK 环境的快速搭建。下面,按照惯例,我们将实现一个 “Hello World” 级别的实例,即:通过 ELK 来收集一个 ASP .NET Core 应用的日志信息。为了让这个示例尽可能地简单一点,我们选择了直接向Elasticsearch 写入日志的方式,这里选择的日志库是 Serilog

Hello ELK

本文所用的例子已发布到Github。首先,我们准备一个 ASP.NET Core 的项目,MVC 或者 Web API 都可以。接下来,在项目中引入三个依赖项:SerilogSerilog.Extensions.LoggingSerilog.Sinks.ElasticSearch。对于前两个,如果大家用过 Log4Net 或者 NLog 应该会感到非常熟悉啦,这一点不在赘述。而第三个,从名字就可以看出来这是冲着 Elasticsearch 来的,因为这是这个系列的第一篇文章,所以,我们直接写 Elasticsearch 即可。Logstash 管道相关的内容,是一个非常复杂的东西,我们会在下一篇文章中单独来讲。接下来,主要是Serilog在 ASP.NET Core 中的配置。首先是 Startup 类,在构造函数中初始化 Serilog

public Startup(IConfiguration configuration)
{
  Log.Logger = new LoggerConfiguration()
    .Enrich.FromLogContext()
    .MinimumLevel.Debug()
    .WriteTo.Elasticsearch(
      new ElasticsearchSinkOptions(new Uri("http://localhost:9200"))
      {
      MinimumLogEventLevel = LogEventLevel.Verbose,
      AutoRegisterTemplate = true
    })
    .CreateLogger();
  Configuration = configuration;
}

还记得 http://localhost:9200 这个地址是什么吗?不错,这是 Elasticsearch 的默认地址,所以,这部分代码主要的作用就是告诉 Elasticsearch ,接下来的日志信息都写到 Elasticsearch 中。为了让日志的信息更丰富一点,我们这里设置最小的日志事件级别为 Verbose 。接下来,在 ConfigureServices() 方法中注册 ILogger 实例:

services.AddLogging(loggingBuilder => loggingBuilder.AddSerilog(dispose: true));

接下来,在业务层增加日志:

private readonly ILogger _logger = Log.Logger;
      
[HttpGet]
public double Add(double n1, double n2)
{
  _logger.Information($"Invoke {typeof(CoreCalculatorService).Name}/Add: {n1},{n2}");
  return n1 + n2;
}

至此,ELK 在 ASP.NET Core 中的集成已经全部结束,这意味着我们所有的日志都会写入到 ELK 中。那么,要到那里去找这些日志信息呢?且听博主娓娓道来。我们在 Kibana 中点击左侧导航栏最底下的设置按钮,然后再点击右侧的 Create index pattern 按钮创建一个索引。什么叫做索引呢?在 Elasticsearch 中索引相当于一张"表",而这个“表”中的一条行记录则被称为 Document,如图:

为Kibana创建索引1 为Kibana创建索引1

创建索引的时候,会发现列表中列出了目前Elasticsearch中可用的数据。以博主为例,这里的 logstash-2020.02.15 就是本文中的 ASP.NET Core 应用产生的日志信息。在这里,我们可以通过一个模糊匹配来匹配同种类型的数据。通常这里需要我们选择一个过滤字段,我们选择时间戳即可:

为Kibana创建索引2 为Kibana创建索引2

创建完索引,就可以看到目前收集的日志信息了,在此基础上,我们可以做进一步的检索、过滤,来生成各种各样的“查询”。而每一个“查询”实际上就是一个数据源。我们就可以利用这些数据源来完成可视化,这是利用 ELK 进行可视化分析的一般流程:

在Kibana中查看当前日志信息 在Kibana中查看当前日志信息

下面是博主自己制作的一个简单的可视化看板,果然很长时间没有再用过 Kibana ,我都快忘记了要怎么做一个折线图。这实在是一篇迟到的博客,我早该在 2019 年的时候就完成这个系列的,这要命的拖延症啊,虽然没有新冠病毒恐怖,可终究不是什么好习惯!

一个简单的可视化看板 一个简单的可视化看板

本文小结

这篇博客是这个系列的第一篇,是一篇珊珊来迟的博客,因为博主早在 2019 年就开始着手学习 ELK。考虑最新公司有使用 ELK 的打算,而因疫情又让博主有充足的时间,所以,博主决定把 ELK 相关的内容花点时间梳理出来。ELK 是一个集日志收集、搜索、日志聚合和日志分析于一身的完整解决方案。博主计划在接下来的篇幅中介绍 Logstash 和 FileeBeat 管道配置、Docker 容器内的日志收集、以及自定义日志组件开发这些话题,希望大家继续关注我的博客。以上就是这篇博客的全部内容啦,晚安!