本文介绍: log4net详解,从配置文件到帮助类的编写

一、Log4net概述

log4net 是从 java 下有卓越表现的 log4j 移植过来的,是一个能够将日志信息输出到各种 不同目标的.net 类库,主要作用是将程序调试运行时的各种日志信息进行记录,通俗来讲log4net是一个帮助程序员日志语句输出到各种输出目标工具log4net 包的设计使得日志语句可以保留在发布代码中,而不会产生高性能成本官网地址

log4net主要几个方法

控制级别,由低到高: ALL | DEBUG | INFO | WARN | ERROR | FATAL | OFF,<level>标签配置写入级别写入配置级别以上日志。

日志类型如下
DEBUG:调试日志,开发完成后几乎不用,我一般都直接不写这个配置
INFO:基本日志信息,最常用的;
WARN:警告日志信息,不常用;
ERROR:错误日志,异常日志信息,常用;
FATAL:致命错误日志信息,不常用;

二、配置教程

这篇博客适合Log4net小白这里,你要清楚几个问题log4net配置文件什么结构如何程序代码正确调用配置文件?你要怎么配?你要实现什么样的逻辑功能

篇文章实现功能逻辑 配置一个全局日志帮助类,能够给整个项目进行调用,其中,类方法这些,我写在功能模块上,其他项目通过引用生成好的公共模块dll文件正常调用日志帮助类里的静态方法。其中,我将配置三种日志记录模式,以满足以后日志记录的功能需求文件日志、控制台日志、数据库日志我用Sql日志,它支持各种数据库)。

其中,我在文件日志再细分:默认文件日志、默认文件异常日志、管理员权限文件日志、管理员权限异常文件日志;
控制台日志再细分:默认控制台日志、控制台异常日志、有颜色控制台日志、有颜色控制台异常日志

1、配置文件详解

先直接贴我整个项目配好能用的源码如下

<?xml version="1.0" encoding="utf-8" ?>
<configuration>
	<configSections>
		<section name="log4net" type="log4net.Config.Log4NetConfigurationSectionHandler, log4net"/>
	</configSections>
	<!--站点日志配置部分-->
	<log4net>
		<!-- OFF, FATAL, ERROR, WARN, INFO, DEBUG, ALL -->
		<!-- Set root logger level to ERROR and its appenders -->
		<!--
		<root>:实际上就是一个根logger,所有其它logger默认继承支持元素appender-ref:0个或多个,要引用appender名字level:最多一个。 只有在这个级别或之上的事件才会被记录param:0个或多个, 设置一些参数;
		-->
		<root>
			<!--控制级别,由低到高: ALL|DEBUG|INFO|WARN|ERROR|FATAL|OFF-->
			<!--比如定义级别为INFO,则INFO级别向下的级别比如DEBUG日志将不会被记录-->
			<!--如果没有定义LEVEL的值,则默认为DEBUG-->
			<level value="INFO"/>
		</root>
		
		
		<!--
		<logger>:
			支持属性name:必须的,logger名称
			additivity:可选,取值truefalse默认值true设置false时将阻止父logger中的appender

			支持的子元素appender-ref:0个或多个,要引用appender名字
			level:最多一个。 只有在这个级别或之上的事件才会被记录。
			param:0个或多个, 设置一些参数。
		-->
		<!--只记录文件日志-->
		<!--默认日志-->
		<logger name="Default_File" additivity="false">
			<level value="INFO"/>
			<appender-ref ref="DefaultLogFileAppender_Info"/>
			<appender-ref ref="DefaultLogFileAppender_Debug"/>
			<appender-ref ref="DefaultLogFileAppender_Warn"/>
			<appender-ref ref="DefaultLogFileAppender_Error"/>
			<appender-ref ref="DefaultLogFileAppender_Fatal"/>
		</logger>

		<!--默认异常日志-->
		<logger name="Default_Ex_File" additivity="false">
			<level value="ERROR"/>
			<appender-ref ref="DefaultLogFileAppender_Ex_Error"/>
			<appender-ref ref="DefaultLogFileAppender_Ex_Fatal"/>
		</logger>

		<!--管理权限日志-->
		<logger name="Admin_File" additivity="false">
			<level value="INFO"/>
			<appender-ref ref="AdminLogFileAppender_Info"/>
			<appender-ref ref="AdminLogFileAppender_Debug"/>
			<appender-ref ref="AdminLogFileAppender_Warn"/>
			<appender-ref ref="AdminLogFileAppender_Error"/>
			<appender-ref ref="AdminLogFileAppender_Fatal"/>
		</logger>

		<!--管理权限异常日志-->
		<logger name="Admin_Ex_File" additivity="false">
			<level value="ERROR"/>
			<appender-ref ref="AdminLogFileAppender_Ex_Error"/>
			<appender-ref ref="AdminLogFileAppender_Ex_Fatal"/>
		</logger>

		<!-- 控制台程序日志 -->
		<logger name="ConsoleDefault" additivity="false">
			<level value="INFO"/>
			<appender-ref ref="ConsoleAppender"/>
		</logger>
		<logger name="ColoredConsoleDefault" additivity="false">
			<level value="INFO"/>
			<appender-ref ref="ColoredConsoleAppender"/>
		</logger>
		
		<!-- 控制台异常程序日志 -->
		<logger name="ColoredConsoleDefault_Ex" additivity="false">
			<level value="ERROR"/>
			<appender-ref ref="ConsoleAppender_Ex"/>
		</logger>
		<logger name="ColoredConsoleDefault_Ex" additivity="false">
			<level value="ERROR"/>
			<appender-ref ref="ColoredConsoleAppender_Ex"/>
		</logger>
		
		
		<!-- SQL日志 -->
		<logger name="DefaultLog_Sql" additivity="false">
			<level value="INFO"/>
			<appender-ref ref="AdoNetAppender"/>
		</logger>


		<!-- 将日志写到文件中 -->
		<appender name="DefaultLogFileAppender_Info" type="log4net.Appender.RollingFileAppender">
			<!--多线程采用最小锁定:记录日志写入文件时,不锁定本文件,防止多线程时不能写Log,官方线程安全-->
			<lockingModel type="log4net.Appender.FileAppender+MinimalLock"/>
			<!-- 不自动生成空白文件 -->
			<lockingModel type="Common.Helper.MinimalLockDeleteEmpty"/>
			<!--目录路径可以相对路径绝对路径-->
			<param name="File" value="log\Info\"/>
			<!--文件名,按日期生成文件夹-->
			<param name="DatePattern" value="/yyyy-MM/&amp;quot;Info_&amp;quot;MM-dd-HH&amp;quot;.log&amp;quot;"/>
			<!--追加到文件-->
			<appendToFile value="true"/>
			<!--创建日志文件的方式可选值:Date[日期],文件大小[Size],混合[Composite]-->
			<rollingStyle value="Composite"/>
			<preserveLogFileNameExtension value="true"/>
			<!--写到一个文件-->
			<staticLogFileName value="false"/>
			<!--单个文件大小单位:KB|MB|GB-->
			<maximumFileSize value="5MB"/>
			<!--最多保留的文件数,设为"-1"则不限-->
			<maxSizeRollBackups value="20"/>
			<!--日志格式-->
			<layout type="log4net.Layout.PatternLayout">
				<param name="ConversionPattern" value="%n【%d】:%m%n" />
			</layout>
			<!--限制只写信息日志-->
			<filter type="log4net.Filter.LevelRangeFilter">
				<param name="LevelMin" value="INFO" />
				<param name="LevelMax" value="INFO" />
			</filter>
		</appender>
		<appender name="DefaultLogFileAppender_Debug" type="log4net.Appender.RollingFileAppender">
			<!--多线程采用最小锁定:记录日志写入文件时,不锁定文本文件,防止多线程时不能写Log,官方线程安全-->
			<lockingModel type="log4net.Appender.FileAppender+MinimalLock"/>
			<!--目录路径可以相对路径绝对路径-->
			<param name="File" value="log\Debug\"/>
			<!--文件名,按日期生成文件夹-->
			<param name="DatePattern" value="/yyyy-MM/&amp;quot;Debug_&amp;quot;MM-dd-HH&amp;quot;.log&quot;"/>
			<!--追加到文件-->
			<appendToFile value="true"/>
			<!--创建日志文件的方式,可选值:Date[日期],文件大小[Size],混合[Composite]-->
			<rollingStyle value="Composite"/>
			<preserveLogFileNameExtension value="true"/>
			<!--写到一个文件-->
			<staticLogFileName value="false"/>
			<!--单个文件大小单位:KB|MB|GB-->
			<maximumFileSize value="5MB"/>
			<!--最多保留的文件数,设为"-1"则不限-->
			<maxSizeRollBackups value="20"/>
			<!--日志格式-->
			<layout type="log4net.Layout.PatternLayout">
				<param name="ConversionPattern" value="%n【%d】:%m%n" />
			</layout>
			<!--限制只写信息日志-->
			<filter type="log4net.Filter.LevelRangeFilter">
				<param name="LevelMin" value="DEBUG" />
				<param name="LevelMax" value="DEBUG" />
			</filter>
		</appender>
		<appender name="DefaultLogFileAppender_Warn" type="log4net.Appender.RollingFileAppender">
			<!--多线程采用最小锁定:记录日志写入文件时,不锁定文本文件,防止多线程时不能写Log,官方说线程安全-->
			<lockingModel type="log4net.Appender.FileAppender+MinimalLock"/>
			<!-- 不自动生成空白文件 -->
			<lockingModel type="Common.Helper.MinimalLockDeleteEmpty"/>
			<!--目录路径可以相对路径或绝对路径-->
			<param name="File" value="log\Warn\"/>
			<!--文件名,按日期生成文件夹-->
			<param name="DatePattern" value="/yyyy-MM/&quot;Warn_&quot;MM-dd-HH&quot;.log&quot;"/>
			<!--追加到文件-->
			<appendToFile value="true"/>
			<!--创建日志文件的方式,可选值:Date[日期],文件大小[Size],混合[Composite]-->
			<rollingStyle value="Composite"/>
			<preserveLogFileNameExtension value="true"/>
			<!--写到一个文件-->
			<staticLogFileName value="false"/>
			<!--单个文件大小单位:KB|MB|GB-->
			<maximumFileSize value="5MB"/>
			<!--最多保留的文件数,设为"-1"则不限-->
			<maxSizeRollBackups value="20"/>
			<!--日志格式-->
			<layout type="log4net.Layout.PatternLayout">
				<param name="ConversionPattern" value="%n【%d】:%m%n" />
			</layout>
			<!--限制只写信息日志-->
			<filter type="log4net.Filter.LevelRangeFilter">
				<param name="LevelMin" value="WARN" />
				<param name="LevelMax" value="WARN" />
			</filter>
		</appender>
		<appender name="DefaultLogFileAppender_Error" type="log4net.Appender.RollingFileAppender">
			<!--多线程时采用最小锁定:记录日志写入文件时,不锁定文本文件,防止多线程时不能写Log,官方说线程安全-->
			<lockingModel type="log4net.Appender.FileAppender+MinimalLock"/>
			<!-- 不自动生成空白文件 -->
			<lockingModel type="Common.Helper.MinimalLockDeleteEmpty"/>
			<!--目录路径,可以相对路径或绝对路径-->
			<param name="File" value="log\Error\"/>
			<!--文件名,按日期生成文件夹-->
			<param name="DatePattern" value="/yyyy-MM/&quot;Error_&quot;MM-dd-HH&quot;.log&quot;"/>
			<!--追加到文件-->
			<appendToFile value="true"/>
			<!--创建日志文件的方式,可选值:Date[日期],文件大小[Size],混合[Composite]-->
			<rollingStyle value="Composite"/>
			<preserveLogFileNameExtension value="true"/>
			<!--写到一个文件-->
			<staticLogFileName value="false"/>
			<!--单个文件大小单位:KB|MB|GB-->
			<maximumFileSize value="5MB"/>
			<!--最多保留的文件数,设为"-1"则不限-->
			<maxSizeRollBackups value="20"/>
			<!--日志格式-->
			<layout type="log4net.Layout.PatternLayout">
				<param name="ConversionPattern" value="%n【%d】:%m%n" />
			</layout>
			<!--限制只写信息日志-->
			<filter type="log4net.Filter.LevelRangeFilter">
				<param name="LevelMin" value="ERROR" />
				<param name="LevelMax" value="ERROR" />
			</filter>
		</appender>
		<appender name="DefaultLogFileAppender_Fatal" type="log4net.Appender.RollingFileAppender">
			<!--多线程时采用最小锁定:记录日志写入文件时,不锁定文本文件,防止多线程时不能写Log,官方说线程非安全-->
			<lockingModel type="log4net.Appender.FileAppender+MinimalLock"/>
			<!-- 不自动生成空白文件 -->
			<lockingModel type="Common.Helper.MinimalLockDeleteEmpty"/>
			<!--目录路径,可以相对路径或绝对路径-->
			<param name="File" value="log\Fatal\"/>
			<!--文件名,按日期生成文件夹-->
			<param name="DatePattern" value="/yyyy-MM/&quot;Fatal_&quot;MM-dd-HH&quot;.log&quot;"/>
			<!--追加到文件-->
			<appendToFile value="true"/>
			<!--创建日志文件的方式,可选值:Date[日期],文件大小[Size],混合[Composite]-->
			<rollingStyle value="Composite"/>
			<preserveLogFileNameExtension value="true"/>
			<!--写到一个文件-->
			<staticLogFileName value="false"/>
			<!--单个文件大小单位:KB|MB|GB-->
			<maximumFileSize value="5MB"/>
			<!--最多保留的文件数,设为"-1"则不限-->
			<maxSizeRollBackups value="20"/>
			<!--日志格式-->
			<layout type="log4net.Layout.PatternLayout">
				<param name="ConversionPattern" value="%n【%d】:%m%n" />
			</layout>
			<!--限制只写信息日志-->
			<filter type="log4net.Filter.LevelRangeFilter">
				<param name="LevelMin" value="FATAL" />
				<param name="LevelMax" value="FATAL" />
			</filter>
		</appender>
		
		<appender name="DefaultLogFileAppender_Ex_Error" type="log4net.Appender.RollingFileAppender">
			<!--多线程时采用最小锁定:记录日志写入文件时,不锁定文本文件,防止多线程时不能写Log,官方说线程非安全-->
			<lockingModel type="log4net.Appender.FileAppender+MinimalLock"/>
			<!-- 不自动生成空白文件 -->
			<lockingModel type="Common.Helper.MinimalLockDeleteEmpty"/>
			<!--目录路径,可以是相对路径或绝对路径-->
			<param name="File" value="log\Error\"/>
			<!--文件名,按日期生成文件夹-->
			<param name="DatePattern" value="/yyyy-MM/&quot;Error_&quot;MM-dd-HH&quot;.log&quot;"/>
			<!--追加到文件-->
			<appendToFile value="true"/>
			<!--创建日志文件的方式,可选值:Date[日期],文件大小[Size],混合[Composite]-->
			<rollingStyle value="Composite"/>
			<preserveLogFileNameExtension value="true"/>
			<!--写到一个文件-->
			<staticLogFileName value="false"/>
			<!--单个文件大小。单位:KB|MB|GB-->
			<maximumFileSize value="5MB"/>
			<!--最多保留的文件数,设为"-1"则不限-->
			<maxSizeRollBackups value="20"/>
			<!--日志格式-->
			<layout type="log4net.Layout.PatternLayout">
				<param name="ConversionPattern" value="%n【%d】:%m%n【异常信息】:%exception%n" />
			</layout>
			<!--限制只写信息日志-->
			<filter type="log4net.Filter.LevelRangeFilter">
				<param name="LevelMin" value="ERROR" />
				<param name="LevelMax" value="ERROR" />
			</filter>
		</appender>
		<appender name="DefaultLogFileAppender_Ex_Fatal" type="log4net.Appender.RollingFileAppender">
			<!--多线程时采用最小锁定:记录日志写入文件时,不锁定文本文件,防止多线程时不能写Log,官方说线程非安全-->
			<lockingModel type="log4net.Appender.FileAppender+MinimalLock"/>
			<!-- 不自动生成空白文件 -->
			<lockingModel type="Common.Helper.MinimalLockDeleteEmpty"/>
			<!--目录路径,可以是相对路径或绝对路径-->
			<param name="File" value="log\Fatal\"/>
			<!--文件名,按日期生成文件夹-->
			<param name="DatePattern" value="/yyyy-MM/&quot;Fatal_&quot;MM-dd-HH&quot;.log&quot;"/>
			<!--追加到文件-->
			<appendToFile value="true"/>
			<!--创建日志文件的方式,可选值:Date[日期],文件大小[Size],混合[Composite]-->
			<rollingStyle value="Composite"/>
			<preserveLogFileNameExtension value="true"/>
			<!--写到一个文件-->
			<staticLogFileName value="false"/>
			<!--单个文件大小。单位:KB|MB|GB-->
			<maximumFileSize value="5MB"/>
			<!--最多保留的文件数,设为"-1"则不限-->
			<maxSizeRollBackups value="20"/>
			<!--日志格式-->
			<layout type="log4net.Layout.PatternLayout">
				<param name="ConversionPattern" value="%n【%d】:%m%n【异常信息】:%exception%n" />
			</layout>
			<!--限制只写信息日志-->
			<filter type="log4net.Filter.LevelRangeFilter">
				<param name="LevelMin" value="FATAL" />
				<param name="LevelMax" value="FATAL" />
			</filter>
		</appender>
		
		<!-- Admin_File管理权限的日志 -->
		<appender name="AdminLogFileAppender_Info" type="log4net.Appender.RollingFileAppender">
			<!--多线程时采用最小锁定:记录日志写入文件时,不锁定文本文件,防止多线程时不能写Log,官方说线程非安全-->
			<lockingModel type="log4net.Appender.FileAppender+MinimalLock"/>
			<!-- 不自动生成空白文件 -->
			<lockingModel type="Common.Helper.MinimalLockDeleteEmpty"/>
			<!--目录路径,可以是相对路径或绝对路径-->
			<param name="File" value="log\Info\"/>
			<!--文件名,按日期生成文件夹-->
			<param name="DatePattern" value="/yyyy-MM/&quot;Info_&quot;MM-dd-HH&quot;.log&quot;"/>
			<!--追加到文件-->
			<appendToFile value="true"/>
			<!--创建日志文件的方式,可选值:Date[日期],文件大小[Size],混合[Composite]-->
			<rollingStyle value="Composite"/>
			<preserveLogFileNameExtension value="true"/>
			<!--写到一个文件-->
			<staticLogFileName value="false"/>
			<!--单个文件大小。单位:KB|MB|GB-->
			<maximumFileSize value="5MB"/>
			<!--最多保留的文件数,设为"-1"则不限-->
			<maxSizeRollBackups value="20"/>
			<!--日志格式-->
			<layout type="log4net.Layout.PatternLayout">
				<param name="ConversionPattern" value="%n【%d】:%m%n【源码信息】:%location%n" />
			</layout>
			<!--限制只写信息日志-->
			<filter type="log4net.Filter.LevelRangeFilter">
				<param name="LevelMin" value="INFO" />
				<param name="LevelMax" value="INFO" />
			</filter>
		</appender>
		<appender name="AdminLogFileAppender_Debug" type="log4net.Appender.RollingFileAppender">
			<!--多线程时采用最小锁定:记录日志写入文件时,不锁定文本文件,防止多线程时不能写Log,官方说线程非安全-->
			<lockingModel type="log4net.Appender.FileAppender+MinimalLock"/>
			<!-- 不自动生成空白文件 -->
			<lockingModel type="Common.Helper.MinimalLockDeleteEmpty"/>
			<!--目录路径,可以是相对路径或绝对路径-->
			<param name="File" value="log\Debug\"/>
			<!--文件名,按日期生成文件夹-->
			<param name="DatePattern" value="/yyyy-MM/&quot;Debug_&quot;MM-dd-HH&quot;.log&quot;"/>
			<!--追加到文件-->
			<appendToFile value="true"/>
			<!--创建日志文件的方式,可选值:Date[日期],文件大小[Size],混合[Composite]-->
			<rollingStyle value="Composite"/>
			<preserveLogFileNameExtension value="true"/>
			<!--写到一个文件-->
			<staticLogFileName value="false"/>
			<!--单个文件大小。单位:KB|MB|GB-->
			<maximumFileSize value="5MB"/>
			<!--最多保留的文件数,设为"-1"则不限-->
			<maxSizeRollBackups value="20"/>
			<!--日志格式-->
			<layout type="log4net.Layout.PatternLayout">
				<param name="ConversionPattern" value="%n【%d】:%m%n【源码信息】:%location%n" />
			</layout>
			<!--限制只写信息日志-->
			<filter type="log4net.Filter.LevelRangeFilter">
				<param name="LevelMin" value="DEBUG" />
				<param name="LevelMax" value="DEBUG" />
			</filter>
		</appender>
		<appender name="AdminLogFileAppender_Warn" type="log4net.Appender.RollingFileAppender">
			<!--多线程时采用最小锁定:记录日志写入文件时,不锁定文本文件,防止多线程时不能写Log,官方说线程非安全-->
			<lockingModel type="log4net.Appender.FileAppender+MinimalLock"/>
			<!-- 不自动生成空白文件 -->
			<lockingModel type="Common.Helper.MinimalLockDeleteEmpty"/>
			<!--目录路径,可以是相对路径或绝对路径-->
			<param name="File" value="log\Warn\"/>
			<!--文件名,按日期生成文件夹-->
			<param name="DatePattern" value="/yyyy-MM/&quot;Warn_&quot;MM-dd-HH&quot;.log&quot;"/>
			<!--追加到文件-->
			<appendToFile value="true"/>
			<!--创建日志文件的方式,可选值:Date[日期],文件大小[Size],混合[Composite]-->
			<rollingStyle value="Composite"/>
			<preserveLogFileNameExtension value="true"/>
			<!--写到一个文件-->
			<staticLogFileName value="false"/>
			<!--单个文件大小。单位:KB|MB|GB-->
			<maximumFileSize value="5MB"/>
			<!--最多保留的文件数,设为"-1"则不限-->
			<maxSizeRollBackups value="20"/>
			<!--日志格式-->
			<layout type="log4net.Layout.PatternLayout">
				<param name="ConversionPattern" value="%n【%d】:%m%n【源码信息】:%location%n" />
			</layout>
			<!--限制只写信息日志-->
			<filter type="log4net.Filter.LevelRangeFilter">
				<param name="LevelMin" value="WARN" />
				<param name="LevelMax" value="WARN" />
			</filter>
		</appender>
		<appender name="AdminLogFileAppender_Error" type="log4net.Appender.RollingFileAppender">
			<!--多线程时采用最小锁定:记录日志写入文件时,不锁定文本文件,防止多线程时不能写Log,官方说线程非安全-->
			<lockingModel type="log4net.Appender.FileAppender+MinimalLock"/>
			<!-- 不自动生成空白文件 -->
			<lockingModel type="Common.Helper.MinimalLockDeleteEmpty"/>
			<!--目录路径,可以是相对路径或绝对路径-->
			<param name="File" value="log\Error\"/>
			<!--文件名,按日期生成文件夹-->
			<param name="DatePattern" value="/yyyy-MM/&quot;Error_&quot;MM-dd-HH&quot;.log&quot;"/>
			<!--追加到文件-->
			<appendToFile value="true"/>
			<!--创建日志文件的方式,可选值:Date[日期],文件大小[Size],混合[Composite]-->
			<rollingStyle value="Composite"/>
			<preserveLogFileNameExtension value="true"/>
			<!--写到一个文件-->
			<staticLogFileName value="false"/>
			<!--单个文件大小。单位:KB|MB|GB-->
			<maximumFileSize value="5MB"/>
			<!--最多保留的文件数,设为"-1"则不限-->
			<maxSizeRollBackups value="20"/>
			<!--日志格式-->
			<layout type="log4net.Layout.PatternLayout">
				<param name="ConversionPattern" value="%n【%d】:%m%n【源码信息】:%location%n" />
			</layout>
			<!--限制只写信息日志-->
			<filter type="log4net.Filter.LevelRangeFilter">
				<param name="LevelMin" value="ERROR" />
				<param name="LevelMax" value="ERROR" />
			</filter>
		</appender>
		<appender name="AdminLogFileAppender_Fatal" type="log4net.Appender.RollingFileAppender">
			<!--多线程时采用最小锁定:记录日志写入文件时,不锁定文本文件,防止多线程时不能写Log,官方说线程非安全-->
			<lockingModel type="log4net.Appender.FileAppender+MinimalLock"/>
			<!-- 不自动生成空白文件 -->
			<lockingModel type="Common.Helper.MinimalLockDeleteEmpty"/>
			<!--目录路径,可以是相对路径或绝对路径-->
			<param name="File" value="log\Fatal\"/>
			<!--文件名,按日期生成文件夹-->
			<param name="DatePattern" value="/yyyy-MM/&quot;Fatal_&quot;MM-dd-HH&quot;.log&quot;"/>
			<!--追加到文件-->
			<appendToFile value="true"/>
			<!--创建日志文件的方式,可选值:Date[日期],文件大小[Size],混合[Composite]-->
			<rollingStyle value="Composite"/>
			<preserveLogFileNameExtension value="true"/>
			<!--写到一个文件-->
			<staticLogFileName value="false"/>
			<!--单个文件大小。单位:KB|MB|GB-->
			<maximumFileSize value="5MB"/>
			<!--最多保留的文件数,设为"-1"则不限-->
			<maxSizeRollBackups value="20"/>
			<!--日志格式-->
			<layout type="log4net.Layout.PatternLayout">
				<param name="ConversionPattern" value="%n【%d】:%m%n【源码信息】:%location%n" />
			</layout>
			<!--限制只写信息日志-->
			<filter type="log4net.Filter.LevelRangeFilter">
				<param name="LevelMin" value="FATAL" />
				<param name="LevelMax" value="FATAL" />
			</filter>
		</appender>
		
		<!-- Admin_Ex_File管理权限的异常日志 -->
		<appender name="AdminLogFileAppender_Ex_Error" type="log4net.Appender.RollingFileAppender">
			<!--多线程时采用最小锁定:记录日志写入文件时,不锁定文本文件,防止多线程时不能写Log,官方说线程非安全-->
			<lockingModel type="log4net.Appender.FileAppender+MinimalLock"/>
			<!-- 不自动生成空白文件 -->
			<lockingModel type="Common.Helper.MinimalLockDeleteEmpty"/>
			<!--目录路径,可以是相对路径或绝对路径-->
			<param name="File" value="log\Error\"/>
			<!--文件名,按日期生成文件夹-->
			<param name="DatePattern" value="/yyyy-MM/&quot;Error_&quot;MM-dd-HH&quot;.log&quot;"/>
			<!--追加到文件-->
			<appendToFile value="true"/>
			<!--创建日志文件的方式,可选值:Date[日期],文件大小[Size],混合[Composite]-->
			<rollingStyle value="Composite"/>
			<preserveLogFileNameExtension value="true"/>
			<!--写到一个文件-->
			<staticLogFileName value="false"/>
			<!--单个文件大小。单位:KB|MB|GB-->
			<maximumFileSize value="5MB"/>
			<!--最多保留的文件数,设为"-1"则不限-->
			<maxSizeRollBackups value="20"/>
			<!--日志格式-->
			<layout type="log4net.Layout.PatternLayout">
				<param name="ConversionPattern" value="%n【%d】:%m%n【源码信息】:%location%n【异常信息】:%exception%n" />
			</layout>
			<!--限制只写信息日志-->
			<filter type="log4net.Filter.LevelRangeFilter">
				<param name="LevelMin" value="ERROR" />
				<param name="LevelMax" value="ERROR" />
			</filter>
		</appender>
		<appender name="AdminLogFileAppender_Ex_Fatal" type="log4net.Appender.RollingFileAppender">
			<!--多线程时采用最小锁定:记录日志写入文件时,不锁定文本文件,防止多线程时不能写Log,官方说线程非安全-->
			<lockingModel type="log4net.Appender.FileAppender+MinimalLock"/>
			<!-- 不自动生成空白文件 -->
			<lockingModel type="Common.Helper.MinimalLockDeleteEmpty"/>
			<!--目录路径,可以是相对路径或绝对路径-->
			<param name="File" value="log\Fatal\"/>
			<!--文件名,按日期生成文件夹-->
			<param name="DatePattern" value="/yyyy-MM/&quot;Fatal_&quot;MM-dd-HH&quot;.log&quot;"/>
			<!--追加到文件-->
			<appendToFile value="true"/>
			<!--创建日志文件的方式,可选值:Date[日期],文件大小[Size],混合[Composite]-->
			<rollingStyle value="Composite"/>
			<preserveLogFileNameExtension value="true"/>
			<!--写到一个文件-->
			<staticLogFileName value="false"/>
			<!--单个文件大小。单位:KB|MB|GB-->
			<maximumFileSize value="5MB"/>
			<!--最多保留的文件数,设为"-1"则不限-->
			<maxSizeRollBackups value="20"/>
			<!--日志格式-->
			<layout type="log4net.Layout.PatternLayout">
				<param name="ConversionPattern" value="%n【%d】:%m%n【源码信息】:%location%n【异常信息】:%exception%n" />
			</layout>
			<!--限制只写信息日志-->
			<filter type="log4net.Filter.LevelRangeFilter">
				<param name="LevelMin" value="FATAL" />
				<param name="LevelMax" value="FATAL" />
			</filter>
		</appender>
		

		<!-- 将日志输出控制台 -->
		<appender name="ConsoleAppender"  type="log4net.Appender.ConsoleAppender" >
			<layout type="log4net.Layout.PatternLayout">
				<param name="ConversionPattern"  value="%n【[%5p][%d]】=> %m%n" />
			</layout>
			<filter type="log4net.Filter.LevelRangeFilter">
				<param name="LevelMin" value="INFO" />
				<param name="LevelMax" value="WARN" />
			</filter>
		</appender>
		
		<!-- 控制台异常日志 -->
		<appender name="ConsoleAppender_Ex"  type="log4net.Appender.ConsoleAppender" >
			<layout type="log4net.Layout.PatternLayout">
				<param name="ConversionPattern"  value="%n【[%5p][%d]】=> %m%n【异常信息】:%exception%n" />
			</layout>
			<filter type="log4net.Filter.LevelRangeFilter">
				<param name="LevelMin" value="ERROR" />
				<param name="LevelMax" value="FATAL" />
			</filter>
		</appender>

		<!-- 控制颜色日志 -->
		<appender name="ColoredConsoleAppender"  type="log4net.Appender.ColoredConsoleAppender" >
			<mapping>
				<level value="WARN" />
				<foreColor value="Yellow" />
			</mapping>
			<layout type="log4net.Layout.PatternLayout">
				<param name="ConversionPattern"  value="%n【[%5p][%d]】=> %m%n" />
			</layout>
			<filter type="log4net.Filter.LevelRangeFilter">
				<param name="LevelMin" value="INFO" />
				<param name="LevelMax" value="WARN" />
			</filter>
		</appender>

		<!-- 控制台颜色异常日志 -->
		<appender name="ColoredConsoleAppender_Ex"  type="log4net.Appender.ColoredConsoleAppender" >
			<mapping>
				<level value="FATAL" />
				<foreColor value="White" />
				<backColor value="Red" />
			</mapping>
			<mapping>
				<level value="ERROR" />
				<foreColor value="Red" />
			</mapping>
			
			<layout type="log4net.Layout.PatternLayout">
				<param name="ConversionPattern"  value="%n【[%5p][%d]】=> %m%n【异常信息】:%exception%n" />
			</layout>
			<filter type="log4net.Filter.LevelRangeFilter">
				<param name="LevelMin" value="ERROR" />
				<param name="LevelMax" value="FATAL" />
			</filter>
		</appender>
		
		<!-- 将日志写入到数据库 -->
		<appender name="AdoNetAppender" type="log4net.Appender.AdoNetAppender">
			<!--BufferSize为缓冲区大小,只有日志记录达到设定值才会一块写入到数据库-->
			<bufferSize value="1" />
			<!--postgresql需要客户端控件-->
			<connectionType value="System.Data.SqlClient.SqlConnection, System.Data, Version=1.0.3300.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" />
			<connectionString value="Data Source=.;Initial Catalog=DataCow;Integrated Security=True" />
			<commandText value="insert into [UserLog]([LogKindID],[Operator],[LogContent]) values(@LogKindID,@Operator,@LogContent)" />
			
			<parameter>
				<parameterName value="@LogKindID" />
				<dbType value="Int32" />
				<layout type="Common.Helper.MyLayout" >
					<conversionPattern value="%property{LogKindID}" />
				</layout>
			</parameter>
			<parameter>
				<parameterName value="@Operator" />
				<dbType value="Int32" />
				<layout type="Common.Helper.MyLayout">
					<conversionPattern value="%property{Operator}" />
				</layout>
			</parameter>
			<parameter>
				<parameterName value="@LogContent" />
				<dbType value="String" />
				<!--长度不可以省略,否则不会输出-->
				<size value="2000000000" />
				<layout type="Common.Helper.MyLayout">
					<conversionPattern value="%property{LogContent}" />
				</layout>
			</parameter>
			<filter type="log4net.Filter.LevelRangeFilter">
				<param name="LevelMin" value="INFO" />
				<param name="LevelMax" value="INFO" />
			</filter>
			
		</appender>
		
	</log4net>
</configuration>

其中,你要知道几个重要的标签<log4net>、<root>、<logger>、<level>、<appender-ref>、<appender>:
其中配置几乎全写在<log4net>标签下;
<root>标签可以解读为全局配置;
<logger>可以理解子类继承<root>;
<appender-ref>是<appender>的关联桥梁,类似数据表外键
<appender>日志类型的详细配置在这里完成,最难配也是最复杂的一个标签
上面标签具体什么应用,我配置文件上有写,并且可以看这篇大佬的博文
上面大佬博文也有配置参数(<layout>标签下的参数,仅支持标签:%d、%m、%n、%location、%exception等)的使用,我就不写了,大家好看那篇博文

其中,我要讲的一些配置坑:
(1)数据库配置标签下的<parameter><dbType value=“String” />,这个数据类型,你要明白dbType数据类型数据库数据类型与C#数据类型是怎么一一对应的(自己百度,或者直接看我参考大佬的博文1大佬的博文2

(2)log4net日志框架每次都会生成很多配置的空白文件,为了不自动生成空白文件,我加了这个标签 <lockingModel type=“Common.Helper.MinimalLockDeleteEmpty”/>其中,Common.Helper.MinimalLockDeleteEmpty是我自己封装的log4net帮助类。

	/// <summary>
    /// 避免生成空白文件
    /// </summary>
    public class MinimalLockDeleteEmpty : FileAppender.MinimalLock
    {
        public override void ReleaseLock()
        {
            base.ReleaseLock();

            var logFile = new FileInfo(CurrentAppender.File);
            if (logFile.Exists && logFile.Length <= 0)
            {
                logFile.Delete();
            }
        }
    }

(3)配数据库的不能乱改,要不会出很多问题,其中下面的不能乱配,要知道怎么配

<!--这个就别乱改了,我之前改了就写入不了-->
<connectionType value="System.Data.SqlClient.SqlConnection, System.Data, Version=1.0.3300.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" />
<!--这个就是常规的数据配置,不懂得,可以参考一下步骤:
1、用vs工具连接数据库;
2、	点击数据名称,右下角会出现数据库属性框;
3、选择连接字符串”,复制值进行粘贴;
-->
<connectionString value="Data Source=.;Initial Catalog=DataCow;Integrated Security=True" />

2、程序配置文件

(1)配置日志调试文件: 配置过Log4net的同学知道内部的一些报错很难排查原因,所以,开发为了更加方便,我们一般要在开发前,将项目的配置文件配下,从而记录log4net的运行日志(记录在:Log4Net_Debug.txt文件)。我在Web.config文件下配置的,下面代码不是全部代码,直接将注释下的标签代码复制自己项目的配置文件,千万不要直接复制粘贴,懂得都懂,代码如下

<?xml version="1.0" encoding="utf-8"?>
<!--
  For more information on how to configure your ASP.NET application, please visit
  https://go.microsoft.com/fwlink/?LinkId=301880
  -->
<configuration>
	<appSettings>
		<!-- log4Net的运行Debug日志,log4net框架开发完毕可删除 -->
		<add key="log4net.Internal.Debug" value="true"/>
	</appSettings>

	<!-- log4Net的运行Debug日志,log4net框架开发完毕可删除 -->
	<<system.diagnostics>
		<trace autoflush="true">
			<listeners>
				<add
					name="textWriterTraceListener"
					type="System.Diagnostics.TextWriterTraceListener"
					initializeData="logDebugLog4Net_Debug.txt" />
			</listeners>
		</trace>
	</system.diagnostics>
</configuration>

(2)全局配置:在公共模块下的AssemblyInfo.cs类,加入下面代码
在这里插入图片描述

//log4net框架配置
/*
 * XmlConfiguratorAttribute
The log4net.Config.XmlConfiguratorAttribute Allows the XmlConfigurator to be configured using the following properties:

ConfigFile
If specified, this is the filename of the configuration file to use with the XmlConfigurator. This file path is relative to the application base directory (AppDomain.CurrentDomain.BaseDirectory).

This property cannot be used in conjunction with the ConfigFileExtension property.

ConfigFileExtension
If specified, this is the extension for the configuration file. The assembly file name is used as the base name with the this extension appended. For example if the assembly is loaded from the a file TestApp.exe and the ConfigFileExtension property is set to log4net then the configuration file name is TestApp.exe.log4net. This is equivalent to setting the ConfigFile property to TestApp.exe.log4net.

The path to the configuration file is build by using the application base directory (AppDomain.CurrentDomain.BaseDirectory), the assembly file name and the configuration file extension.

This property cannot be used in conjunction with the ConfigFile property.

Watch
If this flag is specified and set to true then the framework will watch the configuration file and will reload the config each time the file is modified.

If neither of the ConfigFile or ConfigFileExtension properties are specified, the application configuration file (e.g. TestApp.exe.config) will be used as the log4net configuration file.
 */
[assembly: log4net.Config.XmlConfigurator(Watch = true, ConfigFile = "log4Net.config")] // 指定读取log4net 的配置文件

(3)log4Net.config文件放的位置 这个文件不能乱放,一定要放对位置,当然,假如你直接将配置信息写到项目文件配置文件下,那就跟我的有点不一样了,我是独立出来的,这样比较管理。这配置文件一定要放到项目启动项的下面,比如,webforme,mvc程序,直接放Web.config的同级目录,控制台程序,要放在 **.exe文件下面,一般在项目的Debug文件夹下。

3、日志帮助类的编写

经过以上,项目里应该差不多配置好了,接下来就要写日志帮助类了,这样才能正常调用并正常实现自己需要的日志逻辑功能,下面我全部的日志帮助类代码
帮助类:

using Common.Models;
using log4net;
using log4net.Appender;
using System;
using System.Collections.Generic;
using System.IO;
using System.Linq;
using System.Reflection;
using System.Text;
using System.Threading.Tasks;

namespace Common.Helper
{
    /// <summary>
    /// 对应log4Net.config文件logger的name属性
    /// </summary>
    public enum log4NetConfigEnum
    {
        //文件日志
        Default_File=1,             //默认文件日志
        Default_Ex_File,            //默认文件异常日志
        Admin_File,                 //管理员权限文件日志
        Admin_Ex_File,              //管理员权限异常文件日志

        //控制台日志
        ConsoleDefault,                    //默认控制台日志
        ConsoleDefault_Ex,                 //控制台异常日志
        ColoredConsoleDefault,              //有颜色的控制台日志
        ColoredConsoleDefault_Ex,            //有颜色的控制台异常日志

        //Sql日志
        DefaultLog_Sql                  //默认Sql数据库日志

    }

    /// <summary>
    /// 避免生成空白文件
    /// </summary>
    public class MinimalLockDeleteEmpty : FileAppender.MinimalLock
    {
        public override void ReleaseLock()
        {
            base.ReleaseLock();

            var logFile = new FileInfo(CurrentAppender.File);
            if (logFile.Exists && logFile.Length <= 0)
            {
                logFile.Delete();   
            }
        }
    }

    public abstract class ILogHelper<T> where T:class
    {
        #region Log4Net
        public static ILog iLog { get; set; } = GetLogConfig<T>();

        public static void Debug(LogModel logModel)
        {
            if (!iLog.IsDebugEnabled|| logModel==null)
                return;

            var ex = logModel.exception;
            var msg = logModel.LogContent;

            if (ex == null)
            {
                iLog.Debug(msg);
            }
            else
            {
                iLog.Debug(msg, ex);
            }
        }

        public static void Info(LogModel logModel)
        {
            if (!iLog.IsInfoEnabled || logModel == null)
                return;

            var ex = logModel.exception;
            var msg = logModel.LogContent;
            if (ex == null)
            {
                iLog.Info(msg);
            }
            else
            {
                iLog.Info(msg, ex);
            }
        }

        public static void Error(LogModel logModel)
        {
            if (!iLog.IsErrorEnabled || logModel == null)
                return;

            var ex = logModel.exception;
            var msg = logModel.LogContent;
            if (ex == null)
            {
                iLog.Error(msg);
            }
            else
            {
                iLog.Error(msg, ex);
            }
        }

        public static void Fatal(LogModel logModel)
        {
            if (!iLog.IsFatalEnabled || logModel == null)
                return;

            var ex = logModel.exception;
            var msg = logModel.LogContent;
            if (ex == null)
            {
                iLog.Fatal(msg);
            }
            else
            {
                iLog.Fatal(msg, ex);
            }
        }

        public static void Warn(LogModel logModel)
        {
            if (!iLog.IsWarnEnabled || logModel == null)
                return;

            var ex = logModel.exception;
            var msg = logModel.LogContent;
            if (ex == null)
            {
                iLog.Warn(msg);
            }
            else
            {
                iLog.Warn(msg, ex);
            }
        }

        public static ILog GetLogConfig<T>(){
            var t = (T)Activator.CreateInstance(typeof(T));
            System.Runtime.CompilerServices.RuntimeHelpers.RunClassConstructor(t.GetType().TypeHandle);
            return iLog;
        }

        #endregion


    }

    #region 文件日志帮助类
    public class DefaultFileLogHelper : ILogHelper<DefaultFileLogHelper>
    {
        static DefaultFileLogHelper()
        {
            ILogHelper<DefaultFileLogHelper>.iLog = LogManager.GetLogger(log4NetConfigEnum.Default_File.ToString());
        }
    }

    public class FileExceptionLogHelper : ILogHelper<FileExceptionLogHelper>
    {
        static FileExceptionLogHelper()
        {
            ILogHelper<FileExceptionLogHelper>.iLog = LogManager.GetLogger(log4NetConfigEnum.Default_Ex_File.ToString());
        }
    }
    public class AdminFileLogHelper : ILogHelper<AdminFileLogHelper>
    {
        static AdminFileLogHelper()
        {
            ILogHelper<AdminFileLogHelper>.iLog = LogManager.GetLogger(log4NetConfigEnum.Admin_File.ToString());
        }
    }

    public class AdminExceptionFileLogHelper : ILogHelper<AdminExceptionFileLogHelper>
    {
        static AdminExceptionFileLogHelper()
        {
            ILogHelper<AdminExceptionFileLogHelper>.iLog = LogManager.GetLogger(log4NetConfigEnum.Admin_Ex_File.ToString());
        }
    }
    #endregion


    #region 数据库日志帮助类
    public class SqlLogHelper : log4net.Layout.PatternLayout
    {
        public static ILog iLog = LogManager.GetLogger(log4NetConfigEnum.DefaultLog_Sql.ToString());

        public SqlLogHelper()=> new MyLayout();

        public static Boolean Info(LogModel logModel)
        {
            if (!iLog.IsInfoEnabled || logModel == null)
                return false;

            System.Runtime.CompilerServices.RuntimeHelpers.RunClassConstructor(new SqlLogHelper().GetType().TypeHandle);
            iLog.Info(logModel);
            return true;
        }
    }

    public class MyLayout : log4net.Layout.PatternLayout
    {
        public MyLayout()
        {
            this.AddConverter("property", typeof(PropertyPatternConverter));
        }
    }

    public class PropertyPatternConverter : log4net.Layout.Pattern.PatternLayoutConverter
    {
        protected override void Convert(System.IO.TextWriter writer, log4net.Core.LoggingEvent loggingEvent)
        {
            if (Option != null)
            {
                // Write the value for the specified key
                WriteObject(writer, loggingEvent.Repository, LookupProperty(Option, loggingEvent));
            }
            else
            {
                // Write all the key value pairs
                WriteDictionary(writer, loggingEvent.Repository, loggingEvent.GetProperties());
            }

        }

        /// <summary>
        /// 通过反射获取传入的日志对象的某个属性的值
        /// </summary>
        /// <param name="property"></param>
        /// <returns></returns>
        private object LookupProperty(string property, log4net.Core.LoggingEvent loggingEvent)
        {
            object propertyValue = string.Empty;

            PropertyInfo propertyInfo = loggingEvent.MessageObject.GetType().GetProperty(property);

            if (propertyInfo != null)

                propertyValue = propertyInfo.GetValue(loggingEvent.MessageObject, null);

            return propertyValue;

        }

    }

    #endregion


    #region 控制台日志帮助类
    public class ConsoleLogHelper : ILogHelper<ConsoleLogHelper>
    {
        static ConsoleLogHelper()
        {
            ILogHelper<ConsoleLogHelper>.iLog = LogManager.GetLogger(log4NetConfigEnum.ConsoleDefault.ToString());
        }
    }

    public class ConsoleExceptionLogHelper : ILogHelper<ConsoleExceptionLogHelper>
    {
        static ConsoleExceptionLogHelper()
        {
            ILogHelper<ConsoleExceptionLogHelper>.iLog = LogManager.GetLogger(log4NetConfigEnum.ConsoleDefault_Ex.ToString());
        }
    }

    public class ColoredConsoleLogHelper : ILogHelper<ColoredConsoleLogHelper>
    {
        static ColoredConsoleLogHelper()
        {
            ILogHelper<ColoredConsoleLogHelper>.iLog = LogManager.GetLogger(log4NetConfigEnum.ColoredConsoleDefault.ToString());
        }
    }

    public class ColoredConsoleExceptionLogHelper : ILogHelper<ColoredConsoleExceptionLogHelper>
    {
        static ColoredConsoleExceptionLogHelper()
        {
            ILogHelper<ColoredConsoleExceptionLogHelper>.iLog = LogManager.GetLogger(log4NetConfigEnum.ColoredConsoleDefault_Ex.ToString());
        }
    }

    #endregion
}

Model类:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace Common.Models
{
    public class LogModel
    {
        public long ID { get; set; }
        public int LogKindID { get; set; }
        public int Operator { get; set; }
        public string LogContent { get; set; }
        public DateTime AddTime { get; set; }
        public Exception exception { get; set; } = null;
    }
}

代码疑点难点
(1)动态加载子类参数: 一般地,子类不能正常传参数给父类,并且最重要的是,上面帮助类用到的全是静态变量方法,这个才是阻碍传参最麻烦的,这里就要用到相应的一个动态构造方法,这样才能实现这个特殊功能,方法是在父类下,执行一个方法,并且让子类执行静态构造函数,给静态变量赋值
(2)数据库的自定义字段配置: 绝大部分,写入数据库都要用到自定义字段,所以这个是必须要配的,不配的话就写入不了。
(3)配置文件下logger对应 LogManager.GetLogger(name),name是logger定义好的的name属性值。

通过上面步骤,已经全部配置好了,通过测试后,注释掉Web.config文件下的log4net日志配置就好。

原文地址:https://blog.csdn.net/weixin_44900027/article/details/128732197

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任

如若转载,请注明出处:http://www.7code.cn/show_28958.html

如若内容造成侵权/违法违规/事实不符,请联系代码007邮箱suwngjj01@126.com进行投诉反馈,一经查实,立即删除

发表回复

您的电子邮箱地址不会被公开。 必填项已用 * 标注