常见日志库NLog、log4net、Serilog和Microsoft.Extensions.Logging介绍和区别

news/2024/11/15 8:33:42/

在C#中,日志库的选择主要取决于项目的具体需求,包括性能、易用性、可扩展性等因素。以下是关于NLog、log4net、Serilog和Microsoft.Extensions.Logging的基本介绍和使用示例。
包含如何配置输出日志到当前目录下的log.txt文件及控制台的示例,以及输出到sqlite数据库

NLog

简介: NLog是一个灵活且易于使用的.NET日志记录库,支持多种输出目标(如文件、数据库、控制台等)和丰富的配置选项。

使用示例:

安装NLog NuGet包。
配置NLog.config文件。

<?xml version="1.0" encoding="utf-8" ?>
<nlog xmlns="http://www.nlog-project.org/schemas/NLog.xsd"xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"><targets><target name="file" xsi:type="File" fileName="${basedir}/log.txt" /><target name="sqlite" xsi:type="Database"connectionString="Data Source=log.db;Mode=ReadWriteCreate;"commandText="INSERT INTO Log (TimeStamp, Level, Message) VALUES (@time_stamp, @level, @message)"><parameter name="@time_stamp" layout="${date:universalTime=true:format=yyyy-MM-dd HH\:mm\:ss.fff}" /><parameter name="@level" layout="${level}" /><parameter name="@message" layout="${message}" /></target><target name="console" xsi:type="Console" /></targets><rules><logger name="*" minLevel="Info" writeTo="file,sqlite,console" /></rules>
</nlog>
using NLog;class Program
{private static Logger logger = LogManager.GetCurrentClassLogger();static void Main(string[] args){logger.Info("这是一个信息日志");}
}

log4net

简介: log4net是另一个流行的日志库,源于Apache的log4j项目,支持多种日志级别、多种输出目的地和灵活的配置。

使用示例:

安装log4net NuGet包。
配置log4net配置节。
配置 (在App.config或Web.config内):

<log4net><!-- FileAppender和ConsoleAppender配置 --><appender name="FileAppender" type="log4net.Appender.FileAppender"><file value="log.txt" /><layout type="log4net.Layout.PatternLayout"><conversionPattern value="%date [%thread] %-5level %logger - %message%newline" /></layout></appender><appender name="ConsoleAppender" type="log4net.Appender.ConsoleAppender"><layout type="log4net.Layout.PatternLayout"><conversionPattern value="%date{ABSOLUTE} %level %logger - %message%newline" /></layout></appender><!-- SQLite Appender 配置示例 --><appender name="SQLiteAppender" type="log4net.Appender.AdoNetAppender"><bufferSize value="1" /><connectionType value="Microsoft.Data.Sqlite.SqliteConnection, Microsoft.Data.Sqlite" /><connectionString value="Data Source=log.db;Mode=ReadWriteCreate;" /><commandText value="INSERT INTO Log (TimeStamp, Level, Message) VALUES (@log_date, @log_level, @message)" /><parameter><parameterName value="@log_date" /><dbType value="DateTime" /><layout type="log4net.Layout.RawTimeStampLayout" /></parameter><parameter><parameterName value="@log_level" /><dbType value="String" /><size value="50" /><layout type="log4net.Layout.PatternLayout"><conversionPattern value="%p" /></layout></parameter><parameter><parameterName value="@message" /><dbType value="String" /><size value="255" /><layout type="log4net.Layout.PatternLayout"><conversionPattern value="%m" /></layout></parameter></appender><!-- 添加SQLiteAppender到root --><root><level value="INFO" /><appender-ref ref="FileAppender" /><appender-ref ref="ConsoleAppender" /><!-- 现有Appender参照 --><appender-ref ref="SQLiteAppender" /></root>
</log4net>

初始化并使用。

using log4net;
using log4net.Config;class Program
{private static readonly ILog log = LogManager.GetLogger(typeof(Program));static Program(){XmlConfigurator.Configure();}static void Main(string[] args){log.Info("这是一个信息日志");}
}

Serilog

简介: Serilog专注于结构化日志记录,特别适合现代应用,尤其是那些需要高效分析和搜索日志的应用。

使用示例:

安装Serilog及相应的sink包(如Serilog.Sinks.Console)。
配置Serilog。

using Serilog;class Program
{static void Main(string[] args){Log.Logger = new LoggerConfiguration().WriteTo.Console().CreateLogger();Log.Information("这是一个信息日志");}
}

Microsoft.Extensions.Logging

简介: 这是.NET Core及更高版本中提供的日志框架抽象层,不直接提供日志实现,但易于与其他日志库集成,如Serilog、NLog、log4net等。

使用示例:

安装Microsoft.Extensions.Logging NuGet包及具体日志库的Provider(如Serilog.AspNetCore)。
配置依赖注入。

using Microsoft.Extensions.DependencyInjection;
using Microsoft.Extensions.Logging;
using Serilog;class Program
{static void Main(string[] args){Log.Logger = new LoggerConfiguration().WriteTo.Console().CreateLogger();using var serviceScope = new ServiceCollection().AddLogging(loggingBuilder => loggingBuilder.AddSerilog(Log.Logger)).BuildServiceProvider().CreateScope();var logger = serviceScope.ServiceProvider.GetService<ILogger<Program>>();logger.LogInformation("这是一个信息日志");}
}

区别:

配置灵活性: NLog和log4net都支持详细的XML配置文件,适合复杂的日志策略。Serilog则通过代码配置,更加灵活,特别适合动态配置。Microsoft.Extensions.Logging作为一个抽象层,配置灵活性取决于所集成的具体日志库。
日志格式: Serilog强调结构化日志,便于机器解析和分析。其他库也支持结构化日志,但Serilog在这方面更为强大。
集成性: Microsoft.Extensions.Logging作为.NET Core推荐的日志抽象,易于与其他框架和服务集成,特别是ASP.NET Core应用。
性能: 性能差异可能因具体使用场景而异,但一般来说,Serilog在结构化日志输出时表现较好,而NLog和log4net在大规模日志处理时也有很好的性能表现。
选择哪个库,应考虑项目需求、团队熟悉度以及生态系统的兼容性。


http://www.ppmy.cn/news/1468878.html

相关文章

LCD电子广告牌课程设计

概述 1.1课程设计简介 亮丽实用的广告牌可以给我们的生活添加光彩、可以给店铺招揽生意。传统的广告牌都是固定的汉字&#xff0c;并且时间长了会掉色&#xff0c;使汉字模糊难认&#xff0c;这就给我的生活带来很多的不便。尤其到了晚上传统广告牌就会失去其该有的作用。所以在…

[whl]树莓派armv7l文件onnxruntime的whl所有下载地址汇总

下面onnxruntime所有版本都是树莓派armv7l平台的whl文件&#xff0c;不能用于windows,macOS或者ubuntu x86_64的系统&#xff0c;请认准文件名及其对应python版本下载。 onnxruntime版本下载地址onnxruntime-1.16.0-cp311-cp311-linux_armv7l.whl点我下载onnxruntime-1.16.0-c…

让指定的电脑软件开机时候自动且来(自启动)的解决方案

想让一些电脑软件开机自启动 (懒得手点)&#xff0c;或者项目有开始自启动需求&#xff0c;你就这么整就行&#xff1a; 按键盘Win R&#xff0c;启动运行窗口&#xff0c;然后粘贴下面的代码&#xff0c;按回车&#xff1a; shell:startup然后把你想启动的软件快捷方式往里…

wireshark使用情况与网口调试记录

wireshark使用情况与网口调试记录 前言wireshark无法获取本地数据方法一——Npcap方法二——WinPcap效果 UDP组播&#xff0c;却一直捕获到127.0.0.1总结 前言 在网口调试中&#xff0c;wireshark使用较多&#xff0c;常出现一些无法捕获或者ip获取数据不正确的情况&#xff0…

React hooks动态配置侧边栏

React hooks根据不同需求 还有不同的角色 动态的去配置侧边栏 需求&#xff1a; 点击某个按钮是一套侧边栏 &#xff0c;不同角色&#xff08;比如管理员之类的权限高一点&#xff09;比普通用户多个侧边栏 然后点击另一个按钮是另一套侧边栏 此时&#xff0c;就需要动态的去…

频率域,空间域以及频率域和空间域如何获取

文章目录 频率域频率域的关键概念&#xff1a;频率域的应用&#xff1a; 空间域空间域特征的含义&#xff1a;空间域操作的常见技术&#xff1a;与频率域的对比&#xff1a; 如何获取空间域&#xff0c;频率域空间域特征&#xff1a;频率域特征&#xff1a; 频率域 频率域&…

如何提高网站收录?

GSI服务就是专门干这个的&#xff0c;这个服务用的是光算科技自己研发的GPC爬虫池系统。这个系统通过建立一个庞大的站群和复杂的链接结构&#xff0c;来吸引谷歌的爬虫。这样一来&#xff0c;你的网站就能更频繁地被谷歌的爬虫访问&#xff0c;从而提高被收录的机会。 说到效…

vue+element el-select动态加减框数量及验证下拉框选项动态置灰(选中行的下拉框换个值后,原值没办法监控这个问题也解决了)

1效果: 2部分主要(HTML): 1:这个位置主要就是看看方法什么的吧,还有大概的结构 2:change"sort_Change(item,tablelists.orderbyList)这两个参数(都有大用): (1)item:代表每次你操作的这个数据 (2)tablelists.orderbyList:代表你这一共有几行数据(上边这个例子就会得到一个…