天天看點

十八、.net core(.NET 6)搭建ElasticSearch(ES)系列之使用Logstash通過Rabbitmq接收Serilog日志到ES

 使用Logstash通過Rabbitmq接收Serilog日志到ES

首先,要部署logstash

為了與前面的ElasticSearch版本保持一緻,此處Logstash下載下傳的版本也是7.13.1,下載下傳位址:

https://artifacts.elastic.co/downloads/logstash/logstash-7.13.1-windows-x86_64.zip

解壓以後,修改一些配置:

在config目錄下,修改jvm.options檔案,設定記憶體占用最小值和最大值:如果配置比較低,建議配置成512MB即可,如果電腦或伺服器配置比較好,那就請随意。如果隻是普通用途,比如記錄普通日志啥的,配個4G内基本足夠了。

十八、.net core(.NET 6)搭建ElasticSearch(ES)系列之使用Logstash通過Rabbitmq接收Serilog日志到ES

在config裡面,有一個logstash-sample.conf檔案,可以當做參考配置,随後咱們建立一個用于接收RabbitMQ的配置檔案。先來寫代碼~~ 

在package包項目下,新增引用 Serilog.Sinks.RabbitMQ元件:

十八、.net core(.NET 6)搭建ElasticSearch(ES)系列之使用Logstash通過Rabbitmq接收Serilog日志到ES
然後,在Program檔案下面,添加serilog日志寫入到RabbitMQ的一些配置:
十八、.net core(.NET 6)搭建ElasticSearch(ES)系列之使用Logstash通過Rabbitmq接收Serilog日志到ES
以上代碼如下:

logger.WriteTo.RabbitMQ((clientConfiguration, sinkConfig) =>
                         {
                             clientConfiguration.Username = "wesky";
                             clientConfiguration.Password = "wesky123";
                             clientConfiguration.Exchange = "WeskyExchange";
                             clientConfiguration.ExchangeType = "direct";
                             clientConfiguration.DeliveryMode = RabbitMQDeliveryMode.Durable;
                             clientConfiguration.RouteKey = "WeskyLog";
                             clientConfiguration.Port = 5672;
                             clientConfiguration.Hostnames.Add("127.0.0.1");
                             sinkConfig.TextFormatter = new JsonFormatter();
                         });      

以上為了友善,是以寫死了,大佬們可以寫到配置檔案裡面去進行讀取,這樣好一點。

然後,程式啟動時候,進行主動建立一個Exchange為WeskyExchange的,RouteKey是WeskyLogs的消息隊列,包括生産者和消費者。之前有做過簡單的RabbitMQ建立的案例,是以直接在原來的基礎上做一些改動:

十八、.net core(.NET 6)搭建ElasticSearch(ES)系列之使用Logstash通過Rabbitmq接收Serilog日志到ES

設定了兩個RouteKey:WeskyLog和WeskyLog2,以及兩個隊列 Log1和Log2。咱們主要使用WeskyLog和 Log1。

在消費者監聽上面,做個過濾,對于隊列是Log1的消息,直接傳回不做處理,這樣做到目的是消息不被消費,讓logstash來消費消息:

十八、.net core(.NET 6)搭建ElasticSearch(ES)系列之使用Logstash通過Rabbitmq接收Serilog日志到ES

現在開始配置logstash,上面有一個logstash-sample.conf檔案,拷貝一分,重命名為 rabbitmq.conf  然後往裡面更改一些配置資訊,如下:

十八、.net core(.NET 6)搭建ElasticSearch(ES)系列之使用Logstash通過Rabbitmq接收Serilog日志到ES

logstash部配置設定置代碼:

十八、.net core(.NET 6)搭建ElasticSearch(ES)系列之使用Logstash通過Rabbitmq接收Serilog日志到ES
十八、.net core(.NET 6)搭建ElasticSearch(ES)系列之使用Logstash通過Rabbitmq接收Serilog日志到ES
input {
  rabbitmq {
    host => "127.0.0.1"
    port => 5672
    user => "wesky"
    password => "wesky123"
    queue => "Log1"
    key => "WeskyLog"
    exchange => "WeskyExchange"
    durable => true
  }
}

filter {
  grok {
    match => {"Timestamp" => "%{TIMESTAMP_ISO8601:ctime}"}
    add_field => ["create_time","%{@timestamp}"]
  }
  date {
    match => ["ctime","yyyy-MM-dd HH:mm:ss.SSS","ISO8601"]
    target => "@timestamp"
  }
  mutate {
    remove_field => ["@version","Properties","Timestamp","ctime"]
    rename => {"MessageTemplate" => "message"}
    rename => {"Level" => "level"}
  }
  ruby {
    code => "event.set('create_time',event.get('@timestamp').time.localtime)"
  }
}

output {
  elasticsearch {
    hosts => ["http://localhost:9200"]
    index => "log-%{+YYYYMMdd}"
  }
}      

View Code

注意,配置不能使用Tab,必須隻能用空格,每個縮進倆空格。

現在寫一個測試的webapi,來看看效果。建立一個webapi,記錄兩條日志,一條是Infomaton,一條是Error:

十八、.net core(.NET 6)搭建ElasticSearch(ES)系列之使用Logstash通過Rabbitmq接收Serilog日志到ES

現在啟動Wsk.Core程式,試着跑一下看看效果:

十八、.net core(.NET 6)搭建ElasticSearch(ES)系列之使用Logstash通過Rabbitmq接收Serilog日志到ES

哦吼,才發現有其他的日志,是以直接打開RabbitMQ,可以看到日志被寫入到了MQ裡面,而且因為沒有消費,是以隊列一直在增加。咱們現在啟動一下logstash。

啟動方式如下圖,具體位址那些,需要根據自己具體的目錄而定:

十八、.net core(.NET 6)搭建ElasticSearch(ES)系列之使用Logstash通過Rabbitmq接收Serilog日志到ES

可以看見,左邊的消息,一下子被消費完畢,說明logstash應該是擷取到MQ消息了。

現在我們看一下ElasticSearch上面,是否有消息:

十八、.net core(.NET 6)搭建ElasticSearch(ES)系列之使用Logstash通過Rabbitmq接收Serilog日志到ES

查詢log-20210629,可以看到對應的日志資訊,說明寫入ES成功。

在kibana上面,選擇Discover,然後建立一個log的篩選,用于查詢所有以log開頭到索引:

十八、.net core(.NET 6)搭建ElasticSearch(ES)系列之使用Logstash通過Rabbitmq接收Serilog日志到ES

剛添加會有點亂,咱們選擇隻檢視create_time、level和message字段資訊:

十八、.net core(.NET 6)搭建ElasticSearch(ES)系列之使用Logstash通過Rabbitmq接收Serilog日志到ES

顯示内容有點亂,debug資訊也都記錄了,咱們把這部分過濾掉再啟動。配置檔案裡面,修改最小日志級别為Information:

十八、.net core(.NET 6)搭建ElasticSearch(ES)系列之使用Logstash通過Rabbitmq接收Serilog日志到ES

再啟動程式,檢視效果,瞬間清爽~~~

十八、.net core(.NET 6)搭建ElasticSearch(ES)系列之使用Logstash通過Rabbitmq接收Serilog日志到ES

現在通過上面的webapi,寫兩個日志看看效果:

十八、.net core(.NET 6)搭建ElasticSearch(ES)系列之使用Logstash通過Rabbitmq接收Serilog日志到ES

控制台有資訊了,現在去ES上面看下日志資訊:

十八、.net core(.NET 6)搭建ElasticSearch(ES)系列之使用Logstash通過Rabbitmq接收Serilog日志到ES

可以看見日志也有了。現在試一下自帶搜尋引擎的查詢的效果:

十八、.net core(.NET 6)搭建ElasticSearch(ES)系列之使用Logstash通過Rabbitmq接收Serilog日志到ES
十八、.net core(.NET 6)搭建ElasticSearch(ES)系列之使用Logstash通過Rabbitmq接收Serilog日志到ES

說明查詢也是OK的。

另外需要注意一點:

我這邊索引還是log-20210629,但是實際上已經是2021年6月30日的0點24分,這個是因為ES預設是0區,咱們中國是東八區,是以會自動少8個小時進行存儲。Kibana上面查詢的日志時間卻正常的,這個是因為Kibana預設會讀取浏覽器的時區,自動幫我們轉換進行顯示了。

如果搜尋日志時候,發現搜尋的是單個字,沒有詞組那些,那可能是因為沒有添加中文分詞的原因。添加中文分詞以及中文分詞插件,可以加群索取哦~~

以上就是今天的内容,歡迎各位大佬留下寶貴的意見或建議~~~

歡迎加入QQ群:

群号:1079830632

十八、.net core(.NET 6)搭建ElasticSearch(ES)系列之使用Logstash通過Rabbitmq接收Serilog日志到ES

繼續閱讀