Log4Net配置详解

配置方式一

在相应的应用程序的配置文件中配置,(WinForm对应的是*.exe.config,WebForm对应的是*.config),本实例是Web应用程序,以Web.config为例子讲解。

第一步

添加并应用Log4net.dll。然后在Web.config文件中添加下面的配置

<configSections>
    <section name="log4net" type="log4net.Config.Log4NetConfigurationSectionHandler,log4net-net-1.0"/>
</configSections>

第二步

在Web.config的Configuration节点下新增log4net节点,如下:

<log4net debug="true">
<!--RootLog实例,子Log会继承其特性-->
<root>
<level value="INFO" />
<!--启用按日期分割-->
<appender-ref ref="LogFileAppenderByDate" />
<!--启用按容量分割-->
<appender-ref ref="LogFileAppenderBySize" />
<!--启用保存到数据库-->
<appender-ref ref="AdoNetAppender" />
</root> <logger name="testApp.Logging">
<!--设置testApp.Logging日志级别为DEBUG-->
<level value="DEBUG"/> </logger> <!--按日期分割日志文件 一天一个-->
<appender name="LogFileAppenderByDate" type="log4net.Appender.RollingFileAppender" > <!--是否续写-->
<param name="AppendToFile" value="true" />
<!--最小锁定模型以允许多个进程可以写入同一个文件-->
<param name="LockingModel" value="log4net.Appender.FileAppender.MinimalLock" />
<param name="StaticLogFileName" value="true" />
<!--保存路径-->
<param name="File" value="d:\Log\\" />
<!--可以按天、小时、分钟为Log命名-->
<param name="DatePattern" value="yyyy-MM-dd-HH-mm.LOG" />
<param name="StaticLogFileName" value="false" />
<param name="RollingStyle" value="Date" />
<!--最多保留的几天的日志、这里我没有验证-->
<param name="MaxBackupIndex" value="" />
<!--日志输出格式-->
<layout type="log4net.Layout.PatternLayout">
<param name="ConversionPattern" value="时间:%d %n级别:%level %n类名:%c%n文件:%F 第%L行%n日志内容:%m%n-----------------------------------------%n%n" />
</layout> </appender> <!--按日志容量分割日志文件 10KB一个-->
<appender name="LogFileAppenderBySize" type="log4net.Appender.RollingFileAppender" >
<!--是否续写-->
<param name="AppendToFile" value="true" />
<!--最小锁定模型以允许多个进程可以写入同一个文件-->
<param name="LockingModel" value="log4net.Appender.FileAppender.MinimalLock" /> <param name="StaticLogFileName" value="true" /> <!--按照文件的大小进行变换日志文件-->
<param name="RollingStyle" value="Size" />
<param name="File" value="log.txt" />
<!--单个文件最大数量 好像只有在 按Size分割时有效-->
<param name="MaximumFileSize" value="200KB"/>
<!--保留的log文件数量 超过此数量后 自动删除之前的 好像只有在 按Size分割时有效-->
<param name="MaxSizeRollBackups" value="" /> <param name="StaticLogFileName" value="false" />
<layout type="log4net.Layout.PatternLayout">
<param name="ConversionPattern" value="发生时间:%d %n事件级别:%level %n相关类名:%c%n程序文件:%F 第%L行%n日志内容:%m%n-----------------------------------------%n%n" />
</layout>
</appender> <!--记录日志到数据库-->
<appender name="AdoNetAppender" type="log4net.Appender.AdoNetAppender">
<bufferSize value="" />
<!--缓冲大小-->
<connectionType value="System.Data.SqlClient.SqlConnection, System.Data, Version=1.0.3300.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" />
<connectionString value="Data Source=DST56711\SEVEN;Initial Catalog=Log4Net;Persist Security Info=True;User ID=sa;Password=seven_123456" />
<commandText value="INSERT INTO Log([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="" />
<layout type="log4net.Layout.PatternLayout">
<conversionPattern value="%thread" />
</layout>
</parameter>
<parameter>
<parameterName value="@log_level" />
<dbType value="String" />
<size value="" />
<layout type="log4net.Layout.PatternLayout">
<conversionPattern value="%level" />
</layout>
</parameter>
<parameter>
<parameterName value="@logger" />
<dbType value="String" />
<size value="" />
<layout type="log4net.Layout.PatternLayout">
<conversionPattern value="%logger" />
</layout>
</parameter>
<parameter>
<parameterName value="@message" />
<dbType value="String" />
<size value="" />
<layout type="log4net.Layout.PatternLayout">
<conversionPattern value="%message" />
</layout>
</parameter>
<parameter>
<parameterName value="@exception" />
<dbType value="String" />
<size value="" />
<layout type="log4net.Layout.ExceptionLayout" />
</parameter>
</appender> </log4net>

第三步

在Web项目下找到AssemblyInfo.cs文件【Properties->AssemblyInfo.cs】加入如下代码:

[assembly: log4net.Config.XmlConfigurator(Watch = true)]

第四步

在相应的位置写入记录日志的代码:

ILog log= LogManager.GetLogger("testApp.Logging");
log.Debug("DebugMvc");

第五步

查看相应的日志记录效果:

我们上面的root节点中配置了三个Append,分别是按日期分割写日志到文件中【在D:\Log文件夹中】、按容量分割写入的项目的更目录的log.text文件中、保存到数据库。

1、打开我的D盘Log文件夹(没有会自动生成,生成格式按照 <param name="DatePattern" value="yyyy-MM-dd-HH-mm.LOG" />格式生成)

2、在项目的根目录生成log.txt(已经生成,就不截图了,这两个日志文件的内容格式是一样的,如下:)

3、数据库中也正常的插入了我们想要的数据

结论

看到上面的结果,不知道你是否有一些疑问,比如:

1、如果把配置写在web.config中会让web.config比较乱,是否可以单独建立一个文件来配置log4net

2、我们上面提到了  在Web项目下找到AssemblyInfo.cs文件【Properties->AssemblyInfo.cs】加入如下代码:[assembly: log4net.Config.XmlConfigurator(Watch = true)],这个是干嘛用的?

3、如果我们配置不正确,改如何调试log4net呢?(我在学习的时候是配到了,不论怎么样也写不到数据库,也没有日志信息,很是头疼(这里也可以体现冲日志的重要性了))

如果你读过我的前两篇文章,你应该很容易看懂上面的配置,也自然知道Log4Net不依赖任何配置【我们不做任何配置,直接引入log4net.dll就可以】,使用配置是为了方便和更好的统一管理,所以完全可以不放在web.config中,新建一个Log4Net.config来配置。

对于AssemblyInfo.cs的作用纯粹是用来初始化的,没有任何神奇的地方,用AssemblyInfo.cs来初始化是.Net4.0新加的功能,我们完全可以放在Global.asax.cs文件中来实现。对于初始化功能,Fish Li 的 如何在Asp.Net应用程序中初始化   讲的比较清楚。

对于调试log4Net,我在下文会有介绍,现在我们带着前两个问题的答案去用另外的一种方式配置log4net,看看效果如何:

配置方式二

第一步

在web项目根目录下新建一个文件夹Config【用来存放自定义的配置文件】,然后再Config文件夹中建立一个文件叫LogNet.config

第二步

配置Log4Net.config文件,内容如下:

<?xml version="1.0" encoding="utf-8"?>
<log4net debug="true">
<!--RootLog实例,子Log会继承其特性-->
<root>
<level value="INFO" />
<!--启用按日期分割-->
<appender-ref ref="LogFileAppenderByDate" />
<!--启用按容量分割-->
<appender-ref ref="LogFileAppenderBySize" />
<!--启用保存到数据库-->
<appender-ref ref="AdoNetAppender" />
</root> <logger name="testApp.Logging">
<!--设置testApp.Logging日志级别为DEBUG-->
<level value="DEBUG"/> </logger> <!--按日期分割日志文件 一天一个-->
<appender name="LogFileAppenderByDate" type="log4net.Appender.RollingFileAppender" > <!--是否续写-->
<param name="AppendToFile" value="true" />
<!--最小锁定模型以允许多个进程可以写入同一个文件-->
<param name="LockingModel" value="log4net.Appender.FileAppender.MinimalLock" />
<param name="StaticLogFileName" value="true" />
<!--保存路径-->
<param name="File" value="d:\Log\\" />
<!--可以按天、小时、分钟为Log命名-->
<param name="DatePattern" value="yyyy-MM-dd-HH-mm.LOG" />
<param name="StaticLogFileName" value="false" />
<param name="RollingStyle" value="Date" />
<!--最多保留的几天的日志、这里我没有验证-->
<param name="MaxBackupIndex" value="" />
<!--日志输出格式-->
<layout type="log4net.Layout.PatternLayout">
<param name="ConversionPattern" value="时间:%d %n级别:%level %n类名:%c%n文件:%F 第%L行%n日志内容:%m%n-----------------------------------------%n%n" />
</layout> </appender> <!--按日志容量分割日志文件 10KB一个-->
<appender name="LogFileAppenderBySize" type="log4net.Appender.RollingFileAppender" >
<!--是否续写-->
<param name="AppendToFile" value="true" />
<!--最小锁定模型以允许多个进程可以写入同一个文件-->
<param name="LockingModel" value="log4net.Appender.FileAppender.MinimalLock" /> <param name="StaticLogFileName" value="true" /> <!--按照文件的大小进行变换日志文件-->
<param name="RollingStyle" value="Size" />
<param name="File" value="log.txt" />
<!--单个文件最大数量 好像只有在 按Size分割时有效-->
<param name="MaximumFileSize" value="200KB"/>
<!--保留的log文件数量 超过此数量后 自动删除之前的 好像只有在 按Size分割时有效-->
<param name="MaxSizeRollBackups" value="" /> <param name="StaticLogFileName" value="false" />
<layout type="log4net.Layout.PatternLayout">
<param name="ConversionPattern" value="发生时间:%d %n事件级别:%level %n相关类名:%c%n程序文件:%F 第%L行%n日志内容:%m%n-----------------------------------------%n%n" />
</layout>
</appender> <!--记录日志到数据库-->
<appender name="AdoNetAppender" type="log4net.Appender.AdoNetAppender">
<bufferSize value="" />
<!--缓冲大小-->
<connectionType value="System.Data.SqlClient.SqlConnection, System.Data, Version=1.0.3300.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" />
<connectionString value="Data Source=DST56711\SEVEN;Initial Catalog=Log4Net;Persist Security Info=True;User ID=sa;Password=seven_123456" />
<commandText value="INSERT INTO Log([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="" />
<layout type="log4net.Layout.PatternLayout">
<conversionPattern value="%thread" />
</layout>
</parameter>
<parameter>
<parameterName value="@log_level" />
<dbType value="String" />
<size value="" />
<layout type="log4net.Layout.PatternLayout">
<conversionPattern value="%level" />
</layout>
</parameter>
<parameter>
<parameterName value="@logger" />
<dbType value="String" />
<size value="" />
<layout type="log4net.Layout.PatternLayout">
<conversionPattern value="%logger" />
</layout>
</parameter>
<parameter>
<parameterName value="@message" />
<dbType value="String" />
<size value="" />
<layout type="log4net.Layout.PatternLayout">
<conversionPattern value="%message" />
</layout>
</parameter>
<parameter>
<parameterName value="@exception" />
<dbType value="String" />
<size value="" />
<layout type="log4net.Layout.ExceptionLayout" />
</parameter>
</appender> </log4net>

第三步

在Global.asax中加入如下代码

protected void Application_Start()
{

//..........其它初始化代码

//Log4Net初始化代码

log4net.Config.XmlConfigurator.ConfigureAndWatch(new FileInfo(Server.MapPath("Config/Log4Net.config")));
}

第四步

在相应的位置写入记录日志的代码:

ILog log= LogManager.GetLogger("testApp.Logging");
log.Debug("DebugMvc");

第五步

观察结果,结果和上面配置一种的结果一样,这里就不截图展示了。

结论

写到这里我想大家大概已经明白了,这次我们没有在web.config中做任何配置,也没有在AssemblyInfo.cs文件中做任何改动,一样可以按照我们需要的方式记录日志。

这就证明了配置其实就是为了方便和高效的管理日志,不是log4net必须的(不过一般我们项目使用中都需要用配置来管理)而AssemblyInfo只是为了让项目启动是加载log4net的配置,在任何可以初始化的地方都可以做,现在我们在Global中实现。

关于log4net出现问题如何调试,我们在下篇文章中讲解,如果对上面的有疑惑,请参考下面两篇文章。

Log4Net学习【二】

Log4Net学习【一】

Log4Net学习【三】的更多相关文章

  1. Log4Net学习【二】

    Log4Net结构详解 当我们在描述为系统做日志这个动作的时候,实际上描述了3个点:做日志,其实就是在规定,在什么地方 用什么日志记录器 以什么样的格式做日志.把三个最重要的点抽取出来,即什么地方,日 ...

  2. [转载]Log4net学习笔记

    Log4net 学习笔记: 主要是根据apache站点整理的: 原文链接:http://logging.apache.org/log4net/release/sdk/ http://logging.a ...

  3. HTTP学习三:HTTPS

    HTTP学习三:HTTPS 1 HTTP安全问题 HTTP1.0/1.1在网络中是明文传输的,因此会被黑客进行攻击. 1.1 窃取数据 因为HTTP1.0/1.1是明文的,黑客很容易获得用户的重要数据 ...

  4. TweenMax动画库学习(三)

    目录               TweenMax动画库学习(一)            TweenMax动画库学习(二)            TweenMax动画库学习(三)           ...

  5. Struts2框架学习(三) 数据处理

    Struts2框架学习(三) 数据处理 Struts2框架框架使用OGNL语言和值栈技术实现数据的流转处理. 值栈就相当于一个容器,用来存放数据,而OGNL是一种快速查询数据的语言. 值栈:Value ...

  6. 4.机器学习——统计学习三要素与最大似然估计、最大后验概率估计及L1、L2正则化

    1.前言 之前我一直对于“最大似然估计”犯迷糊,今天在看了陶轻松.忆臻.nebulaf91等人的博客以及李航老师的<统计学习方法>后,豁然开朗,于是在此记下一些心得体会. “最大似然估计” ...

  7. DjangoRestFramework学习三之认证组件、权限组件、频率组件、url注册器、响应器、分页组件

    DjangoRestFramework学习三之认证组件.权限组件.频率组件.url注册器.响应器.分页组件   本节目录 一 认证组件 二 权限组件 三 频率组件 四 URL注册器 五 响应器 六 分 ...

  8. [ZZ] 深度学习三巨头之一来清华演讲了,你只需要知道这7点

    深度学习三巨头之一来清华演讲了,你只需要知道这7点 http://wemedia.ifeng.com/10939074/wemedia.shtml Yann LeCun还提到了一项FAIR开发的,用于 ...

  9. SVG 学习<三>渐变

    目录 SVG 学习<一>基础图形及线段 SVG 学习<二>进阶 SVG世界,视野,视窗 stroke属性 svg分组 SVG 学习<三>渐变 SVG 学习<四 ...

随机推荐

  1. PHP 统计中文字符串的长度

    中文网站一般会选择两种编码:gbk/gb2312或是utf-8. gbk编码下每个中文字符所占字节为2,例: $zhStr = ‘您好,中国!’; echo strlen($zhStr); // 输出 ...

  2. Python之路【第五篇】:面向对象及相关

    Python之路[第五篇]:面向对象及相关   面向对象基础 基础内容介绍详见一下两篇博文: 面向对象初级篇 面向对象进阶篇 其他相关 一.isinstance(obj, cls) 检查是否obj是否 ...

  3. java编程的78条黄金法则

    创建和销毁对象 1.考虑用静态工厂方法(返回类的实例的静态方法)代替构造器2.遇到多个构造器参数时要考虑用构造器3.用私有构造器或者枚举类型强化Singleton属性4.通过私有构造器强化不可实例化的 ...

  4. C puzzles详解【13-15题】

    第十三题 int CountBits(unsigned int x) { ; while(x) { count++; x = x&(x-); } return count; } 知识点讲解 位 ...

  5. 第 2章 数组和 ArrayLists

    数组是最通用的数据结构,它出现在几乎所有的编程语言里.在 C#语言中使用数组包括创建 System.Array 类型的数组对象,以及创建针对所有数组的抽象的基类型.Array 类提供了一套方法,这些方 ...

  6. shell 截取指定的字符串

    按指定的字符串截取 1.第一种方法: ${varible##*string} 从左向右截取最后一个string后的字符串 ${varible#*string}从左向右截取第一个string后的字符串 ...

  7. NSBundle UIImageView &UIButton

    1.NSBundle 1> 一个NSBundle代表一个文件夹,利用NSBundle能访问对应的文件夹 2> 利用mainBundle就可以访问软件资源包中的任何资源 3> 模拟器应 ...

  8. objective-C基本知识

    预编译指令 1.自己写的头文件最好用双引号,而系统自带的可以用尖括号. ************************************************* 点语法 p.age= 10; ...

  9. Cassandra 有限分页策略

    瀑布式分页 如果你的应用只需要瀑布式的分页,那么,Cassandra可以很好的支持,不过记得要指定好排序顺序. CLUSTERING ORDER BY (add_time DESC); 常见的分页,跳 ...

  10. scala学习资料

    强烈推荐一个s在线学习scala的网站: http://zh.scala-tour.com/#/overview