微服務日誌之.NET Core使用NLog經過Kafka實現日誌收集

1、前言

NET Core愈來愈受歡迎,由於它具備在多個平臺上運行的原始.NET Framework的強大功能。Kafka正迅速成爲軟件行業的標準消息傳遞技術。這篇文章簡單介紹瞭如何使用.NET(Core)和Kafka實現NLog的Target。java

在平常項目開發過程當中,Java體系下Spring Boot + Logback很容易就接入了Kafka實現了日誌收集,在.NET和.NET Core下一直習慣了使用NLog做爲日誌組件。爲了讓微服務環境中dotnet和java的服務都統一的進行日誌收集,接下來的文章中會介紹兩種語言的統一接入方式。寫這個組件的目地是讓團隊成員不須要編寫NLog的JsonLayout從而達到與java服務輸出同樣格式到kafka的目地,簡化開發人員的配置難度,固然代價就是配置不靈活了。git

2、開源

經過實現NLog的Target,接入kafka將日誌傳輸到Logstash的組件。github

https://github.com/maxzhang1985/NLog.Kafkaredis

3、使用

創建項目

NLog.Kafka組件支持.NET 4.5+和 NETStandard1.6+ ,所在能夠在傳統.NET使用,固然也支持.NET Core的跨平臺使用(Win、Linux、Mac)。json

項目引用

  • NLog 4.5.8
  • NLog.Kafka
  • librdkafka.redist

引用librdkafka.redist是由於使用了依賴庫Confluent.Kafka 0.11.5,Confluent.Kafka 使用了著名的librdkafka開源庫,它是用C ++編寫的,做爲其它的語言(如C ++,C#,Python和Node)的Kafka驅動程序的基礎。bootstrap

配置

在項目中創建NLog.config,並設置爲Copy always,內容以下:ruby

<?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.Kafkaapp

GitHub:https://github.com/maxzhang1985/YOYOFx 若是覺還能夠請Star下, 歡迎一塊兒交流。elasticsearch

.NET Core 開源學習羣:214741894微服務

個人博客即將搬運同步至騰訊雲+社區,邀請你們一同入駐:https://cloud.tencent.com/developer/support-plan?invite_code=2j4ukgnjjum8o

相關文章
相關標籤/搜索