log4net 是一个高效、灵活且广泛使用的日志记录库,专门用于 .NET 框架。它是 Apache 的一个开源项目Apache log4j框架在Microsoft .NET平台的实现。log4net 旨在提供一个简单、易用但功能强大的日志系统。本文主要介绍.NET 7 中配置使用log4net,以及相关示例代码。
1、安装引用log4net
使用log4net需要安装引用log4net
,若是 ASP.NET Core 项目,则需要安装 Microsoft.Extensions.Logging.Log4Net.AspNetCore
。
1)log4net
在Nuget管理程序中,搜索 "log4net",然后点击安装。
2)Microsoft.Extensions.Logging.Log4Net.AspNetCore
在Nuget管理程序中,搜索 "Microsoft.Extensions.Logging.Log4Net.AspNetCore",然后点击安装。
2、log4net 配置文件
log4net 中配置文件可以使用XML格式的, 具体如下,
1)配置说明
配置项 | 类型 | 描述 |
rollingAppender | log4net.Appender.RollingFileAppender | 滚动文件记录器, 用于将日志写入文件。 |
file | String | 日志文件的路径和名称。 |
appendToFile | Boolean | 是否追加内容到现有文件。 |
lockingModel | log4net.Appender.FileAppender+MinimalLock | 文件锁定模型, 用于多线程环境。 |
rollingStyle | Composite | 滚动文件的样式, 如按大小或日期。 |
datePattern | String | 备份文件的日期格式。 |
maxSizeRollBackups | Int | 最大备份文件数量。 |
maximumFileSize | String | 单个文件的最大大小。 |
staticLogFileName | Boolean | 是否使用静态日志文件名。 |
filter | log4net.Filter.LevelRangeFilter | 日志级别范围过滤器。 |
layout | log4net.Layout.PatternLayout | 日志的布局格式。 |
AdoNetAppender_SqlServer | log4net.Appender.AdoNetAppender | 用于将日志写入SQL Server的记录器。 |
bufferSize | Int | 缓冲区大小, 控制写入数据库的频率。 |
connectionType | String | 数据库连接的类型。 |
connectionString | String | 数据库连接字符串。 |
commandText | String | 写入数据库的SQL命令文本。 |
priority | String | 根记录器的优先级。 |
level | String | 根记录器的日志级别。 |
appender-ref | String | 引用的记录器名称。 |
2)Appender
类型 | 描述 |
log4net.Appender.AdoNetAppender | 使用准备好的语句或存储过程将日志记录事件写入数据库。 |
log4net.Appender.AnsiColorTerminalAppender | 将颜色突出显示的日志事件写入 ANSI 终端窗口。 |
log4net.Appender.AspNetTraceAppender | 将日志记录事件写入 ASP 跟踪上下文。 然后可以在 ASP 页的末尾或在 ASP 跟踪页上呈现这些。 |
log4net.Appender.BufferingForwardingAppender | 在将事件转发给子附加程序之前缓冲记录事件。 |
log4net.Appender.ColoredConsoleAppender | 将日志记录事件写入应用程序的控制台。 事件可能会进入标准我们的流或标准错误流。 事件可能具有为每个级别定义的可配置文本和背景颜色。 |
log4net.Appender.ConsoleAppender | 将日志记录事件写入应用程序的控制台。 事件可能会进入标准我们的流或标准错误流。 |
log4net.Appender.DebugAppender | 将日志事件写入 .NET 系统。 |
log4net.Appender.EventLogAppender | 将日志记录事件写入 Windows 事件日志。 |
log4net.Appender.FileAppender | 将日志记录事件写入文件系统中的文件。 |
log4net.Appender.ForwardingAppender | 将日志记录事件转发给子附加程序。 |
log4net.Appender.LocalSyslogAppender | 将日志记录事件写入本地 syslog 服务(仅限 UNIX)。 |
log4net.Appender.MemoryAppender | 将日志记录事件存储在内存缓冲区中。 |
log4net.Appender.NetSendAppender | 将日志事件写入 Windows Messenger 服务。 这些消息显示在用户终端的对话框中。 |
log4net.Appender.OutputDebugStringAppender | 将日志记录事件写入调试器。如果应用程序没有调试器, 系统调试器会显示该字符串。 如果应用程序没有调试器并且系统调试器未激活, 则忽略该消息。 |
log4net.Appender.RemoteSyslogAppender | 使用 UDP 网络将日志记录事件写入远程系统日志服务。 |
log4net.Appender.RemotingAppender | 使用 .NET 远程处理将日志记录事件写入远程接收器。 |
log4net.Appender.RollingFileAppender | 将日志记录事件写入文件系统中的文件。 RollingFileAppender 可以配置为根据日期 或文件大小限制记录到多个文件。 |
log4net.Appender.SmtpAppender | 将日志记录事件发送到电子邮件地址。 |
log4net.Appender.SmtpPickupDirAppender | 将 SMTP 消息作为文件写入拾取目录。 然后可以通过 SMTP 代理 (例如 IIS SMTP 代理)读取和发送这些文件。 |
log4net.Appender.TelnetAppender | 客户端通过 Telnet 连接以接收日志记录事件。 |
log4net.Appender.TraceAppender | 将日志记录事件写入 .NET 跟踪系统。 |
log4net.Appender.UdpAppender | 使用 UdpClient 将日志事件作为 无连接 UDP 数据报发送到远程主机或多播组。 |
3)log4net.Appender.RollingFileAppender
<?xml version="1.0" encoding="utf-8"?>
<log4net><appender name="rollingAppender" type="log4net.Appender.RollingFileAppender"><file value="log4\app.log" /><appendToFile value="true" /><lockingModel type="log4net.Appender.FileAppender+MinimalLock" /><!-- 可以为:Once|Size|Date|Composite --><!-- Composite为Size和Date的组合 --><rollingStyle value="Composite" /><!-- 当备份文件时,为文件名加的后缀 --><datePattern value="yyyyMMdd.TXT" /><!-- 日志最大个数,都是最新的 --><!-- rollingStyle节点为Size时,只能有value个日志 --><!-- rollingStyle节点为Composite时,每天有value个日志 --><maxSizeRollBackups value="20" /><!-- 可用的单位:KB|MB|GB --><maximumFileSize value="3MB" /><!-- true时当前最新日志文件名永远为file配置项中的名字 --><staticLogFileName value="true" /><!-- 输出级别的日志 --><filter type="log4net.Filter.LevelRangeFilter"><param name="LevelMin" value="ALL" /><param name="LevelMax" value="FATAL" /></filter><layout type="log4net.Layout.PatternLayout"><conversionPattern value="%date [%thread] %-5level %logger - %message%newline"/></layout><layout type="log4net.Layout.PatternLayout"><conversionPattern value="%date [%thread] %-5level %logger - %message%newline"/></layout></appender><root><!-- 控制级别,由低到高: ALL|DEBUG|INFO|WARN|ERROR|FATAL|OFF --><!-- OFF:0 --><!-- FATAL:FATAL --><!-- ERROR: ERROR,FATAL --><!-- WARN: WARN,ERROR,FATAL --><!-- INFO: INFO,WARN,ERROR,FATAL --><!-- DEBUG: INFO,WARN,ERROR,FATAL --><!-- ALL: DEBUG,INFO,WARN,ERROR,FATAL --><priority value="ALL"/><level value="INFO"/><appender-ref ref="rollingAppender" /></root>
</log4net>
2)log4net.Appender.ConsoleAppender
<?xml version="1.0" encoding="utf-8"?>
<log4net><appender name="ConsoleAppender" type="log4net.Appender.ConsoleAppender"><layout type="log4net.Layout.PatternLayout"><conversionPattern value="%date [%thread] %-5level %logger - %message%newline" /></layout></appender><root><!-- 控制级别,由低到高: ALL|DEBUG|INFO|WARN|ERROR|FATAL|OFF --><!-- OFF:0 --><!-- FATAL:FATAL --><!-- ERROR: ERROR,FATAL --><!-- WARN: WARN,ERROR,FATAL --><!-- INFO: INFO,WARN,ERROR,FATAL --><!-- DEBUG: INFO,WARN,ERROR,FATAL --><!-- ALL: DEBUG,INFO,WARN,ERROR,FATAL --><priority value="ALL"/><level value="INFO"/><appender-ref ref="ConsoleAppender" /></root>
</log4net>
3)log4net.Appender.SmtpAppender
<?xml version="1.0" encoding="utf-8"?>
<log4net><appender name="SmtpAppender" type="log4net.Appender.SmtpAppender"><to value="to@example.com" /><from value="from@example.com" /><subject value="Log4Net Error" /><smtpHost value="smtp.example.com" /><bufferSize value="512" /><lossy value="false" /><layout type="log4net.Layout.PatternLayout"><conversionPattern value="%date [%thread] %-5level %logger - %message%newline" /></layout></appender><root><!-- 控制级别,由低到高: ALL|DEBUG|INFO|WARN|ERROR|FATAL|OFF --><!-- OFF:0 --><!-- FATAL:FATAL --><!-- ERROR: ERROR,FATAL --><!-- WARN: WARN,ERROR,FATAL --><!-- INFO: INFO,WARN,ERROR,FATAL --><!-- DEBUG: INFO,WARN,ERROR,FATAL --><!-- ALL: DEBUG,INFO,WARN,ERROR,FATAL --><priority value="ALL"/><level value="INFO"/><appender-ref ref="log4net.Appender.SmtpAppender" /></root>
</log4net>
3、log4net配置及使用示例
下面是log4net的配置文件配置及使用,如下,
using Microsoft.OpenApi.Models;using NLog.Web;var builder = WebApplication.CreateBuilder(args);// 配置log4netbuilder.Logging.AddLog4Net("log4net.Config");
builder.Services.AddControllers();app.UseDefaultFiles();
app.UseStaticFiles();
app.MapControllers();app.Run();
使用示例:
using Microsoft.AspNetCore.Mvc;
using UtilityWeb.API.Services;
using UtilityWeb.Core;using UtilityWeb.Tools;namespace UtilityWeb.API.Controllers
{[ApiController][Route("[controller]")]public class WeatherForecastController : ControllerBase{private static readonly string[] Summaries = new[]{"Freezing", "Bracing", "Chilly", "Cool", "Mild", "Warm", "Balmy", "Hot", "Sweltering", "Scorching"};private readonly ILogger<WeatherForecastController> _logger;public WeatherForecastController(ILogger<WeatherForecastController> logger){_logger = logger;}[HttpGet(Name = "GetWeatherForecast")]public IEnumerable<string> Get([FromServices] UtilityWebContext context,[FromServices] IUser userService,[FromServices] SwaggerService swaggerService){_logger.LogError("error message");return new List<string>() { _logger.ToString() };}}
}
4、log4net 与NLog 对比
特性 | NLog | log4net |
性能 | 在高性能场景下表现更好, 特别是异步日志记录方面。 | 性能稳定, 但可能在某些高性能需求下逊色于NLog。 |
配置 | 灵活和动态的配置选项, 支持代码配置和外部文件配置。 | 通常基于 XML 文件配置, 功能强大但可能复杂。 |
扩展性 | 提供良好的支持, 易于添加自定义逻辑。 | 支持自定义扩展, 但可能不如NLog直观。 |
API | 更现代和易于使用。 | 功能强大但可能对初学者较复杂。 |
文档 | 拥有广泛的文档和社区支持。 | 长期的用户基础, 但更新和社区活跃度可能不如NLog。 |
特性 | 支持结构化日志、 条件日志记录等高级功能。 | 提供丰富的日志记录功能, 但在现代日志需求上可能不够灵活。 |
成熟度 | 较新,但已稳定且不断更新。 | 较早开发的日志库, 具有更成熟的特性。 |
推荐 | 需要高性能、现代化API 或特定高级功能。 | 项目已使用log4net 或需要稳定且经过验证的解决方案。 |