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. LINE最新版6.5.0在iOS上的删除信息取证

    iOS: 9.3.2版 LINE: 6.5.0版 取出LINE的数据库 Line.sqlite,路径如下所示: 检视删除的信息,发现还有不少残留,虽然都是片段,但拼拼凑凑总还是能有些蛛丝马迹,毕竟,总 ...

  2. poj2017

    一天两个题,凑数用的大水题啊...不解释了..羞愧ing #include <stdio.h> int main(){ int t; int i; ],b[],tot; ){ tot=; ...

  3. eclipse自动补全

    最简单的修改方式是:Windows——>Preferences——>Java-->Editor-->Content Asist,在Auto activation trigger ...

  4. VS2008使用技巧及快捷键大全

    VS2008技巧,非常实用,非常提高效率. 1,Visual Studio 2008自带的1000多个 Windows 系统使用的各种图标.光标和动画文件在Visual Studio 2008的安装目 ...

  5. MVC5 Identity 自定义用户和角色

    看代码基本就都能看懂了,增加了两个用户详细信息的表,角色表增加两个字段页面中实现树形显示. //IdentityModels.cs using System.Data.Entity; using Sy ...

  6. sqoop导入数据到hive

    1.1hive-import参数 使用--hive-import就可以将数据导入到hive中,但是下面这个命令执行后会报错,报错信息如下: sqoop import --connect jdbc:my ...

  7. LevelDB源码剖析

    LevelDB的公共部件并不复杂,但为了更好的理解其各个核心模块的实现,此处挑几个关键的部件先行备忘. Arena(内存领地) Arena类用于内存管理,其存在的价值在于: 提高程序性能,减少Heap ...

  8. ThinkPHP之中的事务回滚

    小李子 获取thinkphp之中执行的SQL: 1.用调试模式的追踪trace功能: 2.代码: $user_type=D('user_type'); $datass=array('school_id ...

  9. 入门级的PHP验证码

    参考了网上PHP 生成验证码很多是类封装了的,没有封装的验证码其实只是几个GD函数而已,初学者可以看看,可以尝试自己封装. <?php   session_start();      $im = ...

  10. DevExpress BarManager 部分用法

    1.创建一个BarManager会默认产生三个菜单.BarManager右键ShowDesignTime enhancements会显示[add]按钮,可对菜单进行编辑. 2.其中比较有用的属性: 选 ...