1、前言
NET Core愈來愈受歡迎,由於它具備在多個平臺上運行的原始.NET Framework的強大功能。Kafka正迅速成爲軟件行業的標準消息傳遞技術。這篇文章簡單介紹瞭如何使用.NET(Core)和Kafka實現NLog的Target。php
在平常項目開發過程當中,Java體系下Spring Boot + Logback很容易就接入了Kafka實現了日誌收集,在.NET和.NET Core下一直習慣了使用NLog做爲日誌組件。爲了讓微服務環境中dotnet和java的服務都統一的進行日誌收集,接下來的文章中會介紹兩種語言的統一接入方式。寫這個組件的目地是讓團隊成員不須要編寫NLog的JsonLayout從而達到與java服務輸出同樣格式到kafka的目地,簡化開發人員的配置難度,固然代價就是配置不靈活了。html
2、開源
經過實現NLog的Target,接入kafka將日誌傳輸到Logstash的組件。java
https://github.com/maxzhang1985/NLog.Kafkagit
3、使用
創建項目
NLog.Kafka組件支持.NET 4.5+和 NETStandard1.6+ ,所在能夠在傳統.NET使用,固然也支持.NET Core的跨平臺使用(Win、Linux、Mac)。github
項目引用
- NLog 4.5.8
- NLog.Kafka
- librdkafka.redist
引用librdkafka.redist是由於使用了依賴庫Confluent.Kafka 0.11.5,Confluent.Kafka 使用了著名的librdkafka開源庫,它是用C ++編寫的,做爲其它的語言(如C ++,C#,Python和Node)的Kafka驅動程序的基礎。redis
配置
在項目中創建NLog.config,並設置爲Copy always,內容以下:json
<?xml version="1.0" encoding="utf-8" ?> <!--nlog 基礎配置 第二行throwExceptions開始 上線後關閉--> <nlog autoReload="true" xmlns="http://www.nlog-project.org/schemas/NLog.xsd" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" throwExceptions="true" throwConfigExceptions="true" internalLogLevel="Trace" > <!-- load NLog.Extended to enable ASP.NET-specific functionality --> <targets> <target name="queue" xsi:type="kafka" topic="loges" appname="nlogtest" includeMdc="true" > <!-- bootstrap.servers = 127.0.0.1:9092,127.0.0.1:9092,127.0.0.1:9092 --> <producerConfig key="bootstrap.servers" value="127.0.0.1:9092" /> <producerConfig key="queue.buffering.max.messages" value="2000000" /> <producerConfig key="retry.backoff.ms" value="500" /> <producerConfig key="message.send.max.retries" value="3" /> </target> </targets> <rules> <logger name="*" writeTo="queue" /> </rules> </nlog>
編寫測試代碼
class Program { static void Main(string[] args) { Logger logger = LogManager.GetCurrentClassLogger(); MappedDiagnosticsContext.Set("item1", "haha"); for(int i = 0; i < 10; i++) { logger.Info("hello world"); Console.WriteLine("sended"); } Console.ReadKey(); } }
Logstash配置
input {
kafka {
bootstrap_servers => "127.0.0.1:9092" group_id => "logstash" topics => "loges" codec => "json" } } output{ elasticsearch { hosts => ["127.0.0.1:9002"] index => "log_{[appname]}_%{+YYYY.MM.dd}" } #stdout { codec => rubydebug } }
4、最後
附上的Demo和開源庫地址:https://github.com/maxzhang1985/NLog.Kafkabootstrap
GitHub:https://github.com/maxzhang1985/YOYOFx 若是覺還能夠請Star下, 歡迎一塊兒交流。ruby
.NET Core 開源學習羣:214741894markdown
個人博客即將搬運同步至騰訊雲+社區,邀請你們一同入駐:https://cloud.tencent.com/developer/support-plan?invite_code=2j4ukgnjjum8o