前言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
若是隻是爲了寫日誌,這樣也不失爲一個簡便的方法,但你若是須要對收集到的各類日誌進行格式化,過濾,此方式就不通了。