.net core 2.x - 日志 - to elasticsearch - (2)
你可能会有疑惑,怎么又来一偏,,,其实我也好奇,因为我已经忘记哪个能跑起来了,,,记忆中,这个好像是没问题的.
1.使用到的资源
关于es(elasticseach)在.net中的访问,可以参考es的官网,有很明确的说明了可以使用elasticsearch.net和nest, 需要详细了解的 点这里 (走你>>>) 进入之后点击introduction既可看到这俩个东西的介绍.所以首先我们先nuget install一下,这里我们使用的是nest.
install-package nest
2.使用及配置参考
2.1 代码及配置参考
为了更方便和更灵活的使用,我们需要稍微处理下,配置参考如下(配置文件中):
{
"Logging": {
"LogLevel": {
"Default": "Warning"
}
},
"ElasticSearch": {
"Uri": "http://localhost:9200/",
"DefaultIndex": "default-",
"UserName": null,
"Password": null
},
"AllowedHosts": "*"
}
这里我们添加了一个 ElasticSearch节点,里面的就是我们的es的配置信息了,然后新建一个对应的 类对象,方便我们直接访问,这里我们起名叫 ESOptions.cs
/// <summary>
/// ES配置 选项
/// </summary>
public class ESOptions
{
public string Uri { get; set; }
public string DefaultIndex { get; set; }
public string UserName { get; set; }
public string Password { get; set; }
}
到这里你可能就知道下面要干嘛了,是的,就是要获取配置参数,如下图:
这里直接将配置参数对象 通过IOptions<>注入到了需要使用的类中,这里是有前提的,需要我们在startup.cs的configureServices方法中先配置,所以配置中加入一行:
services.Configure<ESOptions>(Configuration.GetSection("ElasticSearch"));
这样就可以直接使用IOptions<>注入并获取配置对象啦.完整实现代码如下,这里我们新建一个类:名称为:ESClientProvider.cs
public class ESClientProvider<T> where T : class
{
public ESClientProvider(IOptions<ESOptions> options)
{
var settings = new ConnectionSettings(new Uri(options.Value.Uri))
.DefaultIndex(options.Value.DefaultIndex); if (!String.IsNullOrEmpty(options.Value.UserName) && !String.IsNullOrEmpty(options.Value.Password))
{
settings.BasicAuthentication(options.Value.UserName, options.Value.Password);
} this.Client = new ElasticClient(settings);
this.DefaultIndex = options.Value.DefaultIndex;
EnsureIndexWithMapping(this.DefaultIndex);
} public ElasticClient Client { get; private set; }
public string DefaultIndex { get; set; } public void EnsureIndexWithMapping(string indexName = null, Func<PutMappingDescriptor<T>, PutMappingDescriptor<T>> customMapping = null)
{
if (String.IsNullOrEmpty(indexName)) indexName = this.DefaultIndex; // Map type T to that index
this.Client.ConnectionSettings.DefaultIndices.Add(typeof(T), indexName); // Does the index exists?
var indexExistsResponse = this.Client.IndexExists(new IndexExistsRequest(indexName));
if (!indexExistsResponse.IsValid) throw new InvalidOperationException(indexExistsResponse.DebugInformation); // If exists, return
if (indexExistsResponse.Exists) return; // Otherwise create the index and the type mapping
var createIndexRes = this.Client.CreateIndex(indexName);
if (!createIndexRes.IsValid) throw new InvalidOperationException(createIndexRes.DebugInformation); var res = this.Client.Map<T>(m =>
{
m.AutoMap().Index(indexName);
if (customMapping != null) m = customMapping(m);
return m;
}); if (!res.IsValid) throw new InvalidOperationException(res.DebugInformation);
}
}
这里需要使用到的命名空间就是我们开始说的 using nest;另外我们这里还多了一个方法 EnsureIndexWithMapping 看名字就明白了,可就是确保index存在映射关系,这是什么意思?蒙蔽了吧?脑瓜子嗡嗡的了吧.....淡定,这里的这个index指的是 es对象的index,如果还有不了解es的相关概念的可以看我之前的随笔 (走起>>>),这个mapping也即是创建Index时候创建的mapping映射.其中还有两个参数 Client,这个对象,是提供给使用这个类的对象,直接通过 Client 这个属性直接访问 Nest中的相关方法,比如:Client.IndexDocumentAsync,Client.SearchAsync 等等.;另一个属性 DefaultIndex就是提供的默认的索引的名称.这样我们的基础工作基本完成了,这时候看我们的目录,其实就两个文件(我单独放置在一个standard)中:
这时候我们只需要在startup.cs中配置一下就好啦,将我们的这个ESClient{rovider.cs的类注入到容器中:
2.2 使用参考
首先在我们的控制器中注入对象:
public ArdLoggerController(ESClientProvider<LogViewModel> eSClientProvider)
{
_esClientProvider = eSClientProvider;
} private ESClientProvider<LogViewModel> _esClientProvider;
使用参考:
public async Task<IActionResult> Create([FromBody] LogViewModel model)
{
var res = await _esClientProvider.Client.IndexDocumentAsync<LogViewModel>(model);
if (!res.IsValid)
{
throw new InvalidOperationException(res.DebugInformation);
} return Ok();
}
public async Task<IActionResult> Query(string keywords, int? pageIndex = , int? pageSize = )
{
var searchResponse = await _esClientProvider.Client.SearchAsync<LogViewModel>(
s => s
.From(pageIndex)
.Size(pageSize)
.Query(q => q
.Match(m => m
.Field(f => f
.AreaKeyWords
)
.Analyzer(keywords)
)
)
);
var logInfo = searchResponse.Documents;
return Ok(logInfo);
}
下班.
.net core 2.x - 日志 - to elasticsearch - (2)的更多相关文章
- ASP.NET Core 中的日志记录
目录 内置日志的使用 使用Nlog 集成ELK 参考 内置日志的使用 Logger 是 asp .net core 的内置 service,所以我们就不需要在ConfigureService里面注册了 ...
- asp.net core 集成 log4net 日志框架
asp.net core 集成 log4net 日志框架 Intro 在 asp.net core 中有些日志我们可能想输出到数据库或文件或elasticsearch等,如果不自己去实现一个 Logg ...
- log4net将日志写入ElasticSearch
log4net将日志写入ElasticSearch https://www.cnblogs.com/huangxincheng/p/9120028.html 很多小步快跑的公司,开发人员多则3-4个, ...
- .NET Core 中的日志与分布式链路追踪
目录 .NET Core 中的日志与分布式链路追踪 .NET Core 中的日志 控制台输出 非侵入式日志 Microsoft.Extensions.Logging ILoggerFactory IL ...
- .NET Core下的日志(1):记录日志信息
记录各种级别的日志是所有应用不可或缺的功能.关于日志记录的实现,我们有太多第三方框架可供选择,比如Log4Net.NLog.Loggr和Serilog 等,当然我们还可以选择微软原生的诊断机制(相关A ...
- ASP.NET Core 异常处理与日志记录
1. ASP.NET Core 异常处理与日志记录 1.1. 异常处理 1.1.1. 异常产生的原因及处理 1.1.2. ASP.NET Core中启动开发人员异常页面 1.2. 日志记录 1.2.1 ...
- 玩转ASP.NET Core中的日志组件
简介 日志组件,作为程序员使用频率最高的组件,给程序员开发调试程序提供了必要的信息.ASP.NET Core中内置了一个通用日志接口ILogger,并实现了多种内置的日志提供器,例如 Console ...
- asp.net core 系列 13 日志
一.概述 ASP.NET Core 支持适用于各种内置和第三方日志记录, 供程序的日志记录 API,本文介绍了如何将日志记录 API 与内置提供程序一起使用.对于第三方日志记录提供程序使用,文章最后有 ...
- (14)ASP.NET Core 中的日志记录
1.前言 ASP.NET Core支持适用于各种内置和第三方日志记录提供应用程序的日志记录API.本文介绍了如何将日志记录API与内置提供应用程序一起使用. 2.添加日志提供程序 日志记录提供应用程序 ...
随机推荐
- red()、redinle()、redlines()三者之间的关系
# 关于read()方法: # 1.读取整个文件,将文件内容放到一个字符串变量中 # 2.如果文件大于可用内存,不可能使用这种处理 file_object = open("a.txt&quo ...
- JS快速排序 希尔排序 归并排序 选择排序
/* 快速排序 1.1 算法描述 快速排序由于排序效率在同为O(N*logN)的几种排序方法中效率较高,因此经常被采用,再加上快速排序思想----分治法也确实实用.快速排序是一种既不浪费空间又可以快一 ...
- kubernetes-kubeadm自动生成的证书过期的解决方法
拉取kubernetes的源码: git clone https://github.com/kubernetes/kubernetes.git 切换版本: cd kubernetes &&am ...
- Magento2 常见错误 ----- 定期更新
1.静态文件有版本号,静态文件不能读取,页面无法显示.如下图: 解决方案:其实URL里的版本号对于magento来说是合法的,这是因为我们缺少了一个文件\pub\static\.htaccess:导致 ...
- MySQL安装-二进制软件包安装
MySQL 双版本安装 安装mysql AB (RPM) -mysql官方的RPM包 安装MySQL 5.6.19版本 安装之前需要将系统自带的关于mysql软件全部卸载掉 rpm -e (加 ...
- B-树(B树)详解
具体讲解之前,有一点,再次强调下:B-树,即为B树.因为B树的原英文名称为B-tree,而国内很多人喜欢把B-tree译作B-树,其实,这是个非常不好的直译,很容易让人产生误解.如人们可能会以为B-树 ...
- Hibernate报错,关于配置的SessionFactory找不到问题
最近写项目使用hibernate默认的dtd,在启动项目时经常会出现这个问题,hibernate报错,配置factory的id找不到,找不到mapping配置文件, 不能读取配置的xml文件 Coul ...
- nginx的信号量
一.官方文档 https://www.nginx.com/resources/wiki/start/topics/tutorials/commandline/ 二.nginx进程说明 一般在nginx ...
- keras系列︱Sequential与Model模型、keras基本结构功能(一)
引自:http://blog.csdn.net/sinat_26917383/article/details/72857454 中文文档:http://keras-cn.readthedocs.io/ ...
- 小程序 TabBar 定制
使用微信小程序开发时,用到了其 API - tabBar,设置如下(详细的内容可以参考官网 api): "tabBar": { "color": "# ...