一:
1.NuGet引入程序包:
1.Log4Net 2.Microsoft.Extensions.Logging.Log4Net.AspNetCore
2.准備好配置文件:CfgFile--官網可以下載
3.配置讀取文件生效,注冊 【Program.cs】
WebApplicationBuilder builder = WebApplication.CreateBuilder(args);//var builder=>update==> WebApplicationBuilder builder { //Nuget引入 //1.Log4Net //2.Microsoft.Extensions.Logging.Log4Net.AspNetCore builder.Logging.AddLog4Net("CfgFile/log4net.Config"); }
注意:修改文件屬性
4.注入得到Log4Net實例開始記錄日志 新增的控制器【SecondController】
public class SecondController : Controller { //1.定義 private readonly ILogger<SecondController> _logger; private readonly ILoggerFactory _factory; public SecondController(ILogger<SecondController> logger,ILoggerFactory factory) { this._logger = logger; this._logger.LogInformation($"{this.GetType().Name}被構造了:_logger"); this._factory = factory; ILogger<SecondController> _logger1 = _factory.CreateLogger<SecondController>(); _logger1.LogInformation($"{this.GetType().Name}被構造了:_logger1"); } public IActionResult Index() { this._logger.LogInformation($"Index被執行了"); ILogger<SecondController> _logger2 = _factory.CreateLogger<SecondController>(); _logger2.LogInformation($"{this.GetType().Name}被執行了:_logger2"); return View(); } }
這是結果:
二.Log4Net日志寫SqlServer
1.Nuget以來程序包引入;
System.Data.SqlClient
2.修改配置文件:支持寫數據庫日志

<?xml version="1.0" encoding="utf-8"?> <log4net> <!-- Define some output appenders --> <!--Text形式--> <appender name="rollingAppender" type="log4net.Appender.RollingFileAppender"> <file value="log4\log.txt" /> <!--追加日志內容--> <appendToFile value="true" /> <!--防止多線程時不能寫Log,官方說線程非安全--> <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" /> <!--輸出級別在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> <!--SqlServer形式--> <!--log4net日志配置:http://logging.apache.org/log4net/release/config-examples.html --> <appender name="AdoNetAppender_SqlServer" type="log4net.Appender.AdoNetAppender"> <!--日志緩存寫入條數 設置為0時只要有一條就立刻寫到數據庫--> <bufferSize value="0" /> <connectionType value="System.Data.SqlClient.SqlConnection,System.Data.SqlClient, Version=4.6.1.3, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a" /> <connectionString value="Data Source=.;Initial Catalog=LogManager;Persist Security Info=True;User ID=sa;Password=123456" /> <commandText value="INSERT INTO Log4Net ([Date],[Thread],[Level],[Logger],[Message],[Exception]) VALUES (@log_date, @thread, @log_level, @logger, @message, @exception)" /> <parameter> <parameterName value="@log_date" /> <dbType value="DateTime" /> <layout type="log4net.Layout.RawTimeStampLayout" /> </parameter> <parameter> <parameterName value="@thread" /> <dbType value="String" /> <size value="255" /> <layout type="log4net.Layout.PatternLayout"> <conversionPattern value="%thread" /> </layout> </parameter> <parameter> <parameterName value="@log_level" /> <dbType value="String" /> <size value="50" /> <layout type="log4net.Layout.PatternLayout"> <conversionPattern value="%level" /> </layout> </parameter> <parameter> <parameterName value="@logger" /> <dbType value="String" /> <size value="255" /> <layout type="log4net.Layout.PatternLayout"> <conversionPattern value="%logger" /> </layout> </parameter> <parameter> <parameterName value="@message" /> <dbType value="String" /> <size value="4000" /> <layout type="log4net.Layout.PatternLayout"> <conversionPattern value="%message" /> </layout> </parameter> <parameter> <parameterName value="@exception" /> <dbType value="String" /> <size value="2000" /> <layout type="log4net.Layout.ExceptionLayout" /> </parameter> </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"/> <!--root類似路由,level表示支持的記錄方式--> <level value="INFO"/> <appender-ref ref="rollingAppender" /> <appender-ref ref="AdoNetAppender_SqlServer" /> </root> </log4net>
3.初始化數據庫日志表

/* 腳本包含: 1.了Log4Net寫數據庫日志腳本 2. Nlog寫數據庫日志腳本 */ USE [master] GO /* 創建數據庫LogManager */ CREATE DATABASE [LogManager]; GO ALTER DATABASE [LogManager] SET COMPATIBILITY_LEVEL = 150 GO IF (1 = FULLTEXTSERVICEPROPERTY('IsFullTextInstalled')) begin EXEC [LogManager].[dbo].[sp_fulltext_database] @action = 'enable' end GO ALTER DATABASE [LogManager] SET ANSI_NULL_DEFAULT OFF GO ALTER DATABASE [LogManager] SET ANSI_NULLS OFF GO ALTER DATABASE [LogManager] SET ANSI_PADDING OFF GO ALTER DATABASE [LogManager] SET ANSI_WARNINGS OFF GO ALTER DATABASE [LogManager] SET ARITHABORT OFF GO ALTER DATABASE [LogManager] SET AUTO_CLOSE OFF GO ALTER DATABASE [LogManager] SET AUTO_SHRINK OFF GO ALTER DATABASE [LogManager] SET AUTO_UPDATE_STATISTICS ON GO ALTER DATABASE [LogManager] SET CURSOR_CLOSE_ON_COMMIT OFF GO ALTER DATABASE [LogManager] SET CURSOR_DEFAULT GLOBAL GO ALTER DATABASE [LogManager] SET CONCAT_NULL_YIELDS_NULL OFF GO ALTER DATABASE [LogManager] SET NUMERIC_ROUNDABORT OFF GO ALTER DATABASE [LogManager] SET QUOTED_IDENTIFIER OFF GO ALTER DATABASE [LogManager] SET RECURSIVE_TRIGGERS OFF GO ALTER DATABASE [LogManager] SET DISABLE_BROKER GO ALTER DATABASE [LogManager] SET AUTO_UPDATE_STATISTICS_ASYNC OFF GO ALTER DATABASE [LogManager] SET DATE_CORRELATION_OPTIMIZATION OFF GO ALTER DATABASE [LogManager] SET TRUSTWORTHY OFF GO ALTER DATABASE [LogManager] SET ALLOW_SNAPSHOT_ISOLATION OFF GO ALTER DATABASE [LogManager] SET PARAMETERIZATION SIMPLE GO ALTER DATABASE [LogManager] SET READ_COMMITTED_SNAPSHOT OFF GO ALTER DATABASE [LogManager] SET HONOR_BROKER_PRIORITY OFF GO ALTER DATABASE [LogManager] SET RECOVERY FULL GO ALTER DATABASE [LogManager] SET MULTI_USER GO ALTER DATABASE [LogManager] SET PAGE_VERIFY CHECKSUM GO ALTER DATABASE [LogManager] SET DB_CHAINING OFF GO ALTER DATABASE [LogManager] SET FILESTREAM( NON_TRANSACTED_ACCESS = OFF ) GO ALTER DATABASE [LogManager] SET TARGET_RECOVERY_TIME = 60 SECONDS GO ALTER DATABASE [LogManager] SET DELAYED_DURABILITY = DISABLED GO ALTER DATABASE [LogManager] SET ACCELERATED_DATABASE_RECOVERY = OFF GO EXEC sys.sp_db_vardecimal_storage_format N'LogManager', N'ON' GO ALTER DATABASE [LogManager] SET QUERY_STORE = OFF GO USE [LogManager] GO /****** Object: Table [dbo].[Log4Net] Script Date: 2021/11/26 10:56:35 ******/ SET ANSI_NULLS ON GO SET QUOTED_IDENTIFIER ON GO /* 創建Log4net的表 */ CREATE TABLE [dbo].[Log4Net]( [Id] [int] IDENTITY(1,1) NOT NULL, [Date] [datetime] NOT NULL, [Thread] [varchar](255) NOT NULL, [Level] [varchar](50) NOT NULL, [Logger] [varchar](255) NOT NULL, [Message] [varchar](4000) NOT NULL, [Exception] [varchar](2000) NULL ) ON [PRIMARY] GO /****** Object: Table [dbo].[NLog] Script Date: 2021/11/26 10:56:35 ******/ SET ANSI_NULLS ON GO SET QUOTED_IDENTIFIER ON GO /* 創建Log4net的表 */ CREATE TABLE [dbo].[NLog]( [Id] [int] IDENTITY(1,1) NOT NULL, [Application] [nvarchar](50) NOT NULL, [Logged] [datetime] NOT NULL, [Level] [nvarchar](50) NOT NULL, [Message] [nvarchar](max) NOT NULL, [Logger] [nvarchar](250) NULL, [Callsite] [nvarchar](max) NULL, [Exception] [nvarchar](max) NULL, CONSTRAINT [PK_dbo.Log] PRIMARY KEY CLUSTERED ( [Id] ASC )WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON, OPTIMIZE_FOR_SEQUENTIAL_KEY = OFF) ON [PRIMARY] ) ON [PRIMARY] TEXTIMAGE_ON [PRIMARY] GO USE [master] GO ALTER DATABASE [LogManager] SET READ_WRITE GO
4.注入寫日志測試;需要在上面的基礎上直接操作
結果: