微服务日志之.NET Core使用NLog通过Kafka实现日志收集

一、前言

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,内容如下:

Copy
<?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>

编写测试代码#

Copy
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配置#

Copy
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

posted @   YOYOFx  阅读(4612)  评论(10编辑  收藏  举报
编辑推荐:
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
阅读排行:
· 10年+ .NET Coder 心语 ── 封装的思维:从隐藏、稳定开始理解其本质意义
· 地球OL攻略 —— 某应届生求职总结
· 提示词工程——AI应用必不可少的技术
· Open-Sora 2.0 重磅开源!
· 周边上新:园子的第一款马克杯温暖上架
点击右上角即可分享
微信分享提示
CONTENTS