gpt4 book ai didi

log4net - 在解决方案中的多个程序集中使用相同的 Log4net 记录器的最佳模式是什么?

转载 作者:行者123 更新时间:2023-12-03 20:17:30 26 4
gpt4 key购买 nike

我有一个解决方案,其中包含一个主要的 winforms 应用程序,以及我希望从中记录的相关内部编写的类库 dll。无论主 UI 客户端还是关联的 dll 调用 this.log 都应该由同一个记录器执行此日志记录。当然,dll 可能会被其他解决方案中具有不同记录器的其他应用程序使用,但在这些情况下将具有不同的 log4net 配置,并且可能完全不同的附加程序套件。

一种方法是在主应用程序中创建一个单例并从中记录日志,但是由于 log4net 是它自己的单例,只要我们将相同的字符串(或类型)传递给 log4net.LogManager.GetLogger 就可以引用它。我们将登录到同一个目的地(在我的情况下,我希望使用 RollingFileAppender)。

这有效。然而,鉴于 DLL 将有许多类,这意味着我们希望从中记录的每个类实例化或静态类都需要 i) 一个定义记录器名称的参数(以便记录到相同的目的地)和 ii)在每个入口点需要调用 log4net.LogManager.GetLogger(loggerName) .

在这里使用的最佳模式是什么?正确的方法是在每个程序集中创建一个单例实例吗?我在这里担心的是,我们仍然需要将记录器名称传递给 dll 的每个入口点,这似乎有点矫枉过正。为了避免传入记录器名称,我可能假设它总是等于 System.Reflection.Assembly.GetCallingAssembly().GetName().Name .

如果这对 log4net 来说太难了,是否还有其他更简单的解决方案,例如 Enterprise Logging Block?
或者最好的解决方案是面向方面的编程 (AOP) 方法?

Reference for anti-pattern approach for singleton here .

最佳答案

差不多一年后,但我想我无论如何都会做出贡献!

根据您对 Carl 帖子的评论,我认为您可能误解了 log4net 的工作原理。是的,loggername 确实可以识别记录器。是的,一个 logger 可以有很多 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");

现在,如果您使用这些记录器中的任何一个进行记录,如果您以这种方式配置它们,它们都可以转到同一个位置(文件“X”)。

在整个应用程序中不使用相同的记录器名称的优点是您可以通过配置文件控制应用程序中不同位置的日志记录级别。因此,如果使用记录器“A”和“B”的代码工作正常,但使用记录器“C”的代码有问题,您可以关闭“A”和“B”,然后关闭“C”一直向上。这样,您需要挖掘的信息更少才能找到问题。

大多数人(或至少大多数 log4net 示例)实际上为每个 CLASS 创建了一个静态记录器实例,以该类命名(我不记得确切的语法,但很容易找到示例)。这为您提供了用于控制日志记录的非常高的粒度级别。

在你的 app.config 文件中,你可以通过配置一个名为“*”的记录器来控制同一级别的所有记录器,或者你可以配置特定的记录器(通过使用完全限定的类型名),或者你甚至可以通过完全限定的部分进行配置类型名称。例如,您可以非常轻松地将命名空间 ABC 中的所有类记录在“信息”级别,将命名空间 DEF 中的所有类记录在“错误”级别,并且根本不记录命名空间 GHI 中的所有类。并且所有这些记录器都可以记录到相同的目的地(例如文件 X)。

可能已经来不及提供帮助,但也许不会......

关于log4net - 在解决方案中的多个程序集中使用相同的 Log4net 记录器的最佳模式是什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1713043/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com