前言html
咱们为啥须要全文搜索nginx
首先,咱们来列举一下关系型数据库中的几种模糊查询 web
MySql :sql
SqlServer 也有相似的函数提供模糊查询,不重复说明数据库
思考:使用关系型数据库咱们如何实现相似,淘宝、京东、的搜索框json
有同窗就举例了,分词,sql 拼接,多线程异步执行 ,当你看到这样的产品属性时,你还有欲望sql拼接吗?windows
能够想象一下公司的业务场景,汽车金融领域,是否是也能够作一个这样的搜索,供咱们的业务部门使用,而不是仅仅从特定的几个字段来进行搜索api
------华丽分割---------浏览器
从搜索在谈到日志,咱们有 log4j、Log4j二、nlog、等等系列开源日志软件,初期咱们写入txt,后期,每个月要清理高达几百G的日志文件。tomcat
咱们运行的服务器集群出现 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包含四种工具:(此文只会谈及)
- Packetbeat(搜集网络流量数据)
- Topbeat(搜集系统、进程和文件系统级别的 CPU 和内存使用状况等数据)
- Filebeat(搜集文件数据)
- Winlogbeat(搜集 Windows 事件日志数据)
- kibana也是一个开源和免费的工具,他Kibana能够为Logstash和ES提供的日志分析友好的Web界面,能够帮助您汇总、分析和搜索重要数据日志。
Logstash 它的五种替代方案(Filebeat、Fluentd、rsyslog、syslog-ng 以及 Logagent)
Logstash工做原理:
Logstash事件处理有三个阶段:inputs → filters → outputs。是一个接收,处理,转发日志的工具。支持系统日志,webserver日志,错误日志,应用日志,总之包括全部能够抛出来的日志类型。
这里我不去分析这五种日志收集传输工具的优缺点,有兴趣的同窗能够自行去研究他们的优劣势以及使用场景。
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 {}
}
首先来看下在Net Core 中使用 Nlog 向搭建好的 ELK 输入日志
- 建立一个netcore api 项目
- 打开NuGet包管理器 搜索 NLog.Web.AspNetCore
- 安装如图中的两个包
- 在 Startup.cs 中 配置使用 Nlog
- 新增 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>- 新增 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;} }- 在控制器中使用 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" }; } }- 打开 Kibana 建立 索引库
- 建立完毕后,你就能在 Discover 看到 咱们输入的日志了
到这里 一个 以Nlog + ELK 的分布式日志系统就搭建完成了,有同窗问,这样就行了么?,我在这里给你们一张拓扑图,你们看了就明白了,这上面作的只是入门的基础单元
网络截图
网络截图
网络截图
拓展:也有nlog 直接写入 参考园友文章,有兴趣的同窗能够试一下
https://www.cnblogs.com/focus-lei/p/9154867.html
若是只是为了写日志,这样也不失为一个简便的方法,但你若是须要对收集到的各类日志进行格式化,过滤,此方式就不通了。