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
类型 | 描述 |
使用准备好的语句或存储过程将日志记录事件写入数据库。 | |
将颜色突出显示的日志事件写入 ANSI 终端窗口。 | |
将日志记录事件写入 ASP 跟踪上下文。 然后可以在 ASP 页的末尾或在 ASP 跟踪页上呈现这些。 | |
在将事件转发给子附加程序之前缓冲记录事件。 | |
将日志记录事件写入应用程序的控制台。 事件可能会进入标准我们的流或标准错误流。 事件可能具有为每个级别定义的可配置文本和背景颜色。 | |
将日志记录事件写入应用程序的控制台。 事件可能会进入标准我们的流或标准错误流。 | |
将日志事件写入 .NET 系统。 | |
将日志记录事件写入 Windows 事件日志。 | |
将日志记录事件写入文件系统中的文件。 | |
将日志记录事件转发给子附加程序。 | |
将日志记录事件写入本地 syslog 服务(仅限 UNIX)。 | |
将日志记录事件存储在内存缓冲区中。 | |
将日志事件写入 Windows Messenger 服务。 这些消息显示在用户终端的对话框中。 | |
将日志记录事件写入调试器。如果应用程序没有调试器, 系统调试器会显示该字符串。 如果应用程序没有调试器并且系统调试器未激活, 则忽略该消息。 | |
使用 UDP 网络将日志记录事件写入远程系统日志服务。 | |
使用 .NET 远程处理将日志记录事件写入远程接收器。 | |
将日志记录事件写入文件系统中的文件。 RollingFileAppender 可以配置为根据日期 或文件大小限制记录到多个文件。 | |
将日志记录事件发送到电子邮件地址。 | |
将 SMTP 消息作为文件写入拾取目录。 然后可以通过 SMTP 代理 (例如 IIS SMTP 代理)读取和发送这些文件。 | |
客户端通过 Telnet 连接以接收日志记录事件。 | |
将日志记录事件写入 .NET 跟踪系统。 | |
使用 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);
// 配置log4net
builder.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 或需要稳定且经过验证的解决方案。 |