一、前言
NET Core越來越受歡迎,因為它具有在多個平台上運行的原始.NET Framework的強大功能。Kafka正迅速成為軟件行業的標准消息傳遞技術。這篇文章簡單介紹了如何使用.NET(Core)和Kafka實現NLog的Target。
在日常項目開發過程中,Java體系下Spring Boot + Logback很容易就接入了Kafka實現了日志收集,在.NET和.NET Core下一直習慣了使用NLog作為日志組件。為了讓微服務環境中dotnet和java的服務都統一的進行日志收集,接下來的文章中會介紹兩種語言的統一接入方式。寫這個組件的目地是讓團隊成員不需要編寫NLog的JsonLayout從而達到與java服務輸出一樣格式到kafka的目地,簡化開發人員的配置難度,當然代價就是配置不靈活了。
二、開源
通過實現NLog的Target,接入kafka將日志傳輸到Logstash的組件。
https://github.com/maxzhang1985/NLog.Kafka
三、使用
建立項目
NLog.Kafka組件支持.NET 4.5+和 NETStandard1.6+ ,所在可以在傳統.NET使用,當然也支持.NET Core的跨平台使用(Win、Linux、Mac)。
項目引用
- NLog 4.5.8
- NLog.Kafka
- librdkafka.redist
引用librdkafka.redist是因為使用了依賴庫Confluent.Kafka 0.11.5,Confluent.Kafka 使用了著名的librdkafka開源庫,它是用C ++編寫的,作為其它的語言(如C ++,C#,Python和Node)的Kafka驅動程序的基礎。
配置
在項目中建立NLog.config,並設置為Copy always,內容如下:
<?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 }
}
四、最后
附上的Demo和開源庫地址:https://github.com/maxzhang1985/NLog.Kafka
GitHub:https://github.com/maxzhang1985/YOYOFx 如果覺還可以請Star下, 歡迎一起交流。
.NET Core 開源學習群:214741894
我的博客即將搬運同步至騰訊雲+社區,邀請大家一同入駐:https://cloud.tencent.com/developer/support-plan?invite_code=2j4ukgnjjum8o