目录
一:说明
Log4Net是一个帮助程序员将日志信息输出的工具,它定义了多种日志信息输出模式,可以根据需要将日志输出到控制台,文本文件,Windows日志事件查看器中,包括数据库,邮件等等位置,以便我们快速跟踪程序Bug。
一:引入NuGet包:Log4net和Microsoft.Extensions.Logging.Log4Net.AspNetCore。
二:导入配置文件:Log4Net.config
三:配置文件右键属性复制到输出目录始终复制。
四:导入数据库脚本,并引用System.Data.SqlClient。不使用数据库可忽略。
五:在Program注册Log4Net,在控制器中使用。
二:配置文件
配置文件实例:
<?xml version="1.0" encoding="utf-8"?> <log4net> <!-- 控制台输出 --> <appender name="ConsoleAppender" type="log4net.Appender.ConsoleAppender"> <layout type="log4net.Layout.PatternLayout"> <conversionPattern value="记录时间:%date 线程ID:[%thread] 日志级别:%-5level 出错的类:%logger property:[%property{NDC}] - 错误描述:%message%newline" /> </layout> </appender> <!-- 本地读写Txt文件 --> <appender name="RollingAppender" type="log4net.Appender.RollingFileAppender"> <file value="ProjectLog\ProjectLog.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 线程ID:[%thread] 日志级别:%-5level 出错的类:%logger property:[%property{NDC}] - 错误描述:%message%newline"/> </layout> </appender> <!--SqlServer读写--> <!--log4net日志配置:http://logging.apache.org/log4net/release/config-examples.html --> <appender name="AdoNetAppender" 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;User Id=sa;Pwd=sa;Min Pool Size=0;Max Pool Size=4;Connect Timeout=10" /> <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"/> <level value="ALL"/> <appender-ref ref="ConsoleAppender" /> <appender-ref ref="RollingAppender" /> <appender-ref ref="AdoNetAppender" /> </root> </log4net>
配置文件说明:
日志等级:
<!--控制级别:ALL|DEBUG|INFO|WARN|ERROR|FATAL|OFF--> <!--ALL: DEBUG,INFO,WARN,ERROR,FATAL--> <!--DEBUG: INFO,WARN,ERROR,FATAL--> <!--INFO: INFO,WARN,ERROR,FATAL--> <!--WARN: WARN,ERROR,FATAL--> <!--ERROR: ERROR,FATAL--> <!--FATAL:FATAL--> <!--OFF:0-->
三:数据库脚本
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 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 SET ANSI_NULLS ON GO SET QUOTED_IDENTIFIER ON GO
四:代码实例
Program.cs注册代码:
builder.Logging.AddLog4Net("CfgFile/Log4Net.config");
控制器代码:
using log4net; using Microsoft.AspNetCore.Mvc; using Microsoft.Extensions.Logging.Log4Net.AspNetCore.Extensions; namespace Study_ASP.NET_Core_MVC.Controllers { public class LogManagerController : Controller { /// <summary> /// 定义构造函数 /// </summary> private readonly ILogger<LogManagerController> _logger; /// <summary> /// 初始化构造函数 /// </summary> /// <param name="logger"></param> public LogManagerController(ILogger<LogManagerController> logger) { _logger = logger; _logger.LogInformation("一般信息日志---LogInformation"); _logger.LogWarning("警告信息日志---LogWarning"); _logger.LogError("错误信息日志---LogError"); _logger.LogCritical("关键信息日志---LogCritical"); } /// <summary> /// Get请求 /// LogManager控制器 /// Index方法 /// </summary> /// <returns></returns> [HttpGet] public IActionResult Index() { _logger.LogInformation("一般信息日志"); _logger.LogWarning("警告信息日志"); _logger.LogError("错误信息日志"); _logger.LogCritical("关键信息日志"); return View(); } } }
视图代码:
<h1>这是LogManager控制器下的Index视图。</h1>