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

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. Microsoft Visual Studio Tools for AI

    https://www.visualstudio.com/zh-hans/downloads/ai-tools-vs/ 开发.调试和部署深度学习和 AI 解决方案 Visual Studio Tool ...

  2. [模板] 平衡树: Splay, 非旋Treap, 替罪羊树

    简介 二叉搜索树, 可以维护一个集合/序列, 同时维护节点的 \(size\), 因此可以支持 insert(v), delete(v), kth(p,k), rank(v)等操作. 另外, prev ...

  3. Magento 2 安装数据表

    Magento 2 安装数据表 第1步:安装脚本 首先,我们将为CRUD模型创建数据库表.为此,我们需要插入安装文件 app/code/Mageplaza/HelloWorld/Setup/Insta ...

  4. python 高阶函数之 map

    以例子来理解 用法1:如函数 f(x) = x * x,用python实现如下 >>> def f(x): ... return x * x >>> r = map ...

  5. badboy安装及使用

    badboy下载 下载地址:http://www.badboy.com.au/download/index 直接点击[continue] badboy安装 badboy录制 默认是录制状态 访问sog ...

  6. FreeNAS:创建 CIFS 共享(权限)

    第一部分:新建账户与指定数据集权限 简单起见,本教程主要介绍带基本身份验证的 CIFS 共享,即只有输入正确的用户名和密码才可以访问共享目录.关于创建匿名共享.多用户权限管理以及域控制器相关内容,我们 ...

  7. Entity Framework入门教程(16)---Enum

    EF DbFirst模式中的枚举类型使用 这一节介绍EF DbFirst模式中的Enum(枚举类型),CodeFirst模式中的Enum会在以后的EF CoreFirst系列中介绍.EF5中添加了对E ...

  8. Sass学习第一天

    Sass学习 网站学习地址: Sass中文网:https://www.sass.hk/docs/#t7-3 Airen的博客:https://www.w3cplus.com/preprocessor/ ...

  9. PyQt5之窗口类型

    [TOC] 注:原创不易,转载请务必注明原作者和出处,感谢支持! 一 写在开头 1.1 本文内容 本文的主要内容:PyQt中的窗口部件:QMainWindow,QWidget,QDialog. 上述三 ...

  10. 第十一节: EF的三种模式(一) 之 DBFirst模式(SQLServer和MySQL两套方案)

    一. 简介 EF连接数据库有三种模式,分别是DBFirst.ModelFirst.CodeFirst,分别适用于不同的开发场景. 该章节,将主要介绍EF的DBFirst连接SQLServer数据库和M ...