zoukankan      html  css  js  c++  java
  • ELK +Nlog 分布式日志系统的搭建 For Windows

    前言

    我们为啥需要全文搜索

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

    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界面,可以帮助您汇总、分析和搜索重要数据日志。

    image

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

    2:安装ES服务

      • 进入目录C:ELKelasticsearch-6.5.3in, 双击执行 elasticsearch.bat,该脚本文件执行 ElasticSearch 安装程序,稍等片刻,打开浏览器,输入 http://localhost:9200 ,显式以下画面,说明ES安装成功。
      • 关闭命令提示符窗口,服务也停止了,我们使用nssm工具将其安装为服务运行,cmd 进入nssm.exe 目录 输入nssm.exe install 回车,此时会弹出nssm工具的ui界面
      • image
      • 选择 C:ELKelasticsearch-6.5.3inelasticsearch.bat 输入服务名称 elasticsearch-6.5.3 点击install service
      • image
      • 天公不作美,安装时出现了意外,百度半天,发现是360 安全防护在作怪
      • image
      • 如果所示,被360 防护中心拦截,随手就卸载了360
      • image
      • 果然再次点击安装,成功
      • image
      • 由于我们在安装服务时,将DisplayName 随手写成了AAA
      • image
      • 所以在安装好的服务列表中显示的是AAA ,描述为BBB
      • image
      • 启动服务,然后再浏览器里面输入 http://localhost:9200/
      • image
      • 看到这个界面,说明elasticsearch启动成功
      • 现在我们来配置下elasticsearch 让它可以用IPV4 来访问
      • 进入 根目录 C:ELKelasticsearch-6.5.3config 找到 elasticsearch.yml 配置文件
      • 有关 elasticsearch.yml 的详细配置参考园友的详细介绍: https://www.cnblogs.com/hanyouchun/p/5163183.html
      • 找到 Network 配置位置
      • image
      • 取消这两行的注释  删除最前面的 #
      • 把 network.host 换成安装elasticsearch本机的IP ,端口号可以默认,然后保存,重启服务
      • 随即我们在 浏览器中 就可以使用 IP 来访问
      • image
      • 在这里 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
    • image
    • 注意,安装Logstash 时需要选择配置文件安装 添加启动参数 agent -f C:ELKlogstash-6.3.2inlogstash.conf
    • image
    • 如图,安装服务后 启动服务
    • image
    • 在启动的时候如果报错或者闪退 未能加载主程序XXXXXX
    • bin 文件夹下找到 logstash.bat 文件,打开 image 在这一行的这两个位置加上双引号
    • 再次运行,OK

    4:安装 kibana-6.3.2

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

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

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

    1. 创建一个netcore api 项目
    2. 打开NuGet包管理器 搜索 NLog.Web.AspNetCore
    3. 安装如图中的两个包 image
    4. 在 Startup.cs 中 配置使用 Nlog image
    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 = 0; i < 100; i++)
                  {
      
                      JsonLogMessage jsonLogMessage = new JsonLogMessage()
                      {
                          A_ActionName = "Get",
                          A_AddUser = 1,
                          A_AddUserName = "张三",
                          A_Host = "192.168.100.48",
                          A_Message = string.Format("测试Logstash日志请求,请求id:{0}", i),
                          A_ObjId = 2,
                          A_ObjName = "操作对象",
                          A_OperationName = "获取对象",
                          S_Application = "S_Application"
                      };
                      _Logger.Info(Newtonsoft.Json.JsonConvert.SerializeObject(jsonLogMessage));
                  }
                  return new string[] { "value1", "value2" };
              }
      }
    8. 打开 Kibana 创建 索引库image
    9. 创建完毕后,你就能在 Discover 看到 我们输入的日志了image

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

    网络截图

    image

     网络截图

     网络截图

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

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

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

    期待下篇,goodbye ~

  • 相关阅读:
    yolo_to_onnx ValueError: need more tan 1 value to unpack
    yolo_to_onnx killed
    C++ 实现二维矩阵的加减乘等运算
    Leetcode 1013. Partition Array Into Three Parts With Equal Sum
    Leetcode 1014. Best Sightseeing Pair
    Leetcode 121. Best Time to Buy and Sell Stock
    Leetcode 219. Contains Duplicate II
    Leetcode 890. Find and Replace Pattern
    Leetcode 965. Univalued Binary Tree
    Leetcode 700. Search in a Binary Search Tree
  • 原文地址:https://www.cnblogs.com/rtwo/p/11004478.html
Copyright © 2011-2022 走看看