在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} <br>【文名名称】:${logger} <br>【日志级别】:${uppercase:${level}} <br>【日志内容】:${message} ${exception} <hr size=2 color=red>" /></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在大规模日志处理时也有很好的性能表现。
选择哪个库,应考虑项目需求、团队熟悉度以及生态系统的兼容性。