.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.添加日志提供程序 日志记录提供应用程序 ...
随机推荐
- Microsoft Visual Studio Tools for AI
https://www.visualstudio.com/zh-hans/downloads/ai-tools-vs/ 开发.调试和部署深度学习和 AI 解决方案 Visual Studio Tool ...
- [模板] 平衡树: Splay, 非旋Treap, 替罪羊树
简介 二叉搜索树, 可以维护一个集合/序列, 同时维护节点的 \(size\), 因此可以支持 insert(v), delete(v), kth(p,k), rank(v)等操作. 另外, prev ...
- Magento 2 安装数据表
Magento 2 安装数据表 第1步:安装脚本 首先,我们将为CRUD模型创建数据库表.为此,我们需要插入安装文件 app/code/Mageplaza/HelloWorld/Setup/Insta ...
- python 高阶函数之 map
以例子来理解 用法1:如函数 f(x) = x * x,用python实现如下 >>> def f(x): ... return x * x >>> r = map ...
- badboy安装及使用
badboy下载 下载地址:http://www.badboy.com.au/download/index 直接点击[continue] badboy安装 badboy录制 默认是录制状态 访问sog ...
- FreeNAS:创建 CIFS 共享(权限)
第一部分:新建账户与指定数据集权限 简单起见,本教程主要介绍带基本身份验证的 CIFS 共享,即只有输入正确的用户名和密码才可以访问共享目录.关于创建匿名共享.多用户权限管理以及域控制器相关内容,我们 ...
- Entity Framework入门教程(16)---Enum
EF DbFirst模式中的枚举类型使用 这一节介绍EF DbFirst模式中的Enum(枚举类型),CodeFirst模式中的Enum会在以后的EF CoreFirst系列中介绍.EF5中添加了对E ...
- Sass学习第一天
Sass学习 网站学习地址: Sass中文网:https://www.sass.hk/docs/#t7-3 Airen的博客:https://www.w3cplus.com/preprocessor/ ...
- PyQt5之窗口类型
[TOC] 注:原创不易,转载请务必注明原作者和出处,感谢支持! 一 写在开头 1.1 本文内容 本文的主要内容:PyQt中的窗口部件:QMainWindow,QWidget,QDialog. 上述三 ...
- 第十一节: EF的三种模式(一) 之 DBFirst模式(SQLServer和MySQL两套方案)
一. 简介 EF连接数据库有三种模式,分别是DBFirst.ModelFirst.CodeFirst,分别适用于不同的开发场景. 该章节,将主要介绍EF的DBFirst连接SQLServer数据库和M ...