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",然后点击安装。

相关文档VS(Visual Studio)中Nuget的使用

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);

// 配置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

或需要稳定且经过验证的解决方案。

相关文档:

.NET 6 配置使用NLog日志框架的方法及示例代码

.NET 6 (C#) Serilog 日志框架的使用

.NET 6 (C#) Microsoft.Extensions.Logging 日志框架的使用

推荐文档