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

在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("这是一个信息日志");}
}

也可以设置时间 类型分开

<?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"autoReload="true"throwConfigExceptions="true"internalLogLevel="Off"internalLogFile="C:\temp\internal-nlog.txt"><targets><!-- Trace级别日志,输出到文件 --><target xsi:type="File"name="TraceFile"fileName="${basedir}/logs/${shortdate}_Trace.log"layout="${longdate}|${logger}|${uppercase:${level}}|${message} ${exception}" /><!-- Debug级别日志,输出到文件 --><target xsi:type="File"name="DebugFile"fileName="${basedir}/logs/${shortdate}_Debug.log"layout="${longdate}|${logger}|${uppercase:${level}}|${message} ${exception}" /><!-- Info级别日志,输出到文件 --><target xsi:type="File"name="InfoFile"fileName="${basedir}/logs/${shortdate}_Info.log"layout="${longdate}|${logger}|${uppercase:${level}}|${message} ${exception}" /><!-- Warn级别日志,输出到文件 --><target xsi:type="File"name="WarnFile"fileName="${basedir}/logs/${shortdate}_Warn.log"layout="${longdate}|${logger}|${uppercase:${level}}|${message} ${exception}" /><!-- Error级别日志,输出到文件 --><target xsi:type="File"name="ErrorFile"fileName="${basedir}/logs/${shortdate}_Error.log"layout="${longdate}|${logger}|${uppercase:${level}}|${message} ${exception}" /><!-- Fatal级别日志,输出到文件 --><target xsi:type="File"name="FatalFile"fileName="${basedir}/logs/${shortdate}_Fatal.log"layout="${longdate}|${logger}|${uppercase:${level}}|${message} ${exception}" /></targets><rules><!-- Microsoft.*表示通配符,所有微软日志将被过滤 --><logger name="Microsoft.*" minlevel="Trace"  final="true" /><logger name="*" minlevel="Trace" writeTo="TraceFile" /><logger name="*" minlevel="Debug" writeTo="DebugFile" /><logger name="*" minlevel="Info" writeTo="InfoFile" /><logger name="*" minlevel="Warn" writeTo="WarnFile" /><logger name="*" minlevel="Error" writeTo="ErrorFile" /><logger name="*" minlevel="Fatal" writeTo="FatalFile" /></rules>
</nlog>

另外还可以打印成html格式

<?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"autoReload="true"throwConfigExceptions="true"internalLogLevel="Off"internalLogFile="C:\temp\internal-nlog.txt"><targets><!-- Trace级别日志,输出到html文件 --><target xsi:type="File"name="TraceFile"fileName="${basedir}/logs/${shortdate}_Trace.html"layout="【记录时间】:${longdate} &lt;br&gt;【文名名称】:${logger} &lt;br&gt;【日志级别】:${uppercase:${level}} &lt;br&gt;【日志内容】:${message} ${exception} &lt;hr size=2 color=red&gt;" /></targets><rules><!-- Microsoft.*表示通配符,所有微软日志将被过滤 --><logger name="Microsoft.*" minlevel="Trace"  final="true" /><logger name="*" minlevel="Trace" writeTo="TraceFile" /></rules>
</nlog>

注意事项,将文件包含到项目中后要修改属性可复制
在这里插入图片描述

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.mzph.cn/bicheng/29262.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

springboot整合sentinel接口熔断

背景 请求第三方接口或者慢接口需要增加熔断处理&#xff0c;避免因为慢接口qps过大导致应用大量工作线程陷入阻塞以至于其他正常接口都不可用&#xff0c;最近项目测试环境就因为一个查询的慢接口调用次数过多&#xff0c;导致前端整个首页都无法加载。 依赖下载 springboo…

网络安全(完整)

WAPI鉴别及密钥管理的方式有两种&#xff0c;既基于证书和基于预共享密钥PSK。若采用基于证书的方式&#xff0c;整个国产包括证书鉴别、单播密钥协商与组播密钥通告&#xff1b;若采用预共享密钥方式&#xff0c;整个国产则为单播密钥协商与组播密钥通告蠕虫利用信息系统缺陷&…

React+TS前台项目实战(十)-- 全局常用组件CopyText封装

文章目录 前言CopyText组件1. 功能分析2. 代码详细注释3. 使用方式4. 效果展示 总结 前言 今天这篇主要讲项目常用复制文本组件封装&#xff0c;这个组件是一个用于拷贝文本的 React 组件&#xff0c;它提供了拷贝&#xff0c;国际化和消息提示的功能 CopyText组件 1. 功能分…

每日一题——Python实现PAT甲级1144 The Missing Number(举一反三+思想解读+逐步优化)四千字好文

一个认为一切根源都是“自己不够强”的INTJ 个人主页&#xff1a;用哲学编程-CSDN博客专栏&#xff1a;每日一题——举一反三Python编程学习Python内置函数 Python-3.12.0文档解读 目录 我的写法 时间复杂度分析 空间复杂度分析 总体空间复杂度&#xff1a;O(N) 总结 我…

端口映射工具下载?

天联是一款强大的端口映射工具&#xff0c;它能够帮助用户实现远程数据采集管理、异地统一管理、随时随地协同办公等多种场景的应用。无论您是医药、餐饮、商超等零售行业的企业&#xff0c;还是需要使用OA、CRM、ERP、财务进销存等系统的企业&#xff0c;甚至是使用视频监控设…

适用于世界上最先进的医疗应用的高压电阻器

我们的电阻器专为用于医疗诊断、治疗和预防的各种产品而设计。从小型植入式和非侵入性设备到大型诊断成像设备&#xff0c;医疗制造商之所以选择 EAK电阻器&#xff0c;是因为操作环境是高电压和磁场&#xff0c;准确性和稳定性至关重要。 EAK 专有的精密打印技术生产出非常适…

如何应对 CentOS 的停更?

文章目录 如何应对 CentOS 的停更&#xff1f;Linux发行版CentOS停更后&#xff0c;我们可选的替代品RHEL LinuxRocky Linux公有云 LinuxDebian 系 Linux 如何应对 CentOS 的停更&#xff1f; Linux发行版 Linux内核是开源的&#xff0c;任何人都可以获取源代码&#xff0c;进…

嵌入式开发实验项目【基于Arduino的智能循迹小车】步进电机版本(含完整可执行详细代码)| 另附:测试行进传感器可用性,测试小车轱辘/轮胎是否可用

“真正的光明决不是永没有黑暗的时间,只是永不被黑暗所掩蔽罢了。真正的英雄决不是永没有卑下的情操,只是永不被卑下的情操所屈服罢了。” 🎯作者主页: 追光者♂🔥 🌸个人简介: 💖[1] 计算机专业硕士研究生💖 🌿[2] 2023年城市之星领跑者TOP1(哈尔…

Hi3861 OpenHarmony嵌入式应用入门--启动流程

目录 BootLoader的启动与运行 Hi3861 RiSC-V boot 启动文件介绍 Loaderboot 启动过程 Flashboot代码介绍 printf串口配置 内核启动任务 BootLoader的启动与运行 Hi3861 RiSC-V boot 启动文件介绍 - Hi3861 的引导程序分为两部分&#xff0c;一部分是在芯片出厂时已经固…

Redis-数据结构-跳表详解

Redis概述 Redis-数据结构-跳表详解 跳表&#xff08;Skip List&#xff09;是一种基于并联的链表结构&#xff0c;用于在有序元素序列中快速查找元素的数据结构。 Redis 中广泛使用跳表来实现有序集合&#xff08;Sorted Set&#xff09;这一数据结构。 1.跳表的基本概念和…

【源码】Spring事务之事务失效及原理

Spring事务 1、【源码】SpringBoot事务注册原理 2、【源码】Spring Data JPA原理解析之事务注册原理 3、【源码】Spring Data JPA原理解析之事务执行原理 4、【源码】SpringBoot编程式事务使用及执行原理 5、【源码】Spring事务之传播特性的详解 6、【源码】Spring事务之…

搜索与人工智能相结合如何解决企业数据问题?

作者&#xff1a;来自 Elastic Fermi Fang 企业数据是好处还是负担&#xff1f; 组织正被数据淹没 —— 从安全事件日志和应用程序错误消息到物联网指标和帮助中心常见问题解答。这些丰富的信息通常存在于孤立的孤岛中&#xff0c;在整合这些信息以提升客户体验、提高运营弹性…

thinkphp5使用模型删除与复杂查询EXP

模型删除 应用软删除 表中需要有字段&#xff0c;deletetime 模型中使用下面方法 use SoftDelete;protected $deleteTime delete_time;真实删除 // 软删除 User::destroy(1); // 真实删除 User::destroy(1,true); $user User::get(1); // 软删除 $user->delete(); // 真…

js 实现将后端请求来的 Blob 数据保存到用户选择的任意目录

js实现将后端请求来的 Blob 数据保存到用户选择的任意目录 实现方式 实现方式 实现方式是使用 window 的 showSaveFilePicker 方法。Window 接口的 showSaveFilePicker() 方法用于显示一个文件选择器&#xff0c;以允许用户保存一个文件。可以选择一个已有文件覆盖保存&#xf…

基于Java+Swing贪吃蛇小游戏(含课程报告)

博主介绍&#xff1a; 大家好&#xff0c;本人精通Java、Python、C#、C、C编程语言&#xff0c;同时也熟练掌握微信小程序、Php和Android等技术&#xff0c;能够为大家提供全方位的技术支持和交流。 我有丰富的成品Java、Python、C#毕设项目经验&#xff0c;能够为学生提供各类…

兼容MacOS和FreeBSD软件包的开源ravynOS操作系统

ravynOS 是一个新型的操作系统项目&#xff0c;致力于在 x86-64&#xff08;终极目标是同时实现 ARM&#xff09;平台上提供与 macOS 类似的体验和兼容性。它基于坚若磐石的 FreeBSD、现有的开源代码和锦上添花的新代码构建。 主要设计目标&#xff1a; 与 macOS 应用程序的源…

语音质量评价方法之MOS

引言 在语音增强、语音合成、语音转换、声音转换、语音克隆、语音修复等等领域&#xff0c;常常要对输出的语音进行评价。对语音的质量评价一般关注两个方面&#xff0c;即主观评价和客观评价。主观评价就是人凭借听觉感受对语音进行打分&#xff0c;客观评价比较广泛&#xf…

学生成绩评分 - Scala

文章目录 一、第1关&#xff1a;对学生成绩进行评分 一、第1关&#xff1a;对学生成绩进行评分 实训目标 掌握 Scala 中运算符嵌套的使用 了解 if-else if-else 语句的使用 实训分析 利用条件运算符的嵌套来完成此题&#xff1a;学习成绩 150 - 90 分的同学成绩评分为&#…

【JVM结构、JVM参数、JVM垃圾回收】

JVM&#xff1a;Java Virtual Machine java虚拟机 虚拟机&#xff1a;使用软件技术模拟出与具有完整硬件系统功能、运行在一个隔离环境中的计算机系统。 JVM官方文档&#xff1a;https://docs.oracle.com/javase/specs/jvms/se8/html/index.html java 一些命令 javac 将文件编…

常用算法及参考算法 (1)累加 (2)累乘 (3)素数 (4)最大公约数 (5)最值问题 (6)迭代法

常用算法及参考算法 &#xff08;1&#xff09;累加 &#xff08;2&#xff09;累乘 &#xff08;3&#xff09;素数 &#xff08;4&#xff09;最大公约数 &#xff08;5&#xff09;最值问题 &#xff08;6&#xff09;迭代法 1. 累加 #include <stdio.h>int main() {…