.NET Core WebAPI中使用Log4net 日志级别分类并记录到数据库

news/2024/5/19 23:43:25 标签: .netcore, log4net

一、效果

  1. 记录日志为文档
    在这里插入图片描述

  2. 记录日志到数据库

在这里插入图片描述

二、添加NuGet包

在这里插入图片描述

log4netconfig_13">三、log4net.config代码配置

<?xml version="1.0" encoding="utf-8" ?>
<log4net>
	<!-- Debug日志 -->
	<appender name="RollingFileDebug" type="log4net.Appender.RollingFileAppender" >
		<!-- 日志文件存放位置,可以为绝对路径也可以为相对路径 -->
		<file value="logs\\" />
		<!-- 日志文件的命名规则 -->
		<datePattern value="yyyy-MM-dd/'Debug.log'"/>
		<!-- 将日志信息追加到已有的日志文件中-->
		<appendToFile value="true" />
		<rollingStyle value="Size" />
		<maxSizeRollBackups value="100" />
		<maximumFileSize value="3MB" />
		<!-- 指定按日期切分日志文件 -->
		<rollingStyle value="Date"/>
		<!-- 当将日期作为日志文件的名字时,必须将staticLogFileName的值设置为false -->
		<staticLogFileName value="false" />
		<!-- 最小锁定模式,以允许多个进程可以写入同一个文件 -->
		<lockingModel type="log4net.Appender.FileAppender+MinimalLock" />
		<layout type="log4net.Layout.PatternLayout">
			<conversionPattern value="%newline%newline【日志时间】: %d  【线程ID】: %thread    %newline【日志级别】: %-5p  %newline【日志对象】:%logger  %newline【日志内容】:%m %newline" />
		</layout>
		<filter type="log4net.Filter.LevelRangeFilter">
			<param name="LevelMin" value="Debug" />
			<param name="LevelMax" value="Debug" />
		</filter>
	</appender>

	<!-- Info日志 -->
	<appender name="RollingFileInfo" type="log4net.Appender.RollingFileAppender" >
		<!-- 日志文件存放位置,可以为绝对路径也可以为相对路径 -->
		<file value="logs\\" />
		<!-- 日志文件的命名规则 -->
		<datePattern value="yyyy-MM-dd/'Info.log'"/>
		<!-- 将日志信息追加到已有的日志文件中-->
		<appendToFile value="true" />
		<rollingStyle value="Size" />
		<maxSizeRollBackups value="100" />
		<maximumFileSize value="3MB" />
		<!-- 指定按日期切分日志文件 -->
		<rollingStyle value="Date"/>
		<!-- 当将日期作为日志文件的名字时,必须将staticLogFileName的值设置为false -->
		<staticLogFileName value="false" />
		<!-- 最小锁定模式,以允许多个进程可以写入同一个文件 -->
		<lockingModel type="log4net.Appender.FileAppender+MinimalLock" />
		<layout type="log4net.Layout.PatternLayout">
			<conversionPattern value="%newline%newline【日志时间】:%d  【线程ID】:%thread    %newline【日志级别】:%-5p  %newline【日志对象】:%logger  %newline【日志内容】:%m %newline" />
		</layout>
		<filter type="log4net.Filter.LevelRangeFilter">
			<param name="LevelMin" value="Info" />
			<param name="LevelMax" value="Info" />
		</filter>
	</appender>

	<!-- WARN日志 -->
	<appender name="RollingFileWarn" type="log4net.Appender.RollingFileAppender" >
		<!-- 日志文件存放位置,可以为绝对路径也可以为相对路径 -->
		<file value="logs\\" />
		<!-- 日志文件的命名规则 -->
		<datePattern value="yyyy-MM-dd/'Warn.log'"/>
		<!-- 将日志信息追加到已有的日志文件中-->
		<appendToFile value="true" />
		<rollingStyle value="Size" />
		<maxSizeRollBackups value="100" />
		<maximumFileSize value="3MB" />
		<!-- 指定按日期切分日志文件 -->
		<rollingStyle value="Date"/>
		<!-- 当将日期作为日志文件的名字时,必须将staticLogFileName的值设置为false -->
		<staticLogFileName value="false" />
		<!-- 最小锁定模式,以允许多个进程可以写入同一个文件 -->
		<lockingModel type="log4net.Appender.FileAppender+MinimalLock" />
		<layout type="log4net.Layout.PatternLayout">
			<conversionPattern value="%newline%newline【日志时间】:%d  【线程ID】:%thread    %newline【日志级别】:%-5p  %newline【日志对象】:%logger  %newline【日志内容】:%m %newline" />
		</layout>
		<filter type="log4net.Filter.LevelRangeFilter">
			<param name="LevelMin" value="Warn" />
			<param name="LevelMax" value="Warn" />
		</filter>
	</appender>

	<!-- Error日志 -->
	<appender name="RollingFileError" type="log4net.Appender.RollingFileAppender" >
		<!-- 日志文件存放位置,可以为绝对路径也可以为相对路径 -->
		<file value="logs\\" />
		<!-- 日志文件的命名规则 -->
		<datePattern value="yyyy-MM-dd/'Error.log'"/>
		<!-- 将日志信息追加到已有的日志文件中-->
		<appendToFile value="true" />
		<rollingStyle value="Size" />
		<maxSizeRollBackups value="100" />
		<maximumFileSize value="3MB" />
		<!-- 指定按日期切分日志文件 -->
		<rollingStyle value="Date"/>
		<!-- 当将日期作为日志文件的名字时,必须将staticLogFileName的值设置为false -->
		<staticLogFileName value="false" />
		<!-- 最小锁定模式,以允许多个进程可以写入同一个文件 -->
		<lockingModel type="log4net.Appender.FileAppender+MinimalLock" />
		<layout type="log4net.Layout.PatternLayout">
			<conversionPattern value="%newline%newline【日志时间】:%d  【线程ID】:%thread    %newline【日志级别】:%-5p  %newline【日志对象】:%logger  %newline【日志内容】:%m %newline" />
		</layout>
		<filter type="log4net.Filter.LevelRangeFilter">
			<param name="LevelMin" value="Error" />
			<param name="LevelMax" value="Error" />
		</filter>

	</appender>

	<!-- Fatal日志 -->
	<appender name="RollingFileFatal" type="log4net.Appender.RollingFileAppender" >
		<!-- 日志文件存放位置,可以为绝对路径也可以为相对路径 -->
		<file value="logs\\" />
		<!-- 日志文件的命名规则 -->
		<datePattern value="yyyy-MM-dd/'Fatal.log'"/>
		<!-- 将日志信息追加到已有的日志文件中-->
		<appendToFile value="true" />
		<rollingStyle value="Size" />
		<maxSizeRollBackups value="100" />
		<maximumFileSize value="3MB" />
		<!-- 指定按日期切分日志文件 -->
		<rollingStyle value="Date"/>
		<!-- 当将日期作为日志文件的名字时,必须将staticLogFileName的值设置为false -->
		<staticLogFileName value="false" />
		<!-- 最小锁定模式,以允许多个进程可以写入同一个文件 -->
		<lockingModel type="log4net.Appender.FileAppender+MinimalLock" />
		<layout type="log4net.Layout.PatternLayout">
			<conversionPattern value="%newline%newline【日志时间】:%d  【线程ID】:%thread    %newline【日志级别】:%-5p  %newline【日志对象】:%logger  %newline【日志内容】:%m%newline" />
		</layout>
		<filter type="log4net.Filter.LevelRangeFilter">
			<param name="LevelMin" value="Fatal" />
			<param name="LevelMax" value="Fatal" />
		</filter>
	</appender>

	<!--数据库配置-->
	<appender name="logAppender_SqlServer" type="log4net.Appender.ADONetAppender">
		<bufferSize value="0"/>
		<connectionType value="System.Data.SqlClient.SqlConnection, System.Data, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089"/>
		<!--链接数据库配置-->
			<connectionString value="Data Source=xxxxxxxx;Initial Catalog=xxxxxxxx;User ID=sa;Password=********;"/>
			<commandText value="INSERT INTO LogData ([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="50"/>
				<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="200"/>
				<layout type="log4net.Layout.PatternLayout">
					<conversionPattern value="%logger"/>
				</layout>
			</parameter>
			<parameter>
				<parameterName value="@message"/>
				<dbType value="String"/>
				<size value="2000"/>
				<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 比如定义级别为INFO,则INFO级别向下的级别,比如DEBUG日志将不会被记录 如果没有定义LEVEL的值,则缺省为DEBUG-->
		<appender-ref ref="RollingFileDebug" />
		<appender-ref ref="RollingFileInfo" />
		<appender-ref ref="RollingFileWarn" />
		<appender-ref ref="RollingFileError" />
		<appender-ref ref="RollingFileFatal" />
		<appender-ref ref="logAppender_SqlServer" />		
		<level value="DEBUG" />

	</root>

</log4net>

http://www.niftyadmin.cn/n/5380218.html

相关文章

C++ 多起点的bfs(五十九)【第六篇】

今天我们来学习多起点的bfs 1.多起点的bfs 在普通的广度优先搜索问题中&#xff0c;为了得到从初始状态到达目标状态的最小操作数&#xff0c;则将初始状态放入队列中。离初始状态由近及远地不断扩展出新的状态&#xff0c;直到搜索到目的状态&#xff0c;或队列为空&#xff…

上位机图像处理和嵌入式模块部署(cmake的使用)

【 声明&#xff1a;版权所有&#xff0c;欢迎转载&#xff0c;请勿用于商业用途。 联系信箱&#xff1a;feixiaoxing 163.com】 过去我们编写windows程序的时候&#xff0c;习惯上都是直接使用visual studio创建工程开发。而开发linux程序的时候&#xff0c;则是编写好c、cpp代…

在 CentOS 平台下安装与配置 MySQL 5.7.36

CentOS平台常用有三种MySQL安装方式&#xff0c;即RPM安装包、二进制压缩包和源码包。一般来讲&#xff0c;建议使用二进制压缩包&#xff0c;因为该版本比其他的分发版使用起来要简单灵活。本次实验在 CentOS 7.6 平台上选用二进制压缩包安装方式。 1、清理MySQL安装环境 Cent…

@ 代码随想录算法训练营第8周(C语言)|Day51(动态规划)

代码随想录算法训练营第8周&#xff08;C语言&#xff09;|Day51&#xff08;动态规划&#xff09; Day51、动态规划&#xff08;包含题目 139.单词拆分 &#xff09; 139.单词拆分 题目描述 给定一个非空字符串 s 和一个包含非空单词的列表 wordDict&#xff0c;判定 s 是…

helm部署gitlab-runner问题解决

关于.gitlab-ci.yml中build镜像时&#xff0c;docker守护进程未启动错误 问题截图 解决方法 conf.toml添加 [[runners.kubernetes.volumes.host_path]]name "docker"mount_path "/var/run/docker.sock"read_only falsehost_path "/var/run/dock…

python中break和continue的用法

目录 continue&#xff1a;结束本次循环 break&#xff1a;终止最近的整个循环 跳出多重循环 continue&#xff1a;结束本次循环 s "python" for i in s:if i o:continueprint(i) 当i等于o时&#xff0c;结束整个循环&#xff0c;所以o和n都不打印出来 break&…

Doris ——SQL原理解析

目录 前言 一、Doris简介 二、SQL解析简介 2.1 词法分析 2.2 语法分析 2.3 逻辑计划 2.4 物理计划 三、Doris SQL解析的总体架构 四、Parse阶段 五、Analyze阶段 六、SinglePlan阶段&#xff08;生成单机逻辑Plan阶段&#xff09; 七、DistributedPlan计划&#xf…

Spring学习笔记(二)Spring的控制反转(设计原则)与依赖注入(设计模式)

一、控制反转&#xff1a;缩写IoC 是一种设计原则&#xff0c;降低程序代码之间的耦合度 对象由Ioc容器统一管理&#xff0c;当程序需要使用对象时直接从IoC容器中获取。这样对象的控制权就从应用程序转移到了IoC容器 二、依赖注入&#xff1a;缩写DI 依赖注入是一种消除类之…