前言

我们为啥需要全文搜索

首先,我们来列举一下关系型数据库中的几种模糊查询

MySql :

  1. 一般情况下LIKE 模糊查询  SELECT * FROM `LhzxUsers` WHERE UserName LIKE '%o%'
  2. 模糊查询高效的方法 

    LOCATE('substr',str,pos)方法  SELECT * FROM `LhzxUsers` WHERE LOCATE('O',UserName) >0

    解释:返回 substr 在 str 中第一次出现的位置,如果 substr 在 str 中不存在,返回值为 0 。如果pos存在,返回 substr 在 str 第pos个位置后第一次出现的位置,如果 substr 在 str 中不存在,返回值为0

    POSITION('substr' IN `field`)方法 SELECT * FROM `LhzxUsers` WHERE POSITION('O' IN UserName)

    解释:其实我们就可以把这个方法当做是locate()方法的别名,因为它和locate()方法的作用是一样的。

    INSTR(`str`,'substr')方法 SELECT * FROM `LhzxUsers` WHERE INSTR(UserName,'O')>0

    解释:这个函数返回字符串在某一个字段的内容中的位置, 没有找到字符串返回0,否则返回位置(从1开始)

    除了上述的方法外,还有一个函数FIND_IN_SET,这个方法比较特殊,他所查询的必须要是以“,”分隔开。

    FIND_IN_SET(str1,str2) SELECT * FROM LhzxUsers WHERE  FIND_IN_SET('杭州',Address)   

SqlServer 也有类似的函数提供模糊查询,不重复说明

思考:使用关系型数据库我们如何实现类似,淘宝、京东、的搜索框

有同学就举例了,分词,sql 拼接,多线程异步执行 ,当你看到这样的产品属性时,你还有欲望sql拼接吗?

可以想象一下公司的业务场景,汽车金融领域,是不是也可以做一个这样的搜索,供我们的业务部门使用,而不是仅仅从特定的几个字段来进行搜索

------华丽分割---------

从搜索在谈到日志,我们有  log4j、Log4j2、nlog、等等系列开源日志软件,初期我们写入txt,后期,每月要清理高达几百G的日志文件。

我们运行的服务器集群出现 CPU100%,内存溢出等异常,需要查看 IIS、nginx、Apache、tomcat、等服务软件的运行日志时,需要一台一台的去服务器各个软件日志目录去查看,这个时候就有工程师想到了分布式日志服务架构。很优秀!!

基础软件环境搭建

ELK由ElasticSearch(ES)、Logstash和Kiabana三个开源工具组成。

  • elasticsearch-6.3.2
  • kibana-6.3.2-windows-x86_64
  • logstash-6.3.2
  • nssm工具可以将各种应用添加到Windows服务,以服务的形式运行上诉软件 官网 http://nssm.cc/

  • ES是个开源分布式搜索引擎,它的特点有:分布式,零配置,自动发现,索引自动分片,索引副本机制,restful风格接口,多数据源,自动搜索负载等。 这里有权威指南 https://es.xiaoleilu.com
  • Logstash是一个完全开源的工具,可以对日志进行收集、分析、并将其存储供以后使用。
  • Filebeat隶属于Beats。目前Beats包含四种工具:(此文只会谈及)

      1. Packetbeat(搜集网络流量数据)
      2. Topbeat(搜集系统、进程和文件系统级别的 CPU 和内存使用情况等数据)
      3. Filebeat(搜集文件数据)
      4. Winlogbeat(搜集 Windows 事件日志数据)
  • kibana也是一个开源和免费的工具,他Kibana可以为Logstash和ES提供的日志分析友好的Web界面,可以帮助您汇总、分析和搜索重要数据日志。

1:安装JAVA-JDK(需要1.8),官方自行下载,不做介绍

2:安装ES服务

    • 进入目录C:\ELK\elasticsearch-6.5.3\bin, 双击执行 elasticsearch.bat,该脚本文件执行 ElasticSearch 安装程序,稍等片刻,打开浏览器,输入 http://localhost:9200 ,显式以下画面,说明ES安装成功。
    • 关闭命令提示符窗口,服务也停止了,我们使用nssm工具将其安装为服务运行,cmd 进入nssm.exe 目录 输入nssm.exe install 回车,此时会弹出nssm工具的ui界面
    • 选择 C:\ELK\elasticsearch-6.5.3\bin\elasticsearch.bat 输入服务名称 elasticsearch-6.5.3 点击install service
    • 天公不作美,安装时出现了意外,百度半天,发现是360 安全防护在作怪
    • 如果所示,被360 防护中心拦截,随手就卸载了360
    • 果然再次点击安装,成功
    • 由于我们在安装服务时,将DisplayName 随手写成了AAA
    • 所以在安装好的服务列表中显示的是AAA ,描述为BBB
    • 启动服务,然后再浏览器里面输入 http://localhost:9200/
    • 看到这个界面,说明elasticsearch启动成功
    • 现在我们来配置下elasticsearch 让它可以用IPV4 来访问
    • 进入 根目录 C:\ELK\elasticsearch-6.5.3\config 找到 elasticsearch.yml 配置文件
    • 有关 elasticsearch.yml 的详细配置参考园友的详细介绍: https://www.cnblogs.com/hanyouchun/p/5163183.html
    • 找到 Network 配置位置
    • 取消这两行的注释  删除最前面的 #
    • 把 network.host 换成安装elasticsearch本机的IP ,端口号可以默认,然后保存,重启服务
    • 随即我们在 浏览器中 就可以使用 IP 来访问
    • 在这里 elasticsearch 的单机简易安装服务我们完成了 ,关于elasticsearch的集群服务安装可以后续继续研究。

3:安装Logstash服务

Logstash 它的五种替代方案(Filebeat、Fluentd、rsyslog、syslog-ng 以及 Logagent)

Logstash工作原理:
Logstash事件处理有三个阶段:inputs → filters → outputs。是一个接收,处理,转发日志的工具。支持系统日志,webserver日志,错误日志,应用日志,总之包括所有可以抛出来的日志类型。

这里我不去分析这五种日志收集传输工具的优缺点,有兴趣的同学可以自行去研究他们的优劣势以及使用场景。

    • 在根目录新增 logstash.conf 配置文件

input {
    stdin{

}
    udp{
        host=>"192.168.100.48"
        port=>4561
        codec=>"json"
    }
}
filter {
}   
output {
  elasticsearch {
        hosts => ["192.168.100.48:9200"]
        index => "logstash-%{+YYYY.MM.dd}"
        document_type => "logs"
  }
  stdout {}
}

  • 同理,使用NSSM 安装 Logstash
  • 注意,安装Logstash 时需要选择配置文件安装 添加启动参数 agent -f C:\ELK\logstash-6.3.2\bin\logstash.conf
  • 如图,安装服务后 启动服务
  • 在启动的时候如果报错或者闪退 未能加载主程序XXXXXX
  • bin 文件夹下找到 logstash.bat 文件,打开 在这一行的这两个位置加上双引号
  • 再次运行,OK

4:安装 kibana-6.3.2

  • 进入跟目录 C:\ELK\kibana-6.3.2-windows-x86_64\kibana-6.3.2-windows-x86_64\config
  • 编辑 kibana.yml
  • 使用NSSM 安装 kibana 为服务
  • 右键启用,浏览器访问 http://192.168.100.48:5601 就可以打开 kibana 界面了

这ELK样服务安装完成后,我们就可以开始往里面写入各种数据了

首先来看下在Net Core 中使用 Nlog 向搭建好的 ELK 输入日志

  1. 创建一个netcore api 项目
  2. 打开NuGet包管理器 搜索 NLog.Web.AspNetCore
  3. 安装如图中的两个包
  4. 在 Startup.cs 中 配置使用 Nlog
  5. 新增 nlog.config 文件
    <?xml version="1.0" encoding="utf-8" ?>
    <nlog xmlns="http://www.nlog-project.org/schemas/NLog.xsd"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    autoReload="true"
    internalLogLevel="Warn"
    internalLogFile="internal-nlog.txt">
    <!--define various log targets-->
    <targets>
    <target name="network" xsi:type="Network" address="udp://192.168.100.48:4561" layout="${message}"/>
    </targets>
    <rules>
    <logger name="*" level="Info" writeTo="network" />
    </rules>
    </nlog>
  6. 新增 JsonLogMessage 类
    public class JsonLogMessage
    {
    public string A_Message { get; set; }
    public int A_AddUser { get; set; }
    public string A_AddUserName { get; set; }
    public int A_ObjId { get; set; }
    public string A_ObjName { get; set; }
    public string A_OperationName { get; set; }
    public string A_ActionName { get; set; }
    public string A_Host { get; set; }
    public string S_LoggerName { get; set; }
    public string S_Level { get; set; }
    public string S_Thread { get; set; }
    public string S_Application { get; set; }
    public DateTime S_Timestamp { get=> System.DateTime.Now;}
    }
  7. 在控制器中使用 Nlog 向ELK 输出 日志
    [Route("api/[controller]")]
    [ApiController]
    public class ValuesController : ControllerBase
    {
    private readonly ILogger _Logger = LogManager.GetCurrentClassLogger(); // GET api/values
    [HttpGet]
    public ActionResult<IEnumerable<string>> Get()
    {
    for (int i = ; i < ; i++)
    { JsonLogMessage jsonLogMessage = new JsonLogMessage()
    {
    A_ActionName = "Get",
    A_AddUser = ,
    A_AddUserName = "张三",
    A_Host = "192.168.100.48",
    A_Message = string.Format("测试Logstash日志请求,请求id:{0}", i),
    A_ObjId = ,
    A_ObjName = "操作对象",
    A_OperationName = "获取对象",
    S_Application = "S_Application"
    };
    _Logger.Info(Newtonsoft.Json.JsonConvert.SerializeObject(jsonLogMessage));
    }
    return new string[] { "value1", "value2" };
    }
    }
  8. 打开 Kibana 创建 索引库
  9. 创建完毕后,你就能在 Discover 看到 我们输入的日志了

到这里 一个 以Nlog + ELK 的分布式日志系统就搭建完成了,有同学问,这样就好了么?,我在这里给大家一张拓扑图,大家看了就明白了,这上面做的只是入门的基础单元

网络截图

网络截图

网络截图

拓展:也有nlog 直接写入 参考园友文章,有兴趣的同学可以试一下

https://www.cnblogs.com/focus-lei/p/9154867.html

如果只是为了写日志,这样也不失为一个简便的方法,但你如果需要对收集到的各种日志进行格式化,过滤,此方式就不通了。

期待下篇,goodbye ~

ELK +Nlog 分布式日志系统的搭建 For Windows的更多相关文章

  1. 利用开源架构ELK构建分布式日志系统

    问题导读 1.ELK产生的背景?2.ELK的基本组成模块以及各个模块的作用?3.ELK的使用总计有哪些? 背景 日志,对每个系统来说,都是很重要,又很容易被忽视的部分.日志里记录了程序执行的关键信息, ...

  2. C#采用rabbitMQ搭建分布式日志系统

    网上对于java有很多开源的组件可以搭建分布式日志系统,我参考一些组件自己开发一套简单的分布式日志系 全部使用采用.NET进行开发,所用技术:MVC.EF.RabbitMq.MySql.Autofac ...

  3. .NET下日志系统的搭建——log4net+kafka+elk

    .NET下日志系统的搭建--log4net+kafka+elk 前言     我们公司的程序日志之前都是采用log4net记录文件日志的方式(有关log4net的简单使用可以看我另一篇博客),但是随着 ...

  4. 【7.1.1】ELK日志系统单体搭建

    ELK是什么? 一般来说,为了提高服务可用性,服务器需要部署多个实例,每个实例都是负载均衡转发的后的,如果还用老办法登录服务器去tail -f xxx.log,有很大可能错误日志未出现在当前服务器中, ...

  5. Spring Cloud 5分钟搭建教程(附上一个分布式日志系统项目作为参考) - 推荐

    http://blog.csdn.net/lc0817/article/details/53266212/ https://github.com/leoChaoGlut/log-sys 上面是我基于S ...

  6. Ansible实战:部署分布式日志系统

    本节内容: 背景 分布式日志系统架构图 创建和使用roles JDK 7 role JDK 8 role Zookeeper role Kafka role Elasticsearch role My ...

  7. PowerJob 在线日志饱受好评的秘诀:小但实用的分布式日志系统

    本文适合有 Java 基础知识的人群 作者:HelloGitHub-Salieri HelloGitHub 推出的<讲解开源项目>系列. 项目地址: https://github.com/ ...

  8. Elasticsearch,Kibana,Logstash,NLog实现ASP.NET Core 分布式日志系统

    Elasticsearch - 简介 Elasticsearch 作为核心的部分,是一个具有强大索引功能的文档存储库,并且可以通过 REST API 来搜索数据.它使用 Java 编写,基于 Apac ...

  9. ASP.NET Core分布式日志系统ELK实战演练

    一.ELK简介  ELK是Elasticsearch.Logstash和Kibana首字母的缩写.这三者均是开源软件,这三套开源工具组合起来形成了一套强大的集中式日志管理平台. •  Elastics ...

随机推荐

  1. linux 去掉 ^M 的方法

    在linux上经常遇到这种问题,从网上下载文件到 linux 上后,就多了很多 ^M这种东西,如何集体删除这种东西呢! 用 vim 打开文件 进行如下设置  将文件格式转化为unix :set ff= ...

  2. Spring Transaction 使用入门

    一.开篇陈述 1.1 写文缘由 最近在系统学习spring框架IoC.AOP.Transaction相关的知识点,准备写三篇随笔记录学习过程中的感悟.这是第一篇,记录spring Transactio ...

  3. zabbix-常规配置

    zabbix server:cat zabbix_server.confLogFile=/data/log/zabbix_server.logLogFileSize=250DebugLevel=3Pi ...

  4. WDM驱动改可手动加卸载的NT驱动

    WDM驱动改可手动加卸载的NT驱动 测试工具:osrloader 把一个WDM类型的驱动改成可动态加载/卸载,需要做以下2个修改: 1. 把SOURCES文件夹中的DRIVERTYPE=WDM去掉 2 ...

  5. 【技术博客】JWT的认证机制Django项目中应用

    开发组在开发过程中,都不可避免地遇到了一些困难或问题,但都最终想出办法克服了.我们认为这样的经验是有必要记录下来的,因此就有了[技术博客]. JWT的认证机制Django项目中应用 这篇技术博客基于软 ...

  6. 第08组 Alpha冲刺(4/4)

    小李的博客 作业博客 作业链接 组员1李昕晖(组长) 过去两天完成了哪些任务 文字/口头描述 11月20日了解各个小组的进度与难以攻破的地方,晚上安排开会,安排新的冲刺任务. 实现地图功能 展示Git ...

  7. js Map的使用

    setExpenseAndAmountSum: function() { var detailList = vehicleVueObj.vehicleData; var expenseAmountSu ...

  8. Server Tomcat v8.5 Server at localhost was unable to start within 45 seconds. If the server requires more time, try increasing the timeout in the server editor.

    Server Tomcat v9.0 Server at localhost was unable to start within 45 seconds. If the server requires ...

  9. css 设置div半透明 悬浮在页面底部 不随滚动条滚动

    .action-button { width: 100%; background:rgba(0,0,0,0.7); position:fixed; bottom:; left:; z-index:; ...

  10. @JsonInclude(Include.NON_NULL) resttemplate 传递实体参数时 序列化为json时 空字符串不参与序列化

    @JsonInclude(Include.NON_NULL) resttemplate 传递实体参数时 序列化为json时 空字符串不参与序列化 https://www.cnblogs.com/sup ...