ELK介绍
ELK,是Elastaicsearch、Logstash、Kibana三个软件的简称。
Elastaicsearch是一个开源的全文搜索引擎,基于Lucene的封装,它提供了REST API 的操作接口;
Logstach是一个开源的数据收集引擎,具有实时的管道,它可以动态地将不同的数据源的数据统一起来。
Kibana是一个日志可视化分析的平台,它提供了一系列日志分析的Web接口,可以使用它对日志进行高效地搜索、分析和可视化操作。
ELK的作用
- 分布式日志数据集中式查询和管理
- 系统监控,譬如对系统硬件和应用各个组件的监控。
- 故障排查。
- 报表功能。
- 日志查询,问题排查、上线检查。
- 服务器监控、应用监控、错误报警。
- 性能分析、用户行为分析、时间管理等等。
下面将演示如何让.Net8与ELK集成并在Docker中部署。
创建.Net8项目
- 创建WebApi项目。
- 安装三个Nuget包,分别是
<font style="color:rgb(199, 37, 78);background-color:rgb(249, 242, 244);">Serilog(4.2.0)</font>
、<font style="color:rgb(199, 37, 78);background-color:rgb(249, 242, 244);">Serilog.Extensions.Logging(9.0.0)</font>
和<font style="color:rgb(199, 37, 78);background-color:rgb(249, 242, 244);">Serilog.Sinks.ElasticSearch(9.0.3)</font>
。 - 打开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
- 基于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端口号。
主机浏览器中输入centos 的IP+5601端口号
访问日志信息
- 在kibana界面中点击左侧图标,如图所示,将会显示菜单栏。
- 找到“Management”并点击该区域,此时界面会跳转
- 点击左侧区域的“Data”下的“Index Management”,此时界面右边将会显示相关信息,如图所示,可以看到目前列表是空的,因为还没有产生日志数据,需要调用WebApi接口产生数据。
- 运行WebApi项目,调用接口产生日志数据。
- 刷新kibana界面,可以看到列表已经产生1条数据。
点击进入详情界面
创建Data Views
回到界面左侧菜单栏,找到“Kibana”下的“Data Views”选项并点击,然后在界面右侧右上角区域点击按钮“Create data view”
在Name和Index pattern下面的文本框输入值,然后点击下面的保存按钮。
查看日志信息
点击“Analytics”下的“Discover”选项。
选择刚刚创建的data view
此时界面将会显示相关日志数据。
在搜索框中输入日志内容,按回车,将会筛选出对应的日志数据。
参考文献
.NET Core + ELK搭建可视化日志分析平台(上)