首页 > 其他分享 >对比.Net平台下三大日志库:Serilog、log4net和NLog

对比.Net平台下三大日志库:Serilog、log4net和NLog

时间:2024-04-06 20:33:38浏览次数:11  
标签:log4net 结构化 记录 Serilog NLog 日志

原文链接:Serilog, log4net and NLog Comparison: Logging Libraries for .NET Applications (bytehide.com)

译者前言:最近在搭建一套自己用的后端开发的架构,涉及到日志系统的选型,一番检索下找到了这篇文章,还算比较新,翻译过来跟大家分享一下。这篇文章运用了大量的比喻,不知道各位是否喜欢这样的风格。

对比Serilog、log4net和NLog

在开发健壮的.NET应用程序时,你不可避免地需要用到高效且可靠的日志记录框架。你很幸运,有许多选择,但该如何选择呢?让我们深入日志记录库的世界,并比较三个最流行的库:Serilog、log4net和NLog

介绍

看起来日志记录通常是事后才想到的,对吗?当你尝试调试那段无法正常运行的顽固代码时,谁有时间来组织日志。但相信我,拥有一个可靠的日志系统可以让你在以后避免大量令人头疼的挫败感。那么,为什么不花一些时间了解你的选择呢?

日志记录库概览

在.NET领域,有三个主要的日志记录库:Serilog、log4net和NLog。每个都有其独特的特色和一套特殊的功能。所以,各位,做好准备,让我们一起快速穿越.NET日志记录的狂野西部。

Serilog

让我们更深入地了解 Serilog。我们将发现更多功能,解释 Serilog 如何从同类产品中脱颖而出,并探索如何在实际场景中最好地应用其功能。

.NET中的Serilog是什么

从名称上看,你可能会认为它只是关于“日志记录”——开发人员在程序执行期间记录的消息,以了解其流程。但是 Serilog 的功能远不止表面上看到的那么简单。它不仅通过“结构化日志记录”将日志记录提升到一个新的水平,而且还简化了日志事件,使其易于查询。

// 使用 Serilog
Log.Logger = new LoggerConfiguration()
    .WriteTo.Console()
    .CreateLogger();

Log.Information("Hello, Serilog!"); 

// 创建结构化日志数据
Log.Information("Order {OrderId} created for {CustomerId}", orderId, customerId);

在上面的示例中,我们不仅仅记录简单的字符串消息。 Serilog 允许我们创建更复杂的日志条目,将特定数据与每个日志条目相关联。突然间,我们的日志不再只是书面记录,它们是“结构化的”!

想象一下,你正在记笔记,但你拥有的不是一块文本,而是“OrderId”和“CustomerId”等特定字段。现在,这不是让以后引用你的笔记变得更容易吗?

从功能上了解Serilog

如果你还在这里,那意味着你不只是在逗我玩;你真的对Serilog感兴趣。你准备好迈向下一个级别了吗?准备好了吗?我们将要深入探讨"Serilog结构化"的"黑洞"!

// Serilog 结构化数据
Log.Information("Processing {@Order}", order);

在此示例中,我们在 Order 对象前面使用“@”符号。这意味着 Serilog 将解构“order”对象并记录该对象的公共属性。让我们进一步分解:

假设你有一个复杂的对象(我们称之为“订单”),它具有许多属性,例如“OrderId”、“OrderName”、“OrderStatus”等。现在,当你记录这个对象时,按照惯例,你会得到该对象的类型名称,对吧?不太有帮助,是吧?

这就是“@”运算符来拯救你的地方。它告诉 Serilog:“嘿,不要只告诉我类型名称!解构它并记录属性。我全都要!”

// 带有公共属性的Order类
public class Order
{
    public int OrderId { get; set; }
    public string OrderName { get; set; }
    public string OrderStatus { get; set; }
}

// 创建Order类的实例
Order order = new Order { OrderId = 1001, OrderName = "New Laptop", OrderStatus = "Processing" };

// Using Serilog 结构化数据
Log.Information("Processing {@Order}", order);

猜猜输出会是什么?它不会记录“order”的类型名称,而是记录“order”对象的属性值。想象一下能够轻松引用所有详细信息而不仅仅是类型名称!

Serilog的优势

好吧,你已经忍受了我喋喋不休地谈论“Serilog”、“结构化日志记录”和“解构”。现在,让我们来了解一下在我们的应用程序中使用这个出色的日志库的优势。

具有显着优势的功能

  • 结构化日志记录:这就像赋予日志超能力一样。让一切结构化和组织化使得查询日志不再是梦想。
  • 丰富的输出支持:将日志记录到控制台或文件似乎有点老派,对吧?Serilog通过支持广泛的输出(目标)来带来现代化,包括几个流行的数据库、日志管理系统,甚至是基于云的日志服务。
  • 配置选项:无论是通过配置文件还是以编程方式,Serilog 都可以让你根据自己的喜好设置日志记录器。

Serilog 的实际应用

即使是小丑也会同意,在管理现实应用程序中的日志时,我们心爱的 Serilog 并不是开玩笑。如果你运行着多个相互通信的服务,那么关联所有这些服务的日志可能比你最糟糕的宿醉更令人头痛。

Serilog登场!使用结构化日志记录,你可以轻松记录请求 ID 甚至用户名。因此,即使在复杂的分布式系统中,调试也变得轻而易举。

想象一下:你正在经营一家在线商店。每次订单到来时,不同的服务都会处理不同的方面。如果你想了解特定订单的流程,Serilog 的结构化日志记录是你最好的朋友。存储“OrderId”并像侦探跟踪线索一样追踪它。

Serilog的缺点

每一枚硬币都有两个面,Serilog 也不例外。

  • 它需要 .NET 4.5 或更高版本,因此如果你使用旧的 .NET 版本,这可能不适合你。
  • 如果你的日志记录需求很简单并且你正在处理纯文本日志记录,那么使用 Serilog 可能就像聘请火箭科学家来辅导幼儿园小朋友一样。

log4net

我们的日志记录之旅第二天,今天重点介绍的是log4net。即使你是新手,你都很有可能在某处听到过有人提到log4net。所以让我们打开这个包裹,探索log4net的复古魅力。

.NET中的log4net是什么

Log4net 是一位经验丰富的老手,已经为 .NET 社区服务十多年了。它是对 Java 中著名的 log4j 库的改编。 log4net 的声誉是当之无愧的,它提供了无与伦比的灵活性!

// 使用 log4net
var log = LogManager.GetLogger(typeof(MyClass));
log.Info("Hello, log4net!");

// 支持不同等级的日志记录
log.Debug("Debugging");
log.Error("Something went wrong!");

在上述案例中,log4net提供了从信息到错误的不同日志记录级别

它如何根据你的要求扭曲和塑造自己,这不是很棒吗?让我想起了我最喜欢的瑜伽士!

了解 log4net 的工作原理

log4net的强大之处在于其XML配置文件。它为你提供了对log4net操作的完全控制。需要在一切进行中改变你的日志记录策略吗?你可以像在开阔的高速公路上换车道一样迅速完成这个操作!

<log4net>
  <root>
    <level value="DEBUG" />
    <appender-ref ref="consoleAppender" />
  </root>
  <appender name="consoleAppender" type="log4net.Appender.ConsoleAppender">
    <layout type="log4net.Layout.PatternLayout">
      <conversionPattern value="%date [%thread] %-5level %logger - %message%newline" />
    </layout>
  </appender>
</log4net>

在这个XML配置中,我们指示log4net将DEBUG级别及以上的日志记录到控制台上。conversionPattern是你控制输出日志消息格式的地方。就像你最喜欢的冰淇淋店一样,随心所欲地搭配,满足你的味蕾!

使用 log4net 的优点

log4net 悄悄地提供了所有访问权限来控制你的日志记录风格,这可以说是它最吸引人的属性。让我们看看它还能提供什么。

log4net的特点

  • 灵活性: log4net适用于多种情况。将日志写入文本文件?轻而易举。直接将日志记录到数据存储中?小菜一碟。同时搞定它们?为什么不呢!随心所欲,随你所愿!
<appender name="RollingFile" type="log4net.Appender.RollingFileAppender">
    <file value="myapp-log.txt" />
    <rollingStyle value="Size" />
    <maximumFileSize value="10MB" />
    <staticLogFileName value="true" />
</appender>
<appender name="AdoNetAppender" type="log4net.Appender.AdoNetAppender">
    <connectionType value="System.Data.SqlClient.SqlConnection, System.Data" />
    <connectionString value="data source=[datasource];initial catalog=[database];integrated security=false;" />
    //...Other settings omitted for brevity
</appender>

通过两个简单的附加标签,我们可以将数据同时记录到文件和数据库中。这就是我所说的一石二鸟!

  • 成熟和稳定:存在一段时间的优点在于,更少的错误,广泛的接受度以及庞大的社区支持,这只是其中的几个优点。

log4net的成功实施

随着时间的推移,log4net 已在许多实际应用中找到了用武之地。它对定制和适应性的强调使其成为需要对日志记录进行精细控制的系统的流行选择。

还记得我们那位总是上班迟到的好朋友吗?是的,无论你想到谁。 log4net 就像他的闹钟,他可以将其设置为小睡、调暗、调亮、设置为舒缓的鸟鸣声、刺耳的喇叭声或其他任何声音。在我们的例子中,我们可以配置日志的类型、严重性级别以及记录这些日志的位置。

使用log4net的缺点

到目前为止,我们只谈论阳光和彩虹。但是,还记得本叔叔给彼得的建议吗? “拥有权利的同时也被赋予了重大的责任!”。 log4net 也不例外。

  • 缺乏结构化日志记录:与 Serilog 相比,从日志中提取有意义的信息就像大海捞针一样。叹!
  • 配置复杂性:虽然使用 XML 进行配置确实打开了无数机会的大门,但问题是,随着你的需求的展开,配置会变得更加复杂。尝试向 8 岁的孩子解释背包问题,你就会明白了!

因此,在考虑log4net时,永远记住寿司大师的类比。当然,拥有一个自制寿司套装很有趣,但前提是你得知道如何制作寿司。否则,可能会一团糟!

NLog

让我们来谈谈NLog。 NLog 经常被比作 log4net 的近亲和 Serilog 的鲜为人知的竞争对手,它本身就提供了独特的功能组合。在灵活性方面,它与 log4net 有着兄弟般的联系,并且在结构化日志记录方面与 Serilog 一致。所以做好准备!我们将进一步探索是什么让 NLog 成为有价值的竞争者。

什么是NLog

我喜欢把NLog看作是Serilog的精妙之处和log4net的经过验证的本质之间的桥梁。它支持结构化日志记录,同时在日志存储的位置和方式方面保持了高度的适应性。基本上,它兼具了Serilog和log4net的优点。

//初始化 NLog Logger
var logger = NLog.LogManager.GetCurrentClassLogger();
// 记录信息级别消息
logger.Info("Greetings from NLog World!");

上面的示例描述了使用 NLog 创建的记录器实例。 GetCurrentClassLogger 方法确保将记录器实例分配给当前类,然后记录信息日志。

深入探讨 NLog 的功能

NLog 提供了两全其美的功能——结构化日志记录和 XML 驱动的配置——而没有任何傲慢的妥协。

// NLog – 展示结构化日志记录
logger.Info("Just dispatched an order {OrderId} to client {ClientId} ", 1200, "C100");

这几行简单的代码可以记录全面的信息,这些信息相对更容易以后处理。请注意我们如何将唯一的数字 OrderId 和字母数字 ClientId 直接传递到日志消息?嗯,这正是我们所说的结构化日志记录的意思。

使用 NLog 的好处

与同行相比,NLog可能看起来像是一个新手,但它所带来的是新鲜和适应性。

NLog 的主要特点

  • 结构化日志记录:不像 Serilog 那样独特,但它可以在不增加额外开销的情况下完成工作。
  • 灵活性:在可配置性和定义日志输出(文件、控制台、数据库或电子邮件)方面,NLog 与 log4net 一样灵活。
// NLog – 配置多个日志输出目标
var config = new NLog.Config.LoggingConfiguration();

// 日志输出目标 - 文件和控制台
var logfile = new NLog.Targets.FileTarget("logfile") { FileName = "log.txt" };
var logconsole = new NLog.Targets.ConsoleTarget("logconsole");

// 日志记录器与目标的映射规则
config.AddRule(LogLevel.Info, LogLevel.Fatal, logconsole);
config.AddRule(LogLevel.Debug, LogLevel.Fatal, logfile);

// 应用配置
NLog.LogManager.Configuration = config;

给出的代码提供了一个场景,其中 NLog 配置两个日志记录目标,即 logconsolelogfileAddRule 函数是将特定日志级别映射到输出目标的方法。

NLog 实际用途示例

NLog在哪些方面表现出色?对于需要结构化日志记录功能但又不想承担Serilog可能带来的计算负担的项目来说,它是首选。此外,在日志生成量相当高的限流场景下,NLog的性能表现更佳。

NLog 的缺点

虽然 NLog 是一个强有力的竞争者,但它仍然有一些值得改进的领域:

  • 与 log4net 相比还不够成熟;它存在的时间较短。
  • 尽管它具有结构化日志记录,但它并不像 Serilog 那样发展或复杂。因此,如果结构化日志记录是你的首要任务,你可能还想探索 Serilog。

举例来说,想象一下解释你最喜欢的冰淇淋口味。你不会只说“它很甜”。你可能会给出具体的细节——也许它很滑腻,或者它有块状的曲奇面团,或者它让你想起了快乐的夏日。

NLog就像这个描述一样——它不只是说,“记录了一些东西”。它提供了额外的上下文,让你完全理解日志事件。

比较:Serilog、log4net、NLog

你准备好迎接主要活动了吗?三位.NET日志记录领域的重量级冠军即将展开较量。在这一边,我们有结构化日志记录中的好人Serilog。在中间,我们有长者log4net,一个值得信赖的老将选择。最后但同样重要的是,我们有灵活的竞争者NLog。

特性对比

让我们深入了解细节。比较日志记录库可能听起来就像是没有涂抹黄油的土司一样枯燥,但嘿,谁说编程总是充满动感的呢?

首先,你的应用程序是否需要结构化日志记录?如果是的话,Serilog 将成为你最好的朋友。让我们回顾一下为什么说 Serilog 是结构化日志记录的典范:

// Serilog 结构化日志记录
Log.Information("Order {OrderId} created for {CustomerId}", orderId, customerId);

These logs are automatically structured into key-value pairs, making it easy to filter based on specific properties. Let me remind you… This is pure gold when debugging!

这些日志会自动构建为键值对,从而可以轻松根据特定属性进行过滤。这种功能在调试时非常宝贵!

现在,如果你的应用程序并不真正需要结构化日志记录,但你需要的是可配置日志记录,那么 log4net 一直在这样做:

// 使用 log4net
var log = LogManager.GetLogger(typeof(MyClass));
log.Info("Hello, log4net!");

使用 log4net,你可以配置记录内容以及记录位置。

同时,NLog 兼顾了结构化日志记录和高可配置性:

// NLog 结构化日志
logger.Info("Order {OrderId} created for {CustomerId}", orderId, customerId);

就像 Serilog 一样,NLog 支持结构化日志记录,并且像 log4net 一样,它提供了高可配置性。这就是真正的权力平衡。

这里有一个特性比较的示例:

FEATURE(特性) SERILOG LOG4NET NLOG
Structured Logging(结构化日志记录)
High Configurability(高可配置性)
Good Performance(很好的性能)

性能比较

性能就像悄无声息的黑豹,直到它扑过来才被注意到。所有三种日志记录库都提供了可比较的性能。但是当涉及到结构化和高吞吐量日志记录时,Serilog和NLog都比log4net略有优势。

PERFORMANCE ASPECT(性能方面 SERILOG LOG4NET NLOG
Structured Logging Performance(结构化日志记录性能)

标签:log4net,结构化,记录,Serilog,NLog,日志
From: https://www.cnblogs.com/tonwin/p/18117888

相关文章

  • mysqlbinlog历史sql查询和恢复
    Mysql命令:查看binlog文件showbinarylogs;远程拉取binlog日志mysqlbinlog-umaxen-p-h127.0.0--read-from-remote-server--rawmysql-bin.001219>/home/mysql-bin.001218通过sql语句搜索binlog日志记录mysqlbinlog--no-defaults--base64-output=decode-rows......
  • C# NLog 自用配置
    打印到控制台日志保存到NLog目录下每天保存一个文件夹按类名保存日志文件日志内容标注日志等级代码中配置方式varconfig=newNLog.Config.LoggingConfiguration();//定义文件日志目标vartimeLevelClassFileTarget=newNLog.Targets.Fi......
  • NLog使用和日志上传指定服务器
    背景之前使用的log4net进行日志的记录,但是找过相关资料之后发现log4net不支持根据指定的配置将不同类的日志写入到不同的文件中为了后续的运维需要需要将日志上传至上层平台的接口,方便后续的日志查看解决问题将日志进行分类存放,防止日志都在同一个文件中,难以针对性的进行日......
  • Serilog 日志记录库
    Serilog是一个.NET平台上的强大的日志记录库。它提供了丰富的API以及可插拔的日志格式化器和输出器,使得在.NET应用程序中实现可定制化的、可扩展的日志记录变得轻而易举。在本文中,我们将探讨Serilog的一些基础知识、API、配置和示例。基础知识日志级别Serilog支持多......
  • .Net Core微服务 - Serilog+Seq记录日志
    Serilog介绍Serilog是用于.NET应用程序的诊断日志记录库。它易于设置,具有干净的API,并且可以在所有最新的.NET平台上运行。Serilog通过NuGet分发,项目包括一个Seirlog核心项目Seirlog和很多接收器sinks(超过100个),这些接收是通过插件的方式来实现将日志写入到各种终端、文件......
  • 不通过 Host 将 Serilog 转换成 ILogger
    安装SerilogpublicstaticclassLoggerExtension{publicstaticILogger<T>CreateLogger<T>(){varlogPath="log.txt";conststringoutputTemplate="[{Timestamp:yyyy-MM-ddHH:mm:ss}{Level:u3}]{Message:......
  • binlog2sql的安装及使用
    binlog2sql的安装及使用binlog2sql的用途:1)数据快速回滚(闪回)2)主从切换后数据不一致的修复3)从binlog生成标准SQL,带来的衍生功能yum-yinstallepel-releaseyum-yinstallgitpython-pipgitclonehttps://github.com/danfengcao/binlog2sql.git&&cdbinlog......
  • 查看宝塔mysql二进制文件 mysqlbinlog
    mysqlbinlog执行文件位置/www/server/mysql/binmysql-bin二进制日志位置/www/server/data/#/www/server/data/mysql-bin.000060把二进制导出为.sql文件#建议/www/server/data/mysql-bin.000060文件cp到mysqlbinlog文件执行目录并设置权限为www755./mysqlbinlogmysql-......
  • MYSQL 是如何保证binlog 和redo log同时提交的?
    MYSQL一个事务在提交的时候能够保证binlog和redolog是同时提交的,并且能在宕机恢复后保持binlog和redolog的一致性。先来看看什么是redolog和binlog,以及为什么要保持它们的一致性。什么是redolog,binlogredolog是innodb引擎层产生的日志,MYSQL从磁盘读取数据的单位是一......
  • mysqldump+binlog备份脚本
    mysqldump是一种逻辑备份工具,可以对数据库进行全量备份,和binlog增量备份共同使用可以进行数据库备份,基于此写了一个备份的脚本#!/bin/bashall_path="/opt/mysql_bakup/all"#MySQL全量备份目录add_path="/opt/mysql_bakup/add"#MySQL增量备份目录old_all_path="/o......