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:可选,取值是true或false,默认值是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/&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" />
			</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/&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" />
			</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="log\Debug\Log4Net_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日志配置就好。

  • 5
    点赞
  • 40
    收藏
    觉得还不错? 一键收藏
  • 4
    评论
1、概述 log4net是.Net下一个非常优秀的开源日志记录组件。log4net记录日志的功能非常强大。它可以将日志分不同的等级,以不同的格式,输出到不同的媒介。本文主要是介绍如何在Visual Studio2008中使用log4net快速创建系统日志,如何扩展以输出自定义字段。 2、一个简单的使用实例 第一步:在项目中添加对log4net.dll的引用,这里引用版本是1.2.10.0。 第二步:程序启动时读取log4net的配置文件。 如果是CS程序,在根目录的Program.cs中的Main方法中添加: log4net.Config.XmlConfigurator.Configure(); 如果是BS程序,在根目录的Global.asax.cs(没有新建一个)中的Application_Start方法中添加: log4net.Config.XmlConfigurator.Configure(); 无论BS还是CS程序都可直接在项目的AssemblyInfo.cs文件里添加以下的语句: [assembly: log4net.Config .XmlConfigurator()] 也可以使用自定义的配置文件,具体请参见4.4 关联配置文件。 第三步:修改配置文件。如果是CS程序,则在默认的App.config文件(没有新建一个)中添加内容;如果是BS程序,则添加到Web.config文件中,添加内容一样,这里不再列出。 App.config文件添加内容如下: <?xml version="1.0" encoding="utf-8" ?> <configuration> <configSections> <section name="log4net" type="log4net.Config.Log4NetConfigurationSectionHandler, log4net" /> </configSections> <log4net> <root> <level value="WARN" /> <appender-ref ref="LogFileAppender" /> <appender-ref ref="ConsoleAppender" /> </root> <logger name="testApp.Logging"> <level value="DEBUG"/> </logger> <appender name="LogFileAppender" type="log4net.Appender.FileAppender" > <param name="File" value="log-file.txt" /> <param name="AppendToFile" value="true" /> <layout type="log4net.Layout.PatternLayout"> <param name="Header" value="[Header] "/> <param name="Footer" value="[Footer] "/> <param name="ConversionPattern" value="%d [%t] %-5p %c [%x] - %m%n" /> </layout> <filter type="log4net.Filter.LevelRangeFilter"> <param name="LevelMin" value="DEBUG" /> <param name="LevelMax" value="WARN" /> </filter> </appender> <appender name="ConsoleAppender" type="log4net.Appender.ConsoleAppender" > <layout type="log4net.Layout.PatternLayout"> <param name="ConversionPattern" value="%d [%t] %-5p %c [%x] - %m%n" /> </layout> </appender> </log4net> </configuration> 第四步:在程序使用。 log4net.ILog log = log4net.LogManager.GetLogger("testApp.Logging");//获取一个日志记录器 log.Info(DateTime.Now.ToString() + ": login success");//写入一条新log 这样就将信息同时输出到控制台和写入到文件名为“log-file.txt”的文件中,其中“log-file.txt”文件的路径是当前程序运行所在目录;也可以定义为绝对路径,配置如: <param name="File" value="C:/log-file.txt" />就写入C盘根目录下log-file.txt文件中
log4net是一个功能强大的日志记录工具,它可以帮助开发人员在应用程序中实现灵活的日志记录功能。下面是一个简单的log4net使用教程: 1. 引入log4net库:首先,你需要从Apache log4net官方网站(https://logging.apache.org/log4net/)下载log4net库,并将它添加到你的项目中。 2. 配置log4net:在你的应用程序的配置文件(通常是App.config或Web.config)中添加log4net的配置节。以下是一个示例配置: ```xml <configuration> <configSections> <section name="log4net" type="log4net.Config.Log4NetConfigurationSectionHandler, log4net" /> </configSections> <log4net> <appender name="ConsoleAppender" type="log4net.Appender.ConsoleAppender"> <layout type="log4net.Layout.PatternLayout"> <conversionPattern value="%date [%thread] %-5level %logger - %message%newline" /> </layout> </appender> <root> <level value="DEBUG" /> <appender-ref ref="ConsoleAppender" /> </root> </log4net> </configuration> ``` 上面的配置定义了一个名为ConsoleAppender的日志输出器,它将日志消息输出到控制台。`<root>`元素指定了根日志记录器的日志级别和使用的输出器。 3. 初始化log4net:在应用程序启动时,通过调用`log4net.Config.XmlConfigurator.Configure()`方法来初始化log4net。例如,在应用程序的入口点中添加以下代码: ```csharp using log4net; namespace YourApplication { class Program { private static readonly ILog log = LogManager.GetLogger(typeof(Program)); static void Main(string[] args) { log4net.Config.XmlConfigurator.Configure(); log.Debug("Debug message"); log.Info("Info message"); log.Warn("Warning message"); log.Error("Error message"); log.Fatal("Fatal message"); } } } ``` 在上面的示例中,`GetLogger`方法用于获取一个log4net日志记录器,你需要将`typeof(Program)`替换为你所在的类的类型。 4. 记录日志:现在,你可以使用`log`对象来记录日志消息。log4net提供了不同的日志级别,包括DEBUG、INFO、WARN、ERROR和FATAL。你可以使用适当的日志级别来记录不同严重程度的消息。 以上是一个简单的log4net使用教程,希望对你有帮助!如果你有任何进一步的问题,请随时提问。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值