ASP.NET Core MVC 使用 Log4Net 记录日志

参考

  • DeepSeek
  • 豆包
  • 其他(由于文章是后编写的,相关参考文章未存储连接)

环境

软件/系统 版本 说明
Windows windows 10 专业版 22H2 64 位操作系统, 基于 x64 的处理器
Microsoft Visual Studio Community 2022 (64 位) - Current 版本 17.14.9
Visual Studio Code 1.102.2
Docker Engine v28.3.2 Docker 桌面工具
Docker 28.3.2
pgAdmin4 9.0 PostgreSQL 数据库管理软件
PostgreSQL 15
.NET 8
ASP.NET Core MVC ASP.NET Core MVC in .NET 8.0
Microsoft.EntityFrameworkCore.Design 8.0.18 nuget 依赖
Microsoft.EntityFrameworkCore.Tools 8.0.18 nuget 依赖
Microsoft.VisualStudio.Web.CodeGeneration.Design 8.0.7 nuget 依赖 (Microsoft Visual Studio在通过模型生成控制器与视图时自动安装的依赖)
Npgsql.EntityFrameworkCore.PostgreSQL 8.0.11 nuget 依赖
EFCore.NamingConventions 8.0.3 nuget 依赖
X.PagedList.EF 10.5.7 nuget 依赖
X.PagedList.Mvc.Core 10.5.7 nuget 依赖(安装 X.PagedList.EF 时自动安装)
Microsoft.Extensions.Logging.Log4Net.AspNetCore 8.0.0 nuget 依赖

本项目入口文件为 Program.cs ,创建项目时为不使用顶级语句

正文

  1. 安装 Microsoft.Extensions.Logging.Log4Net.AspNetCore
  2. 创建 项目目录/Configs/log4net.config 文件:
    <?xml version="1.0" encoding="utf-8"?>
    <log4net>
    	<!-- Define some output appenders -->
    	<appender name="rollingAppender" type="log4net.Appender.RollingFileAppender">
    		<!--    value="logs/log.log"-->
    		<file value="logs/" />
    		<!--追加日志内容-->
    		<appendToFile value="true" />
    
    		<!--防止多线程时不能写Log,官方说线程非安全-->
    		<lockingModel type="log4net.Appender.FileAppender+MinimalLock" />
    
    		<!--可以为:Once|Size|Date|Composite-->
    		<!--Composite为Size和Date的组合-->
    		<rollingStyle value="Composite" />
    
    		<!--当备份文件时,为文件名加的后缀-->
    		<datePattern value="yyyyMMdd'.log'" />
    
    		<!--日志最大个数,都是最新的-->
    		<!--rollingStyle节点为Size时,只能有value个日志-->
    		<!--rollingStyle节点为Composite时,每天有value个日志-->
    		<maxSizeRollBackups value="200" />
    
    		<!--可用的单位:KB|MB|GB-->
    		<maximumFileSize value="1MB" />
    
    		<!--置为true,当前最新日志文件名永远为file节中的名字-->
    		<staticLogFileName value="false" />
    
    		<!--输出级别在INFO和ERROR之间的日志-->
    		<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>
    	</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"/>
    		<!--使用上面配置的那个规则,ref指定上面的规则名称-->
    		<appender-ref ref="rollingAppender" />
    	</root>
    </log4net>
    
  3. Program.cs 内注册筛选器
    // 注入日志
    builder.Logging.AddLog4Net("Configs/log4net.Config");
    // 其他操作...
    var app = builder.Build(); // 添加本行是为了标明 builder.Logging.AddLog4Net("Configs/log4net.Config"); 添加位置
    
  4. 在需要的地方通过自动注入即可,此处演示在控制器内使用。
    using Microsoft.AspNetCore.Authorization;
    using Microsoft.AspNetCore.Mvc;
    using NightMarketPlatformWeb.Data;
    using NightMarketPlatformWeb.Dtos.Area;
    
    namespace NightMarketPlatformWeb.Controllers
    {
    	public class AdminController : Controller
    	{
    
    		private readonly ILogger<AdminController> _logger;
    
    		private readonly ApplicationDbContext _context;
    
    		public AdminController(ILogger<AdminController> logger, ApplicationDbContext context)
    		{
    			_logger = logger;
    			_context = context;
    		}
    
    		// GET: AdminModel
    		public IActionResult Index(AdminRequestDto requestDto)
    		{
    			_logger.LogInformation("访问管理员首页");
    			return View();
    		}
    	}
    }
    
posted @ 2025-07-27 18:59  夏秋初  阅读(24)  评论(0)    收藏  举报