log4net写日志
1、nuget添加log4net、Microsoft.Extensions.Logging.Log4Net.AspNetCore、System.Data.SqlClient三个引用
2、项目新建一个CfgFile文件夹添加log4net.config配置文件

1 <?xml version="1.0" encoding="utf-8"?> 2 <log4net> 3 <!-- Define some output appenders --> 4 <appender name="rollingAppender" type="log4net.Appender.RollingFileAppender"> 5 <file value="log4net\log.log" /> 6 <!--追加日志内容--> 7 <appendToFile value="true" /> 8 9 <!--防止多线程时不能写Log,官方说线程非安全--> 10 <lockingModel type="log4net.Appender.FileAppender+MinimalLock" /> 11 12 <!--可以为:Once|Size|Date|Composite--> 13 <!--Composite为Size和Date的组合--> 14 <rollingStyle value="Composite" /> 15 16 <!--当备份文件时,为文件名加的后缀--> 17 <datePattern value="yyyyMMdd.TXT" /> 18 19 <!--日志最大个数,都是最新的--> 20 <!--rollingStyle节点为Size时,只能有value个日志--> 21 <!--rollingStyle节点为Composite时,每天有value个日志--> 22 <maxSizeRollBackups value="30" /> 23 24 <!--可用的单位:KB|MB|GB--> 25 <maximumFileSize value="3MB" /> 26 27 <!--置为true,当前最新日志文件名永远为file节中的名字--> 28 <!-- 当将日期作为日志文件的名字时,必须将staticLogFileName的值设置为false --> 29 <staticLogFileName value="true" /> 30 31 <!--输出级别在INFO和ERROR之间的日志--> 32 <filter type="log4net.Filter.LevelRangeFilter"> 33 <param name="LevelMin" value="ALL" /> 34 <param name="LevelMax" value="FATAL" /> 35 </filter> 36 <layout type="log4net.Layout.PatternLayout"> 37 <conversionPattern value="%date [%thread] %-5level %logger - %message%newline"/> 38 </layout> 39 </appender> 40 41 <!--SQL数据库--> 42 <appender name="AdoNetAppender_SqlServer" type="log4net.Appender.AdoNetAppender"> 43 <bufferSize value="1" /> 44 <connectionType value="System.Data.SqlClient.SqlConnection, System.Data.SqlClient, Version=4.6.1.3, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a" /> 45 <connectionString value="data source=DESKTOP-1Q7NAPD;initial catalog=Test;integrated security=false;persist security info=True;User ID=sa;Password=123456" /> 46 <commandText value="INSERT INTO Log4Net ([Date],[Thread],[Level],[Logger],[Message],[Exception]) VALUES (@log_date, @thread, @log_level, @logger, @message, @exception)" /> 47 <parameter> 48 <parameterName value="@log_date" /> 49 <dbType value="DateTime" /> 50 <layout type="log4net.Layout.RawTimeStampLayout" /> 51 </parameter> 52 <parameter> 53 <parameterName value="@thread" /> 54 <dbType value="String" /> 55 <size value="255" /> 56 <layout type="log4net.Layout.PatternLayout"> 57 <conversionPattern value="%thread" /> 58 </layout> 59 </parameter> 60 <parameter> 61 <parameterName value="@log_level" /> 62 <dbType value="String" /> 63 <size value="50" /> 64 <layout type="log4net.Layout.PatternLayout"> 65 <conversionPattern value="%level" /> 66 </layout> 67 </parameter> 68 <parameter> 69 <parameterName value="@logger" /> 70 <dbType value="String" /> 71 <size value="255" /> 72 <layout type="log4net.Layout.PatternLayout"> 73 <conversionPattern value="%logger" /> 74 </layout> 75 </parameter> 76 <parameter> 77 <parameterName value="@message" /> 78 <dbType value="String" /> 79 <size value="4000" /> 80 <layout type="log4net.Layout.PatternLayout"> 81 <conversionPattern value="%message" /> 82 </layout> 83 </parameter> 84 <parameter> 85 <parameterName value="@exception" /> 86 <dbType value="String" /> 87 <size value="2000" /> 88 <layout type="log4net.Layout.ExceptionLayout" /> 89 </parameter> 90 </appender> 91 92 <root> 93 <priority value="ALL"/> 94 <!--日志级别(从低到高):ALL|DEBUG|INFO|WARN|ERROR|FATAL|OFF--> 95 <level value="ALL"/> 96 <appender-ref ref="rollingAppender" /> 97 <!--SQL数据库--> 98 <appender-ref ref="AdoNetAppender_SqlServer" /> 99 </root> 100 </log4net>
注意log4net.config的属性配置为“始终复制”
有两种记录日志的方式,一种是文本,一种是插入数据库。
配置分别对应name="rollingAppender"和name="AdoNetAppender_SqlServer"两个节点。
注意数据库节点里面需要配置数据库连接的相关信息。
创建数据库Test,并创建表Log4Net,数据结构如下:

1 USE [Test] 2 GO 3 4 /****** Object: Table [dbo].[Log4Net] Script Date: 2022/5/1 18:55:48 ******/ 5 SET ANSI_NULLS ON 6 GO 7 8 SET QUOTED_IDENTIFIER ON 9 GO 10 11 SET ANSI_PADDING ON 12 GO 13 14 CREATE TABLE [dbo].[Log4Net]( 15 [Id] [int] IDENTITY(1,1) NOT NULL, 16 [Date] [datetime] NOT NULL, 17 [Thread] [varchar](255) NOT NULL, 18 [Level] [varchar](50) NOT NULL, 19 [Logger] [varchar](255) NOT NULL, 20 [Message] [varchar](4000) NOT NULL, 21 [Exception] [varchar](2000) NULL, 22 CONSTRAINT [PK_Log4Net] PRIMARY KEY CLUSTERED 23 ( 24 [Id] ASC 25 )WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY] 26 ) ON [PRIMARY] 27 28 GO 29 30 SET ANSI_PADDING OFF 31 GO
3、Program.cs 添加如下代码
builder.Logging.AddLog4Net("CfgFile/log4net.config");
如果log4net.config放在根目录,可不用写文件路径
4、创建LogController控制器

1 using Microsoft.AspNetCore.Mvc; 2 3 namespace Project6.Controllers 4 { 5 public class LogController : Controller 6 { 7 private readonly ILogger _logger; 8 private readonly ILoggerFactory _loggerFactory; 9 10 public LogController(ILogger<LogController> logger,ILoggerFactory loggerFactory) 11 { 12 this._logger = logger; 13 this._loggerFactory = loggerFactory; 14 15 ILogger<LogController> _logger2 = loggerFactory.CreateLogger<LogController>(); 16 17 this._logger.LogInformation($"{this.GetType().Name}: 被构造"); 18 _logger2.LogInformation($"{this.GetType().Name}被Logger2构造"); 19 20 } 21 public IActionResult Index() 22 { 23 this._logger.LogInformation($"index被执行了"); 24 25 ILogger<LogController> logger = this._loggerFactory.CreateLogger<LogController>(); 26 logger.LogInformation($"index被factory执行了"); 27 28 return View(); 29 } 30 31 public IActionResult Level() 32 { 33 _logger.LogDebug("this is Debug"); 34 _logger.LogInformation("this is Info"); 35 _logger.LogWarning("this is Warn"); 36 _logger.LogError("this is Error"); 37 _logger.LogTrace("this is Trace"); 38 _logger.LogCritical("this is Critical"); 39 40 return new JsonResult(new { sucess = true }); 41 } 42 } 43 }
5、执行logController控制器/log/index
查看debug/net6.0/log4net目录下生成相应的日志
查看数据库Test表Log4Net也记录了相应的日志
6、依次修改log4net.config
<!--日志级别(从低到高):ALL|DEBUG|INFO|WARN|ERROR|FATAL|OFF-->
<level value="ALL"/>
节点的值,然后执行/log/Level
发现配置为OFF,日志关闭,不在记录日志
配置为FATAL只记录FATAL类型的日志。
配置为ERROR记录FATAL和ERROR类型的日志。以此类推。。。。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 无需6万激活码!GitHub神秘组织3小时极速复刻Manus,手把手教你使用OpenManus搭建本
· C#/.NET/.NET Core优秀项目和框架2025年2月简报
· Manus爆火,是硬核还是营销?
· 终于写完轮子一部分:tcp代理 了,记录一下
· 【杭电多校比赛记录】2025“钉耙编程”中国大学生算法设计春季联赛(1)