转:http://itrust.cnblogs.com/archive/2006/07/17/452895.html

上回说道:Repository可以说成基于一个log4net配置节创建的log4net容器,它根据log4net配置节的指示创建其他所有对象(Logger/Appender/Filter/Layout等等)并保有他们的实例,随时为你所用。

每个Repository都有自己唯一的名字,如 root。

一般而言一个AppDomain(或者说一个进程)有一个Repository,该AppDomain下所有程序集Assembly都可以使用这个Repository。Repository需要实现ILoggerRepository,log4net中log4net.Repository.Hierarchy.Hierarchy就通过继承LoggerRepositorySkeleton实现了ILoggerRepository,它也是log4net中唯一实现ILoggerRepository的类。

Hierarchy

那么Hierarchy是什么呢?

Hierarchy里存放着通过配置文件创建的所有Logger。由于Logger们是有父子关系的,因此Hierarchy通过继承树来存放所有的Logger。根节点就是我们熟悉的Root,如例:

Logger 名

日志级别

从父Logger继承的级别

root

INFO

INFO

my

none

INFO

my.net

DEBUG

DEBUG

my.net.tcp

none

DEBUG

对应配置文件,应该是:

<root>

       <level value="INFO" />

       <appender-ref ref="ConsoleAppender" />

</root>

<logger name=" my">

       <appender-ref ref="ConsoleAppender" />

</logger>

<logger name=" my.net ">

       <appender-ref ref="ConsoleAppender" />

</logger>

<logger name=" my.net.tcp">

       <filter type="log4net.Filter.LevelRangeFilter">

                            <param name="LevelMin" value="DEBUG"/>

                            <param name="LevelMax" value="INFO"/>

       </filter>

       <appender-ref ref=" ColoredConsoleAppender" />

</logger>

上例中,定义了三个Logger,都将存放在Hierarchy中。三个Logger形成继承关系,Logger中未定义的属性都将从父Logger中继承

一旦你的应用程序通过log4net.LogManager.GetLogger()得到ILog(也就是logger的代理),那么将从Hierarchy的继承树中找出对应的Logger。

log4net.LogManager.GetLogger() 得到root

   log4net.LogManager.GetLogger(“my”)得到 my logger

这样,你就可以为程序集中不同的命名空间甚至是某个类设置相应的log4net配置。如上例“my.net.tcp”就可以实现和其父Logger不同的日志行为。

使用不同的Repository

      如果你的应用程序中不同程序集需要使用不同<log4net>…</log4net>配置节,或者说需要使用不同的log4net配置文件,那就使用不同的Repository。

如在my.net.tcp程序集中,加入语句:[assembly: log4net.Config.DOMConfigurator(ConfigFile="my.net.tcp.config", Watch=true)]

这样,你的就可以单独使用一份配置文件,创建一个新的Repository。

你也可以为自己的Repository命名: [assembly: log4net.Config.AliasRepository(“myrepository”)]

如何共用Repository

      不作上面所说的所有改动,一个AppDomain中所有程序集都共用缺省的Repository,但是当需要共用另一个Repository时,就需要做一些工作。产生这样的需求包括:

1.        两个应用程序共用一份log4net配置,对日志做同样的处理

2.        两个AppDomain需要共用一份log4net配置,对日志做同样的处理。特别时在运行时动态升级程序集时,这个需求显得尤其关键。

首先记载log4net的程序集需要为Repository命名:[assembly: log4net.Config.AliasRepository(“myrepository”)]

后续的程序集,只需要引用它即可:[assembly: log4net.Config.Repository(“myrepository”)]

这种方式下,两个AppDomain写同一份日志文件时,可能产生文件共享冲突的错误(文件已经被锁定,不能写),需要修改配置,在RollingLogFileAppender中加入lockingModel配置,如:  

<appender name="RollingLogFileAppender" type="log4net.Appender.RollingFileAppender">

        <param name="File" value="log\\TaskScheduleServer.log" />

        <lockingModel type="log4net.Appender.FileAppender+MinimalLock" />   

</appender>

log4net面面观之Repository的更多相关文章

  1. log4net面面观之工作原理

    转自:逗逼的博客:http://itrust.cnblogs.com/archive/2005/01/25/97225.html 要知道Log4net究竟是咋干活的,咱们可以从下面这个脉络简图入手.你 ...

  2. .Netcore之日志组件Log4net、Nlog性能比较

    转载请注明出处http://www.cnblogs.com/supernebula/p/7506993.html .Netcore之Log4net.Nlog性能比较 最近在写一个开源.netcore ...

  3. Asp.net MVC + Redis(hash入库+log4net集成)

    博客四元素 既然要写一个博客类的网站,那就应该知道博客的相关信息. 标题 作者 时间 内容 title author time content 因为之前有了解过Redis,所以有点纠结于数据的存储方式 ...

  4. AspNetCore 使用log4net+IExceptionFilter 记录错误日志

    错误日志的好处我就不说了,大家都心里有数,那今天浩子就给大家说一说基本的错误日志吧这次通过log4net记录日志. 原来写过一个关于Nlog的日志框架,传送门为:https://www.cnblogs ...

  5. core里使用log4net

    1. nuget 里安装 log4net 2. startup.cs里配置读取配置文件 public static ILoggerRepository repository { get; set; } ...

  6. 使用log4net将C#日志发送到Elasticsearch

    一.安装Elasticsearch 参考前面写的文章:https://www.cnblogs.com/songxingzhu/p/7909486.html 安装完Elasticsearch后,修改/e ...

  7. asp.net core中使用log4net

    和之前的ASP.NET MVC中的使用LOG4NET的方法有些不同,这里先记录一下,使用步骤如下 : 1. 建立 ASP.NET CORE项目中,NUGET中搜索log4net后下载安装 2. 根目录 ...

  8. netcore 使用log4net

    1.Install Install-Package log4net 2. conifg 創建文件:log4net.config <?xml version="1.0" enc ...

  9. .Net core2.0日志组件Log4net、Nlog简单性能测试

    .Net core之Log4net.Nlog简单性能测试 比较log4net.nlog的文件写入性能(.netcore环境),涉及代码和配置如有不正确的地方,还请批评指正. 原创,转载请著名出处:ht ...

随机推荐

  1. ubuntu获取硬盘的uuid。

    1.用UUID来标识硬盘有很多好处,它是一个硬盘的唯一代号,所以当硬盘插口位置变化时,虽然sda可能会变成sdc,但这个码是不会变的.所以在 fstab中用/dev/sda1这样的硬盘标识可能会有混乱 ...

  2. 火狐flash插件

    1.解压缩文件: tar -xzvf ***.tar.gz 会解出一个文件:libflashplayer.so 和一个目录 usr 2.将文件libflashplayer.so 拷贝到目录   /us ...

  3. ASP.NET MVC3实现无刷新验证码

    在MVC中进行留言,评论等功能时,不可避免会用到表单提交时的验证码问题,有时,我们的作法是,当表单被提交后,在controller里去判断验证码的正确与否,但我认为这种用户体验是很差的,今天正好有后时 ...

  4. C# 多线程基础

    多线程 无论您是为具有单个处理器的计算机还是为具有多个处理器的计算机进行开发,您都希望应用程序为用户提供最好的响应性能,即使应用程序当前正在完成其 他工作.要使应用程序能够快速响应用户操作,同时在用户 ...

  5. python正则实例

    # -*- coding: cp936 -*-import reidcardregex=r"^[1-9]\d{14}(\d{2}[0-9x])?$"print re.search( ...

  6. 微信video标签全屏无法退出bug

    安卓(android)微信里面video播放视频,会被强制全屏,播放完毕后还有腾讯推荐的视频,非常讨厌..强制被全屏无法解决,但是视频播放完毕后退出播放器可以解决.方法就是视频播放完毕后,用音频aud ...

  7. PHP学习心得(十)——控制结构

    if 结构是很多语言包括 PHP 在内最重要的特性之一,它允许按照条件执行代码片段. if 语句可以无限层地嵌套在其它 if 语句中,这给程序的不同部分的条件执行提供了充分的弹性. else 延伸了  ...

  8. 前端内容缓存技术:CSI,SSI,ESI

    一.CSI (Client Side Includes)   含义:通过iframe.javascript.ajax  等方式将另外一个页面的内容动态包含进来. 原理:整个页面依然可以静态化为html ...

  9. sublime c++ builder

    rt, mark { "cmd": ["g++", "${file}", "-o", "${file_path ...

  10. Oracle索引扫描

    Oracle索引扫描:先通过index查找到索引的值,并根据索引的值对应的rowid值(对于非唯一索引可能返回多个rowid值)直接从表中得到具体的数据.一个rowid唯一的表示一行数据,该行对应的数 ...