ELK集成.Net8部署在Docker中
ELK介绍
ELK,是Elastaicsearch、Logstash、Kibana三个软件的简称。
- Elastaicsearch是一个开源的全文搜索引擎,基于Lucene的封装,它提供了RESTFUL Web接口,用户可以通过HTTP协议访问其提供的各种API。通过这个端口,用户可以执行索引、搜索、更新和删除操作,管理集群和节点信息等。
- Logstach是一个开源的数据收集引擎,具有实时的管道,它可以动态地将不同的数据源的数据统一起来。
- Kibana是一个日志可视化分析的平台,它提供了一系列日志分析的Web接口,可以使用它对日志进行高效地搜索、分析、数据汇总、生成各种图表和报表。
ELK的作用
- 分布式日志数据集中式查询和管理
- 系统监控,譬如对系统硬件和应用各个组件的监控。
- 故障排查。
- 报表功能。
- 日志查询,问题排查、上线检查。
- 服务器监控、应用监控、错误报警。
- 性能分析、用户行为分析、时间管理等等。
下面将演示如何让.Net8与ELK集成并在Docker中部署。
创建.Net8项目
-
创建WebApi项目。
-
安装三个Nuget包,分别是Serilog(4.2.0)、Serilog.Extensions.Logging(9.0.0)、Serilog.Sinks.ElasticSearch(9.0.3)`。
-
打开appsettings.json配置文件,配置elk url地址。
"ELK": {
"ElasticSearchUrl": "http://192.168.12.138:9200"
}
- 打开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();
- 注册ILogger实例。
builder.Services.AddLogging(logginingBuilder=>logginingBuilder.AddSerilog(dispose:true));
- 添加日志,打开WeatherForecastController控制器文件,在Get方法中添加以下代码。
_logger.LogInformation("调用WeatherForecastController控制器中的Get方法");
Docker中安装ELK
- 拉取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索引信息
- 在kibana界面中点击左侧图标,如图所示,将会显示菜单栏。

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

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

创建Es索引数据
- 运行WebApi项目
- 刷新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

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

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


浙公网安备 33010602011771号