使用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內基本足夠了。
在config里面,有一個logstash-sample.conf文件,可以當做參考配置,隨后咱們新建一個用於接收RabbitMQ的配置文件。先來寫代碼~~
在package包項目下,新增引用 Serilog.Sinks.RabbitMQ組件:
然后,在Program文件下面,添加serilog日志寫入到RabbitMQ的一些配置:
以上代碼如下:
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創建的案例,所以直接在原來的基礎上做一些改動:
設置了兩個RouteKey:WeskyLog和WeskyLog2,以及兩個隊列 Log1和Log2。咱們主要使用WeskyLog和 Log1。
在消費者監聽上面,做個過濾,對於隊列是Log1的消息,直接返回不做處理,這樣做到目的是消息不被消費,讓logstash來消費消息:
現在開始配置logstash,上面有一個logstash-sample.conf文件,拷貝一分,重命名為 rabbitmq.conf 然后往里面更改一些配置信息,如下:
logstash部分配置代碼:

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}" } }
注意,配置不能使用Tab,必須只能用空格,每個縮進倆空格。
現在寫一個測試的webapi,來看看效果。創建一個webapi,記錄兩條日志,一條是Infomaton,一條是Error:
現在啟動Wsk.Core程序,試着跑一下看看效果:
哦吼,才發現有其他的日志,所以直接打開RabbitMQ,可以看到日志被寫入到了MQ里面,而且因為沒有消費,所以隊列一直在增加。咱們現在啟動一下logstash。
啟動方式如下圖,具體地址那些,需要根據自己具體的目錄而定:
可以看見,左邊的消息,一下子被消費完畢,說明logstash應該是獲取到MQ消息了。
現在我們看一下ElasticSearch上面,是否有消息:
查詢log-20210629,可以看到對應的日志信息,說明寫入ES成功。
在kibana上面,選擇Discover,然后創建一個log的篩選,用於查詢所有以log開頭到索引:
剛添加會有點亂,咱們選擇只查看create_time、level和message字段信息:
顯示內容有點亂,debug信息也都記錄了,咱們把這部分過濾掉再啟動。配置文件里面,修改最小日志級別為Information:
再啟動程序,查看效果,瞬間清爽~~~
現在通過上面的webapi,寫兩個日志看看效果:
控制台有信息了,現在去ES上面看下日志信息:
可以看見日志也有了。現在試一下自帶搜索引擎的查詢的效果:
說明查詢也是OK的。
另外需要注意一點:
我這邊索引還是log-20210629,但是實際上已經是2021年6月30日的0點24分,這個是因為ES默認是0區,咱們中國是東八區,所以會自動少8個小時進行存儲。Kibana上面查詢的日志時間卻正常的,這個是因為Kibana默認會讀取瀏覽器的時區,自動幫我們轉換進行顯示了。
如果搜索日志時候,發現搜索的是單個字,沒有詞組那些,那可能是因為沒有添加中文分詞的原因。添加中文分詞以及中文分詞插件,可以加群索取哦~~
以上就是今天的內容,歡迎各位大佬留下寶貴的意見或建議~~~