ELK集成.Net8部署在Docker中

ELK介绍

ELK,是Elastaicsearch、Logstash、Kibana三个软件的简称。

  • Elastaicsearch是一个开源的全文搜索引擎,基于Lucene的封装,它提供了RESTFUL Web接口,用户可以通过HTTP协议访问其提供的各种API。通过这个端口,用户可以执行索引、搜索、更新和删除操作,管理集群和节点信息等‌。
  • Logstach是一个开源的数据收集引擎,具有实时的管道,它可以动态地将不同的数据源的数据统一起来。
  • Kibana是一个日志可视化分析的平台,它提供了一系列日志分析的Web接口,可以使用它对日志进行高效地搜索、分析、数据汇总、生成各种图表和报表。

ELK的作用

  1. 分布式日志数据集中式查询和管理
  2. 系统监控,譬如对系统硬件和应用各个组件的监控。
  3. 故障排查。
  4. 报表功能。
  5. 日志查询,问题排查、上线检查。
  6. 服务器监控、应用监控、错误报警。
  7. 性能分析、用户行为分析、时间管理等等。

下面将演示如何让.Net8与ELK集成并在Docker中部署。

创建.Net8项目

  1. 创建WebApi项目。

  2. 安装三个Nuget包,分别是Serilog(4.2.0)、Serilog.Extensions.Logging(9.0.0)、Serilog.Sinks.ElasticSearch(9.0.3)`。

  3. 打开appsettings.json配置文件,配置elk url地址。

"ELK": {
  "ElasticSearchUrl": "http://192.168.12.138:9200"
}
  1. 打开program.cs文件,添加如下配置
var app = builder.Build();

string elkUrl = app.Configuration["ELK:ElasticSearchUrl"];

Log.Logger = new LoggerConfiguration()
    .Enrich.FromLogContext()
    .MinimumLevel.Debug()
    .WriteTo.Elasticsearch(
    new ElasticsearchSinkOptions(new Uri(elkUrl))
    {
        MinimumLogEventLevel = LogEventLevel.Verbose,
        AutoRegisterTemplate = true
        })
    .CreateLogger();
  1. 注册ILogger实例。
builder.Services.AddLogging(logginingBuilder=>logginingBuilder.AddSerilog(dispose:true));
  1. 添加日志,打开WeatherForecastController控制器文件,在Get方法中添加以下代码。
 _logger.LogInformation("调用WeatherForecastController控制器中的Get方法");

Docker中安装ELK

  1. 拉取ELK镜像

注意:若因网络问题下载失败,则需要配置镜像加速器。

docker pull sebp/elk

Docker运行ELK容器

基于ELK镜像创建并运行容器。

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

报错:提示“ Native controller process has stopped - no new native processes can be started”

此时容器虽然创建了,但是运行失败,虽然通过docker start <container_id>命令可以重启容器,但是访问9200端口依旧会失败。

错误原因:ES的安全机制问题。

解决办法:

第一步:打开并编辑limits.conf文件。

vim /etc/security/limits.conf

在文件末尾添加如下内容,然后保存并退出。

elasticsearch soft nofile 65536
elasticsearch hard nofile 65536
elasticsearch soft nproc 4096
elasticsearch hard nproc 409

注意:看到网上一种说法是elasticsearch内容要换成非root账户,最后以非root账户运行docker run命令,但最后发现不需要切换到非root账户执行docker run命令也能运行,访问也能正常访问,暂时不清楚原因。

账户名称可以自定义,不一定非要叫elasticsearch。

第二步:打开20-nproc.conf文件,将*改为elasticsearch,然后保存并退出。

vim /etc/security/limits.d/20-nproc.conf

修改前

修改后

第三步:打开sysctl.conf文件

vi /etc/sysctl.conf 

在末尾添加如下内容,然后保存并退出。

vm.max_map_count = 655360

第四步:root账户执行以下命令

sysctl -p

第五步:使用docker ps -a命令查看所有1创建的容器,然后使用docker rm 命令删除容器。

docker ps -a
docker rm <container-id>

第六步:重新创建并运行elk容器。若要停止,则手动按ctrl+c。

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

访问ELK

主机浏览器中输入centos 的IP+9200端口号。9200端口号是Es服务器默认的Http端口。

主机浏览器中输入centos 的IP+5601端口号。5601是Kibana的默认端口。

查看Es索引信息

  1. 在kibana界面中点击左侧图标,如图所示,将会显示菜单栏。

  1. 找到“Management”并点击,此时界面会跳转

  1. 在Management选项下,在左侧菜单栏中找到“Data”下的“Index Management”并点击,此时界面右边将会显示ES服务器的索引信息和相关配置信息,如图所示,可以看到目前列表是空的,因为还没有数据,需要调用WebApi接口产生数据。

“Index Management”用来管理集群的索引、数据流和索引模板。

创建Es索引数据

  1. 运行WebApi项目
  2. 刷新kibana界面,可以看到列表已经产生1条索引数据。

注意:若代码中国没有指定IndexFormat值,则Logstash默认会使用logstash-%{+YYYY.MM.dd}的格式来创建Elasticsearch索引,如下图所示。

点击索引名称进入详情界面

若在代码中指定IndexFormat的值,如下图所示

运行项目,此时便会生成指定格式生成的索引数据。

创建数据集Data View

回到界面左侧菜单栏,找到“Kibana”下的“Data Views”选项并点击,然后在界面右侧右上角区域点击按钮“Create data view”

Name用于定义data view的名称,在下面的文本框中输入对应的值。

Index pattern用于定义Es索引的模式,在下面的文本框中输入对应的值,支持使用通配符*号模糊匹配索引名称。

输入完之后点击下面的保存按钮。

查看日志信息

点击“Analytics”下的“Discover”选项。该选项将会导航到日志管理视图界面,主要用来进行搜索和查询。

选择刚刚创建的data view

此时界面将会显示相关日志数据。

在搜索框中输入日志内容,按回车,将会筛选出对应的日志数据。

参考文献

.NET Core + ELK搭建可视化日志分析平台(上)

posted @ 2025-01-03 00:03  相遇就是有缘  阅读(99)  评论(0)    收藏  举报