前言

我们为啥需要全文搜索

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

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. win10重装win7 无法引导

    品牌机win10回滚win7 无法引导 BIOS设置 按键盘上的右方向键(→)选择到"Exit" 按键盘上的下方向键(↓)选择到 "OS Optimized Defaul ...

  2. E4A碰到打开自动闪退又自动打开又闪退一直循环的问题

    E4A碰到打开自动闪退又自动打开又闪退一直循环的问题 这几天写了一个脚本,自己手机上,模拟器上,均测试没有问题,可以正常操作 发给另一个人,他那边居然没有一个设备能运行成功! 而且一直闪退,闪退后又打 ...

  3. 系统性能工具篇(sar)

    转自:系统性能工具篇(sar) 1. 介绍 内容很多 是sysstat软件包的一部分 自动运行:/etc/crontab/sysstat $ cat /etc/cron.d/sysstat # The ...

  4. [Web 测试] Jest单元测试的几个指标

    三个参数代表什么? %stmts是语句覆盖率(statement coverage):是不是每个语句都执行了? %Branch分支覆盖率(branch coverage):是不是每个if代码块都执行了 ...

  5. Salt States概览

    作者言 我也只是SaltStack的初学者,如果文中有错误的地方,请不吝赐教. 在学习的过程,我也做了不少实验,犯了不少错,积累了一些经验,对SaltStack的运行也有一定了解,如果有什么问题,或是 ...

  6. vue-router踩坑日记Unknown custom element router-view

    今天笔者在研究vue-router的时候踩到了一个小坑,这个坑是这样的 笔者的具体代码如下:router.js import Home from '@/components/Home.vue'; im ...

  7. mysql8.0:SQLSTATE[HY000] [2054] The server requested authentication method unknown to the client

    忽然注意到的情况: 2018/7/19至2018/9/13之间发布的7.1.20.7.1.21.7.1.22和7.2.8.7.2.9.7.2.10这六个版本提供的对caching_sha2_passw ...

  8. WireMock和Spring MVC模拟器

    WireMock和Spring MVC模拟器 Spring Cloud Contract提供了一个方便的类,可以将JSON WireMock存根加载到Spring MockRestServiceSer ...

  9. UDP用于保持大量终端的在线与控制,应用与业务则通过TCP去实现。这个和FTP服务控制与数据分离,采取不同的连接,有异曲同工之处 端口映射老化时间

    移动端IM/推送系统的协议选型:UDP还是TCP? http://www.52im.net/thread-33-1-1.html

  10. CentOS 使用官方源yum安装最新nginx版本

    CentOS 使用官方源yum安装最新nginx版本 1.创建nginx.repo # vi /etc/yum.repos.d/nginx.repo 2.添加内容#如果是CentOS6,文件内容如下: ...