zoukankan      html  css  js  c++  java
  • 日志系统升级之路(.Net客户端的使用)

    一、客户端

    由于我们的Framework版本基于4.5,所以选取了 NEST 和 Elasticsearch.Net 的版本最高只能选择 6.1.0


    二、ES客户端封装

    代码比较简单,不再赘述

    using System;
    using System.Collections.Generic;
    using System.Linq;
    using System.Text;
    using System.Threading.Tasks;
    using Elasticsearch.Net;
    using Nest;
    using GFK.Common.Extends;
    using GFK.Common.Consts;
    
    namespace GFK.Elasticsearch
    {
        /// <summary>
        /// 
        /// </summary>
        public class ESClient
        {
            /// <summary>
            /// 
            /// </summary>
            public ElasticClient esClient = null;
    
            /// <summary>
            /// 创建ES客户端实例
            /// </summary>
            /// <param name="hostNames">ES服务域名,支持集群</param>
            public ESClient(List<string> hostNames)
            {
                if (!hostNames.HasValue())
                {
                    throw new ArgumentNullException("hostNames 至少需要传入一个ES服务");
                }
    
                var uris = new List<Uri>();
                foreach (var host in hostNames)
                {
                    var uri = new Uri(host);
                    uris.Add(uri);
                }
                var connectionPool = new SniffingConnectionPool(uris);
                var settings = new ConnectionSettings(connectionPool);
                esClient = new ElasticClient(settings);
            }
    
            /// <summary>
            /// 索引文档
            /// </summary>
            /// <typeparam name="T">实体类型</typeparam>
            /// <param name="item">实体</param>
            /// <param name="isSuffix">索引名是否添加日期后缀</param>
            /// <returns></returns>
            public IIndexResponse CreateIndex<T>(T item, bool isSuffix = false) where T : class
            {
                if (esClient == null)
                {
                    throw new Exception("ES 初始化异常,客户端实例为空");
                }
    
                var index = item.GetAttribute<ESIndexNameAttribute>();
                if (index == null || index.IndexName.IsNullOrWhiteSpace())
                {
                    throw new ArgumentException("item 必须使用 ElasticsearchIndexAttribute 指定索引名");
                }
    
                var indexName = index.IndexName;
                if (!indexName.IsNullOrWhiteSpace() && isSuffix)
                {
                    indexName = string.Format("{0}-{1}", indexName, DateTime.Now.ToString(DateTimeTypeConst.DATE));
                }
    
                //索引不存在的时候自动创建
                return esClient.Index(item, p => p.Index(indexName));
            }
    
        }
    }


    三、ES客户端的使用

    日志模型如下:

    using GFK.Common.Consts;
    using Nest;
    using System;
    using System.Collections.Generic;
    using System.Linq;
    using System.Text;
    using System.Threading.Tasks;
    
    namespace G.Demo
    {
        [GFK.Elasticsearch.ESIndexName("log")]
        [ElasticsearchType(Name = "_doc", IdProperty = "id")]
        public class Log
        {
            [Keyword(Name = "id")]
            public string Id { get; set; } = Guid.NewGuid().ToString("N");
    
            /// <summary>
            /// 系统代码
            /// </summary>
            [Keyword(Name = "system_code")]
            public string SystemCode { get; set; }
    
            /// <summary>
            /// 系统模块
            /// </summary>
            [Keyword(Name = "source")]
            public string Source { get; set; }
    
            /// <summary>
            /// 所在机器名
            /// </summary>
            [Text(Name = "machine_name")]
            public string MachineName
            {
                get
                {
                    return System.Environment.MachineName;
                }
            }
    
            /// <summary>
            /// 应用程序域名称
            /// </summary>
            [Text(Name = "appdomain_name")]
            public string AppdomainName
            {
                get
                {
                    return AppDomain.CurrentDomain.SetupInformation.ApplicationBase;
                }
            }
    
            /// <summary>
            /// 文档信息
            /// </summary>
            [Text(Name = "message")]
            public string Message { get; set; }
    
            /// <summary>
            /// 文档创建时间
            /// </summary>
            [Date(Name = "created_time")]
            public DateTime CreatedTime { get; set; } = DateTime.Now;
        }
    }

    使用代码比较简单,不再赘述

    using System;
    using System.Collections.Generic;
    using System.Linq;
    using System.Text;
    using System.Threading.Tasks;
    using GFK.Common;
    using GFK.Elasticsearch;
    using GFK.Common.Extends;
    
    namespace G.Demo
    {
        class Program
        {
            static void Main(string[] args)
            {
                var client = new ESClient(new List<string>() { "http://192.168.17.130:9200" });
    
                for (int i = 0; i < 5; i++)
                {
                    var log = new Log()
                    {
                        Message = "让我测试测试" + i,
                        Source = "Program.Main",
                        SystemCode = "G.Demo"
                    };
                    var rst = client.CreateIndex<Log>(log, true);
                    if (rst.Result == Nest.Result.Created)
                    {
                        Console.WriteLine("第{0}个文档索引成功", i);
                    }
                    else
                    {
                        Console.WriteLine("第{0}个索引失败,文档内容为:{1}", i, log.ToJson());
                    }
                }
    
                Console.Read();
            }
        }
    }


    运行后出现下图,即表示索引文档成功。

    image.png

  • 相关阅读:
    11. Container With Most Water
    面试题------前端框架与其他
    python----生成器--列表推导式-----内置函数-----
    python----函数-----有参装饰器----迭代器
    python---闭包函数应用---装饰器
    python----函数-----名称空间与作用域 闭包函数
    python ----函数
    python---函数
    文件操作
    集合 文件部分操作
  • 原文地址:https://www.cnblogs.com/wugang/p/14232341.html
Copyright © 2011-2022 走看看