常见日志库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在大规模日志处理时也有很好的性能表现。
选择哪个库,应考虑项目需求、团队熟悉度以及生态系统的兼容性。

在.NET Core中,`Microsoft.Extensions.Logging`提供了一个基础的日志系统,而`NLog`是一个强大的第三方日志。虽然它们各自独立,但可以结合起来使用。要让`Microsoft.Extensions.Logging.Logger`能够接收`NLog`的`LogEventInfo`,你需要通过所谓的"包装器"(Wrapper)或中间件(Middleware)将两者连接起来。 首先,你需要创建一个适配器,比如一个实现了`ILoggerProvider`接口的类,它可以从NLog的事件源获取`LogEvent`并转换为`LogEntry`(`Microsoft.Extensions.Logging`中使用的日志条目)。以下是一个简单的示例: ```csharp public class NLogToMELAdapter : ILoggerProvider { private readonly NLog.Logger _nLogLogger; public NLogToMELAdapter(NLog.Logger nLogLogger) { _nLogLogger = nLogLogger; } // 其他必要的方法实现,包括CreateLogger和 dispose public IDisposable CreateLogger(string categoryName) { return new NLogToMELLoggerAdapter(_nLogLogger, categoryName); } } public class NLogToMELLoggerAdapter : ILogger { private readonly NLog.Logger _nLogLogger; private readonly string _categoryName; public NLogToMELLoggerAdapter(NLog.Logger nLogLogger, string categoryName) { _nLogLogger = nLogLogger; _categoryName = categoryName; } // 实现 ILogger 接口的方法,如 LogDebug, LogError 等,将 NLog 的 LogEvent 转换为 MEL 的 LogEntry public void Log<TState>(LogLevel logLevel, EventId eventId, TState state, Exception exception, Func<TState, Exception, string> formatter) { var nLogEvent = _nLogLogger.Log(logLevel.ToString(), () => formatter(state, exception)); // 将 NLogEvent 转换为 LogEntry 并提交给 MEL 的日志系统 } } ``` 然后,在应用程序启动时配置`Microsoft.Extensions.DependencyInjection`服务,将`NLogToMELAdapter`注册为日志提供者: ```csharp services.AddSingleton<ILoggerProvider, NLogToMELAdapter>(); ``` 现在,你已经成功地扩展了`Microsoft.Extensions.Logging.Logger`,使其能够处理NLog产生的`LogEventInfo`。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值