首页 > 其他分享 >开源高性能结构化日志模块NanoLog

开源高性能结构化日志模块NanoLog

时间:2024-06-11 10:55:50浏览次数:11  
标签:结构化 log 开源 NanoLog 日志 ns Log

  最近在写数据库程序,需要一个高性能的结构化日志记录组件,简单研究了一下Microsoft.Extensions.Logging和Serilog,还是决定重造一个轮子。

一、使用方法

  直接参考以下示例代码:

NanoLogger.Start();

DateTime? nullable = null;
const bool boolValue = true;
const char charValue = 'C';
const int intValue1 = 12345;
const int intValue2 = 0xABCDEF;
const string stringValue = "你好世界";
var point = new Point { X = 123, Y = 456 };
var person = new Person { Name = "Rick", Birthday = new DateTime(1977, 3, 1), Phone = "13861838709" };

var log = new NanoLogger();

log.Trace("Trace message");
log.Trace($"Trace {DateTime.Now}, {intValue1}, 0x{intValue2:X}");
log.Debug($"Debug {DateTime.Now:yyyy-MM-dd hh:mm:ss}, 你好世界!");
log.Info($"Info {point}, {person}, {charValue}");
log.Warn($"这是警告: {boolValue}");
log.Error($"发生异常: {nullable}, Msg={stringValue}");

NanoLogger.Stop();

执行后控制台输出如下图(记录的结构化值会高亮显示):

二、性能测试

  以下测试仅用一个日期类型参数: nanoLogger.Info($"Hello World {now}");

Method Mean Error StdDev Ratio Lock Contentions Allocated Alloc Ratio
NanoLog 154.6 ns 0.91 ns 3.48 ns 0.04 - - 0.00
MsLog 3,922.2 ns 49.13 ns 202.60 ns 1.00 0.0004 264 B 1.00
MsLogCodeGen 4,079.3 ns 52.49 ns 218.77 ns 1.04 0.0010 208 B 0.79
  • NanoLog 本组件控制台输出
  • MsLog Microsoft.Extensions.Logging控制台输出
  • MsLogCodeGen 使用[LoggerMessageAttribute]代码生成方式

三、实现原理


+-----Logger Threads-----+                               +-----Background Thread----+
|                        |                               |                          |
|   logger.Info(xxx)     |                               |    ConsoleLogger.Log()   |
|                        |      +-----Log Queue---+      |                          |
|   logger.Debug(xxx)    |  ==> |-Log-|-Log-|-...-| ==>  |    FileLogger.Log()      |
|                        |      +-----------------+      |                          |
|   logger.Warn(xxx)     |                               |    OtherLogger.Log()     |
|                        |                               |                          |
+------------------------+                               +--------------------------+
  • 日志记录时先判断对应的日志级别是否启用,不启用直接忽略。这里使用C# 6的InterpolatedStringHandlerAttribute自定义实现LogMessageBuilder,一方面避免值类型的装箱,另一方面可以记录结构化信息(名称、类型、值、格式化);

  • 启用则将日志消息、对应的属性类型及属性值序列化后写入LogMessage内。这里的序列化非常简单,仅相当于一个内存复制(参考下图)。LogMessage是一个结构体,如果序列化后的数据小于阀值则直接存储在内置的缓冲块内(没有Heap内存分配的问题),否则从ArrayPool内租用一个缓冲块存储超出部分;

+--------------------LogMessage 缓冲块-----------------------+
|-TokenType-|---Value---|-TokenType-|--------Value------|---|
|  Literal  | 5,"Hello" |   Int     | "name",12345,"X2" |   |
+-----------------------------------------------------------+
  • 序列化后的事件信息(LogEvent)及消息数据(LogMessage)直接加入一个多生产者-单消费者的消息队列,至此前端日志记录过程结束,不阻塞后续代码执行;

  • 后台线程循环从队列取出待处理日志,由配置的ILogger实现处理。例如ConsoleLogger格式化后输出至控制台;FileLogger将数据写入文件存储。

四、日志搜索

  结构化日志当然得支持结构化搜索,参考控制台工程NanoLog.File.Viewer使用Roslyn解析字符串表达式编译后过滤日志记录(参考下图):

  • 表达式中e.XXX对应LogEvent的相关属性条件;
  • 表达式中e["xxx"]["yyy"]对应LogMessage结构化记录的值条件。

五、本文小结

  最后GitHub地址:https://github.com/enjoycode/NanoLog.git, 作者个人能力实在有限Bug在所难免,如有问题请邮件联系或Github Issue,欢迎感兴趣的小伙伴们加入共同完善,当然更欢迎赞助项目或给作者介绍工作(目前找工作中)。

标签:结构化,log,开源,NanoLog,日志,ns,Log
From: https://www.cnblogs.com/BaiCai/p/18241681

相关文章

  • 奇怪!应用的日志呢??
    1.问题回顾  问题背景是在进行中台应用中间件迁移过程中,发现存在项目启动失败或者项目正常启动(jsf正常挂载并正常运行,mq正常发送和消费)但是无任何日志打印现象。更奇怪的是不打印日志竟然是偶发的,在测试环境中多次部署都未出现项目启动但无日志打印情况,而且玄学的是生产......
  • 高效处理海量慢SQL日志文件:Java与JSQLParser去重方案详解
    在大数据处理环境下,慢SQL日志优化是一个必要的步骤,尤其当日志文件达到数GB时,直接操作日志文件会带来诸多不便。本文将介绍如何通过Java和JSQLParser库来解析和去重慢SQL日志,以提高性能和可维护性。背景公司生产环境中,某些操作产生的SQL执行时间较长,会记录在慢SQL日志文件......
  • C#开发的目录图标更改器 - 开源研究系列文章 - 个人小作品
          因为有一些项目保存在文件夹里,然后想着用不同的图标来显示该文件夹,但是Windows提供的那个修改文件夹的操作太麻烦,需要的操作太多(文件夹里鼠标右键,属性,自定义,更改图标,选择文件,选择图标,点击确定),于是就想自己用C#开发一个目录图标管理器,能够快速的将文件夹图标更改为自......
  • 开源工业物联网网关 v2.1.1发布
    变量维护增加只写(WriteOnly)类型缓存最近3次原值,可以用raw、$pv、$ppv获取,配合表达式灵活进行计算增加触发字段,用于上升沿等监控触发采集和上传驱动增加西门子plc中文字符串的读写完善modbus协议连读增加modbus协议double类型解析修正modbus浮点类型数值写入modb......
  • 手机上玩 PC 游戏的开源项目「GitHub 热点速览」
    上周国产3A大作《黑神话:悟空》开启预售,同时公布游戏将于北京时间2024.8.20正式上线。这是一款由「游戏科学」开发的西游题材单机·动作·角色扮演游戏,它采用「虚幻引擎5」制作。该引擎并不是完全开源的,但它提供了部分源代码的访问权限。具体来说,就是GitHub账号必须先关联E......
  • 分享几个嵌入式相关的高星开源项目
    目录1前言2开源嵌入式项目举例2.1Avem2.2Awesome-Embedded2.3soft-and-hard《软硬结合——从零打造物联网》2.4机械臂2.5焊台2.6智能锁2.7智能电表2.8智能家居3嵌入式相关学习交流网站1前言(1)快速提高嵌入式技术的方法就是完成实际项目中一个或几个......
  • 情景题之小明的Linux实习之旅:linux实战练习1(上)【基础命令,权限修改,日志查询,进程管理...
    小明的Linux实习之旅:基础指令练习情景练习题背景介绍场景1:初识Linux,创建目录和文件场景2:权限管理,小明的权限困惑场景3:打包与解压,小明的备份操作场景4:使用Grep,小明的搜索技能场景5:系统服务管理,小明的首次接触场景6:进程管理,小明的多任务处理场景7:定时任务与系统状态场景8:d......
  • 阿里通义千问 Qwen2 大模型开源发布
    阿里通义千问Qwen2大模型开源发布Qwen2系列模型是Qwen1.5系列模型的重大升级。该系列包括了五个不同尺寸的预训练和指令微调模型:Qwen2-0.5B、Qwen2-1.5B、Qwen2-7B、Qwen2-57B-A14B以及Qwen2-72B。在中文和英文的基础上,Qwen2系列的训练数据中还增加了其他27种语......
  • K8S部署ECK采集日志
    1.部署nfs1.安装nfs#所有节点安装yuminstall-ynfs-utils在master节点创建nfs共享目录mkdir-pv/data/kubernetes编写配置文件cat>/etc/exports<<'EOF'/data/kubernetes*(rw,no_root_squash)EOFmaster节点启动nfssystemctlenable--nowrpcbindnfs2.使用......
  • MySQL bin-log日志恢复数据
    目录一、开启二进制日志二、检查二进制日志是否开启三、使用二进制日志备份和恢复使用二进制日志备份恢复前先创建备份:应用二进制日志:扩展用法:四、常见命令和操作五.使用 mysqlbinlog 工具查看二进制日志1.查看二进制日志的内容2.解码二进制日志并将内容保存到......