你可能会有疑惑,怎么又来一偏,,,其实我也好奇,因为我已经忘记哪个能跑起来了,,,记忆中,这个好像是没问题的.

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)的更多相关文章

  1. ASP.NET Core 中的日志记录

    目录 内置日志的使用 使用Nlog 集成ELK 参考 内置日志的使用 Logger 是 asp .net core 的内置 service,所以我们就不需要在ConfigureService里面注册了 ...

  2. asp.net core 集成 log4net 日志框架

    asp.net core 集成 log4net 日志框架 Intro 在 asp.net core 中有些日志我们可能想输出到数据库或文件或elasticsearch等,如果不自己去实现一个 Logg ...

  3. log4net将日志写入ElasticSearch

    log4net将日志写入ElasticSearch https://www.cnblogs.com/huangxincheng/p/9120028.html 很多小步快跑的公司,开发人员多则3-4个, ...

  4. .NET Core 中的日志与分布式链路追踪

    目录 .NET Core 中的日志与分布式链路追踪 .NET Core 中的日志 控制台输出 非侵入式日志 Microsoft.Extensions.Logging ILoggerFactory IL ...

  5. .NET Core下的日志(1):记录日志信息

    记录各种级别的日志是所有应用不可或缺的功能.关于日志记录的实现,我们有太多第三方框架可供选择,比如Log4Net.NLog.Loggr和Serilog 等,当然我们还可以选择微软原生的诊断机制(相关A ...

  6. ASP.NET Core 异常处理与日志记录

    1. ASP.NET Core 异常处理与日志记录 1.1. 异常处理 1.1.1. 异常产生的原因及处理 1.1.2. ASP.NET Core中启动开发人员异常页面 1.2. 日志记录 1.2.1 ...

  7. 玩转ASP.NET Core中的日志组件

    简介 日志组件,作为程序员使用频率最高的组件,给程序员开发调试程序提供了必要的信息.ASP.NET Core中内置了一个通用日志接口ILogger,并实现了多种内置的日志提供器,例如 Console ...

  8. asp.net core 系列 13 日志

    一.概述 ASP.NET Core 支持适用于各种内置和第三方日志记录, 供程序的日志记录 API,本文介绍了如何将日志记录 API 与内置提供程序一起使用.对于第三方日志记录提供程序使用,文章最后有 ...

  9. (14)ASP.NET Core 中的日志记录

    1.前言 ASP.NET Core支持适用于各种内置和第三方日志记录提供应用程序的日志记录API.本文介绍了如何将日志记录API与内置提供应用程序一起使用. 2.添加日志提供程序 日志记录提供应用程序 ...

随机推荐

  1. Lodop、c-lodop注册与角色简短问答

    注册与角色:参考http://www.c-lodop.com/demolist/t1.html参考链接里的三种场景,是哪种角色.客户端访问网站后用自己的打印机打印.是客户端本地打印角色.IP和域名注册 ...

  2. Centos7 配置和链接FTP

    1:安装vsftpd组建:  yum -y install vsftpd  安装完成以后在目录/etc/vsftpd/vsftpd.conf文件是vsftp的配置文件 2:添加一个专门用来登陆vsft ...

  3. ListView与RecyclerView对比浅析——缓存机制

    https://www.jianshu.com/p/193fb966e954 一,背景 RecyclerView是谷歌官方出的一个用于大量数据展示的新控件,可以用来代替传统的ListView,更加强大 ...

  4. iOS开发者知识普及,Swift 挑战 Objective-C,谁会笑到最后?

    前言: 目前全球共有超过 7 亿台 iPhone 处于活跃状态,全球约有2000万名 iOS 开发者,这造就了 iOS 作为全球第二大移动设备平台的状态. 虽然安卓系统的全球市场占有率超过 iOS 系 ...

  5. [报错]java.lang.ClassCastException

    Caused by: java.lang.ClassCastException: org.apache.xml.dtm.ref.DTMManagerDefault cannot be cast to ...

  6. ACM-ICPC 2018 沈阳赛区网络预赛 K Supreme Number(规律)

    https://nanti.jisuanke.com/t/31452 题意 给出一个n (2 ≤ N ≤ 10100 ),找到最接近且小于n的一个数,这个数需要满足每位上的数字构成的集合的每个非空子集 ...

  7. HDU 5984(求木棒切割期望 数学)

    题意是给定一长为 L 的木棒,每次任意切去一部分直到剩余部分的长度不超过 D,求切割次数的期望. 若木棒初始长度不超过 D,则期望是 0.000000: 设切割长度为 X 的木棒切割次数的期望是 F( ...

  8. 抓包工具Charles基本用法

    我们在进行B/S架构的Web项目开发时,在前端页面与后台交互的调试的时候,通常使用在JSP中加入“debugger;”断点,然后使用浏览器的F12开发者工具来查看可能出错的地方的数据.或者使用Http ...

  9. [Android] Android RxJava2+Retrofit2+OkHttp3 的使用(一) --基础篇 Retrofit2 的使用

    本文是 Android RxJava2+Retrofit2+OkHttp3 的使用(一) --基础篇 Retrofit2 的使用 本文的目标是用 Retrofit写一个网络请求: 本文以从获取天气预报 ...

  10. JavaScript的数据类型和变量

    1.  数据类型:JS使用弱类型,共4种基本类型,其数据可以是变量,也可以是常量. a)         数值(整数和实数) b)         字符串型(用“”号或‘’括起来的字符或数值) c)  ...