转: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. php常用单词语法

    header("Content-type:text/html;charset=utf-8"); 加入数组array_push($ratings_store_cop,$value); ...

  2. IOPS和Throughput

    IOPS和Throughput吞吐量两个参数是衡量存储性能的主要指标.IOPS表示存储每秒传输IO的数量,Throughput吞吐量则表示每秒数据的传输总量.两者在不同的情况下都能表示存储的性能状况, ...

  3. hdu 5056 Boring count

    贪心算法.需要计算分别以每个字母结尾的且每个字母出现的次数不超过k的字符串,我们设定一个初始位置s,然后用游标i从头到尾遍历字符串,使用map记录期间各个字母出现的次数,如果以s开头i结尾的字符串满足 ...

  4. Javascript中的迭代、归并方法

    迭代方法 在Javascript中迭代方法个人觉得尤为重要,在很多时候都会有实际上的需求,javascript提供了5个迭代方法来供我们操作,它们分别为: every() 对数组中的每一个项运用给定的 ...

  5. struct timespec 和 struct timeval

    time()提供了秒级的精确度 . 1.头文件 <time.h> 2.函数原型 time_t time(time_t * timer) 函数返回从TC1970-1-1 0:0:0开始到现在 ...

  6. 使用ECLIPSE+MINGW搭建C/C++开发环境

    有个朋友要我帮忙跑一个C程序而我现在主要用java,电脑上也就没有C语言的编译和开发环境,在学习java的这段期间,接触到了Eclipse这个强大的IDE,用惯了.就为调试一个程序,去安装一个VS觉得 ...

  7. C++ 实现设计模式之观察者模式

    1. 什么是观察者模式? 观察者模式(有时又被称为发布-订阅Subscribe>模式.模型-视图View>模式.源-收听者Listener>模式或从属者模式)是软件设计模式的一种.在 ...

  8. js中的字典

    最近项目JS中需要建一个特殊的颜色库,需要用到类似C#中的dictionary的概念 然后一查发现JS没有dictionary 而是Array 初始化Array colorDic = new Arra ...

  9. ms-grid layout

    <!DOCTYPE html> <html> <head> <title></title> <script src="js/ ...

  10. Shell编程练习

    1.使用case语句 2.使用while....do....done语句 3.使用