配置文件构成
主要有两大部分,一是申明一个名为“log4net“的自定义配置节,如下所示;二是<log4net>节的具体配置,这是下面要重点说明的
<configSections> <section name="log4net" type="log4net.Config.Log4NetConfigurationSectionHandler, log4net" /> </configSections>
1、<log4net>
支持的子元素:
appender |
0或多个 |
logger |
0或多个 |
renderer |
0或多个 |
root |
最多一个 |
param |
0或多个 |
1.1 、<root>:实际上就是一个根logger,所有其它logger都默认继承它,如果配置文件里没有显式定义,则框架使用根日志中定义的属性。root元素没有属性
<root>支持的子元素:
appender-ref |
0个或多个,要引用的appender的名字。 |
level |
最多一个。 只有在这个级别或之上的事件才会被记录。 |
param |
0个或多个, 设置一些参数。 |
1.2 、<logger>:
支持的属性:
name |
必须的,logger的名称 |
additivity |
可选,取值是true或false,默认值是true。设置为false时将阻止父logger中的appender。 |
支持的子元素:
appender-ref |
0个或多个,要引用的appender的名字。 |
level |
最多一个。 只有在这个级别或之上的事件才会被记录。 |
param |
0个或多个, 设置一些参数。 |
1.3、<appender>:定义日志的输出方式,只能作为 log4net 的子元素。name属性必须唯一,type属性必须指定。
支持的属性:
name |
必须的,Appender对象的名称 |
type |
必须的,Appender对象的输出类型 |
支持的子元素:
appender-ref |
0个或多个,允许此appender引用其他appender,并不是所以appender类型都支持。 |
filter |
0个或多个,定义此app使用的过滤器。 |
layout |
最多一个。定义appender使用的输出格式。 |
param |
0个或多个, 设置Appender类中对应的属性的值。 |
实际上<appender>所能包含的子元素远不止上面4个。
1.4、<layout>:布局,只能作为<appender>的子元素。
支持的属性:
type |
必须的,Layout的类型 |
支持的子元素:
param |
0个或多个, 设置一些参数。 |
1.5、<filter>:过滤器,只能作为<appender>的子元素。
支持的属性:
type |
必须的,Filter的类型 |
支持的子元素:
param |
0个或多个, 设置一些参数。 |
1.6、<param>:<param>元素可以是任何元素的子元素。
支持的属性:
name |
必须的,取值是父对象的参数名。 |
value |
可选的,value和type中,必须有一个属性被指定。value是一个能被转化为参数值的字符串。 |
type |
可选的,value和type中,必须有一个属性被指定。type是一个类型名,如果type不是在log4net程序集中定义的,就需要使用全名。 |
支持的子元素:
param |
0个或多个, 设置一些参数。 |
2.根据https://www.cnblogs.com/zhangchenliang/p/4546352.html 写的自己的配置源码
<?xml version="1.0" encoding="utf-8" ?> <configuration> <configSections> <section name="log4net" type="log4net.Config.Log4NetConfigurationSectionHandler, log4net"/> </configSections> <log4net> <root> <level value="ALL" /> <appender-ref ref="SysAppender" /> </root> <logger name="TestLogger"> <level value="DEBUG"/> </logger> <appender name="SysAppender" type="log4net.Appender.RollingFileAppender,log4net" > <!--是否追加到文件:日志文件路径,文件夹不存在则新建 --> <param name="File" value="E:MyProjectTestMineSolution1Log4Net.TestLog4Net.TestinDebuglogfile.txt" /> <!--是否追加到文件--> <param name="AppendToFile" value="true" /> <!--记录日志写入文件时,不锁定文本文件,防止多线程时不能写Log,官方说线程非安全--> <lockingModel type="log4net.Appender.FileAppender+MinimalLock" /> <!--使用Unicode编码--> <Encoding value="UTF-8" /> <!--最多产生的日志文件数,超过则只保留最新的n个。设定值value="-1"为不限文件数--> <param name="MaxSizeRollBackups" value="10" /> <!--是否只写到一个文件中--> <param name="StaticLogFileName" value="false" /> <!--按照何种方式产生多个日志文件(日期[Date],文件大小[Size],混合[Composite])--> <param name="RollingStyle" value="Composite" /> <!--按日期产生文件夹和文件名[在日期方式与混合方式下使用]--> <!--此处按日期产生文件夹,文件名固定。注意" 的位置--> <param name="DatePattern" value="yyyy-MM-dd/"ReflectionLayout.log"" /> <!--这是按日期产生文件夹,并在文件名前也加上日期--> <!--<param name="DatePattern" value="yyyyMMdd/yyyyMMdd"-TimerServer.log"" />--> <!--这是先按日期产生文件夹,再形成下一级固定的文件夹--> <!--<param name="DatePattern" value="yyyyMMdd/"TimerServer/TimerServer.log"" />--> <!--每个文件的大小:只在混合方式与文件大小方式下使用。超出大小后在所有文件名后自动增加正整数重新命名,数字最大的最早写入。可用的单位:KB|MB|GB。不要使用小数,否则会一直写入当前日志--> <param name="maximumFileSize" value="500KB" /> <!--计数类型为1,2,3…--> <param name="CountDirection" value="1"/> <!--记录的格式。一般用log4net.Layout.PatternLayout布局--> <layout type="log4net.Layout.PatternLayout,log4net"> <param name="Header" value="[Header] "/> <param name="Footer" value="[Footer] "/> <param name="ConversionPattern" value="%d [%t] %-5p %c [%x] - %m%n" /> </layout> <!--记录的格式。一般用log4net.Layout.PatternLayout布局--><!--用自定义布局测试失败--> <!--此处用继承了log4net.Layout.PatternLayout的自定义布局,TGLog.ExpandLayout2为命名空间。%property{Operator}、%property{Action}是自定义的输出--> <!--<layout type="TGLog.ExpandLayout2.ReflectionLayout,TGLog"> <param name="ConversionPattern" value="记录时间:%date 线程ID:[%thread] 日志级别:%-5level 记录类:%logger 操作者ID:%property{Operator} 操作类型:%property{Action}%n 当前机器名:%property%n当前机器名及登录用户:%username %n 记录位置:%location%n 消息描述:%property{Message}%n 异常:%exception%n 消息:%message%newline%n%n" /> </layout>--> <!--过滤设置,LevelRangeFilter为使用的过滤器--> <filter type="log4net.Filter.LevelRangeFilter"> <param name="LevelMin" value="DEBUG" /> <param name="LevelMax" value="WARN" /> </filter> </appender> <!--<appender name="ConsoleAppender" type="log4net.Appender.ConsoleAppender,log4net" > <layout type="log4net.Layout.PatternLayout,log4net"> <param name="ConversionPattern" value="%d [%t] %-5p %c [%x] - %m%n" /> </layout> </appender>--> </log4net> <startup> <supportedRuntime version="v4.0" sku=".NETFramework,Version=v4.5" /> </startup> </configuration>
注意:
1)在项目中添加对log4net.dll的引用;
2)程序启动时读取log4net的配置文件:我建得WindowsForm项目,在Main方法中添加不顶事,在AssemblyInfo.cs文件中可以。
如果是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()]
3.修改App.config/web.config文件:如上所示
4.在程序中使用
private void button1_Click(object sender, EventArgs e) { //https://www.cnblogs.com/zhangchenliang/p/4546352.html //Log4net使用很方便,先申明一个封装类ILog 的对象,如下:其中"ReflectionLayout"便是我们自定义的日志对象<logger> 的name的值。 log4net.ILog log = log4net.LogManager.GetLogger("TestLogger"); try { log.Debug(DateTime.Now.ToString() + "这是一个测试!"); } catch (Exception ec) { log.Error(DateTime.Now.ToString() + "出现错误!", ec); } }
5.查看日志文件