ELK系列~NLog.Targets.Fluentd到达如何通过tcp发到fluentd
最近火的不能再火的日志框架就是ELK,其中E(Elasticsearch)表示日志存储,L(Logstash)表示日志收集,K(kibana)表示日志的UI界面,用来查询和分析,而其中的L可以使用Fluentd来代替,并且以上架构都可以通过docker来进行快速的部署。
它们的工作流程
fluentd系统有输入和输出,输入对应我们的应用程序,输出对应咱们的ES存储系统,在.net平台上,如果希望把日志发到fluentd,有三种方式,下面分别简单说一下:
- http方式
- tcp方式
- 客户端c/s方式
一 http方式
构建一个共享的httpclient对象,然后声明为keep-alive,使用keep-alive可以改善这种状态,即在一次TCP连接中可以持续发送多份数据而不会断开连接。通过使用keep-alive机制,可以减少tcp连接建立次数,也意味着可以减少TIME_WAIT状态连接,以此提高性能和提高httpd服务器的吞吐率(更少的tcp连接意味着更少的系统内核调用,socket的accept()和close()调用)。
fluentd配置:
<source> @type http port 24224 bind 0.0.0.0 </source>
C#代码:
var json = JsonConvert.SerializeObject(new { target_index = projectName, timestamp = DateTime.Now.ToUniversalTime().ToString("yyyy-MM-ddTHH:mm:ss.fffZ"), Level = level.ToString(), Message = message, StackTrace = ex?.StackTrace }); json = json.Replace("target_index", "@target_index").Replace("timestamp", "@timestamp"); var httpContent = new StringContent(json, Encoding.UTF8); httpContent.Headers.ContentType = new MediaTypeHeaderValue("application/json"); httpClient.PostAsync(apiLoggerUrl, httpContent).Wait();
二 tcp方式
tcp方式比http要复杂一些,在fluentd配置时也需要注册,在性能上优于http,目前NLog.Targets.Fluentd这个框架对它进行了集成,但说明文档不是很清楚,大叔经过测试也已经成功实现了tcp的日志记录,需要注意的地方就是fluentd在接受tcp时,需要有一个结果标示,默认是\n,在客户端发送请求时需要在数据包结尾添加它。
NLog.Targets.Fluentd在github上的地址:
https://github.com/fluent/NLog.Targets.Fluentd
fluentd配置:
<source> @type tcp tag pilipa format /^(?<field1>\d+):(?<field2>\w+)$/ port 24224 bind 0.0.0.0 </source> <match **> @type stdout </match>
客户端调用
var fluentdTarget = new NLog.Targets.Fluentd() { Host = "192.168.200.214", Port = 24224, Tag = "pilipa", LingerEnabled = false, NoDelay = true, EmitStackTraceWhenAvailable = false, }; LoggingConfiguration config = new LoggingConfiguration(); config.AddRuleForOneLevel(LogLevel.Info, "fluentd"); LogManager.Configuration = config; Logger logger = LogManager.GetLogger("Example"); logger.Info(json + "\n"); //这是必须的,看到\n表示数据包结束 Console.Read();
然后在我们的fluentd上就可以看到日志了。
三 客户端c/s方式
目前正在研究,客户端驱动地址:https://docs.fluentd.org/v0.12/articles/windows#set-up-nxlog-on-windows
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】凌霞软件回馈社区,博客园 & 1Panel & Halo 联合会员上线
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】博客园社区专享云产品让利特惠,阿里云新客6.5折上折
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· [.NET]调用本地 Deepseek 模型
· 一个费力不讨好的项目,让我损失了近一半的绩效!
· .NET Core 托管堆内存泄露/CPU异常的常见思路
· PostgreSQL 和 SQL Server 在统计信息维护中的关键差异
· C++代码改造为UTF-8编码问题的总结
· 【.NET】调用本地 Deepseek 模型
· CSnakes vs Python.NET:高效嵌入与灵活互通的跨语言方案对比
· DeepSeek “源神”启动!「GitHub 热点速览」
· 我与微信审核的“相爱相杀”看个人小程序副业
· Plotly.NET 一个为 .NET 打造的强大开源交互式图表库
2015-10-23 EF架构~充血模型设置不被持久化的属性
2014-10-23 知方可补不足~数据库名称和数据库别名不同了怎么办
2014-10-23 WebApi系列~通过HttpClient来调用Web Api接口~续~实体参数的传递
2014-10-23 WebApi系列~通过HttpClient来调用Web Api接口
2012-10-23 编译器错误~写JS还是谨慎点好
2012-10-23 编译器错误~不能向ObjectStateManager添加相同的键
2012-10-23 编译器错误~System.Data.Objects.DataClasses.EntityObject在未被引用的程序集中定义