Top*_*own 15 log4net projects-and-solutions
我有一个解决方案,包括一个主winforms应用程序,以及我希望记录的相关内部编写的类库dll.此记录应由同一记录器执行,无论主UI客户端或关联的dll是否调用此记录.dll当然可以被其他解决方案中具有不同记录器的其他应用程序使用,但在这些情况下将具有不同的log4net配置,并且可能是完全不同的一组appender.
一种方法是在主应用程序中创建单例并从中进行记录,但是由于log4net是它自己的单例,所以可以引用它,只要我们传递相同的字符串(或类型),log4net.LogManager.GetLogger我们将记录到相同的目的地(在我的情况下,我希望使用RollingFileAppender).
这有效.但是,鉴于DLL将具有许多类,这意味着我们希望记录的每个类实例化或静态类将需要i)定义记录器名称的参数(以便记录到同一目的地)和ii)在每个入口点都需要打电话log4net.LogManager.GetLogger(loggerName).
这里使用的最佳模式是什么?正确的方法是在每个程序集中创建单例实例吗?我担心的是,我们仍然需要将记录器名称传递给dll的每个入口点,这看起来有点过分.为了避免传入记录器名称,我可能会认为它始终等于System.Reflection.Assembly.GetCallingAssembly().GetName().Name.
如果这对于log4net来说太难了,还有其他更简单的解决方案,例如企业日志记录块吗?或者是面向方面编程(AOP)方法的最佳解决方案?
wag*_*ghe 19
差不多一年后,但我想我还是会做出贡献的!
根据您对Carl的帖子的评论,我想您可能误解了log4net的工作原理.是的,loggername确实标识了记录器.是的,记录器可以有很多appender.但是,许多记录器也可以写入SAME appender.因此,您可以将记录器"A","B"和"C"配置为所有记录到文件"X".您可以像这样获取记录器:
ILog logger_a = LogManager.GetLogger("A");
ILog logger_b = LogManager.GetLogger("B");
ILog logger_c = LogManager.GetLogger("C");
Run Code Online (Sandbox Code Playgroud)
现在,如果您使用这些记录器中的任何一个记录,如果您以这种方式配置它们,它们都可以转到相同的位置(文件"X").
在整个应用程序中不使用相同记录器名称的优点是,您可以通过配置文件控制应用程序中不同位置的日志记录级别.因此,如果使用记录器"A"和"B"的代码工作正常,但使用记录器"C"的代码出现问题,则可以关闭"A"和"B",然后转" C"一路向上.这样你就可以获得更少的信息来挖掘问题.
大多数人(或至少大多数log4net示例)实际上为每个CLASS创建一个静态记录器实例,以该类命名(我不记得确切的语法,但很容易找到示例).这为您提供了非常高的粒度级别,可用于控制日志记录.
在app.config文件中,您可以通过配置名为"*"的单个记录器来控制同一级别的所有记录器,或者您可以配置特定记录器(使用完全限定的类型名称),或者您甚至可以通过完全限定的部分配置类型名.例如,您可以非常轻松地将名称空间ABC日志中的所有类设置为"info"级别,名称空间DEF中的所有类都记录在"错误"级别,并且名称空间GHI中的所有类都不会记录.并且所有这些记录器都可以记录到同一目的地(例如文件X).
可能来不及帮忙,但也许不是......
| 归档时间: |
|
| 查看次数: |
14142 次 |
| 最近记录: |