log4Net困境

8
我有一个包含多个C#项目的解决方案。我计划在其中添加日志记录功能。这些日志记录应该在所有项目中都可用,并且最好使用log4Net进行滚动文件日志记录。
基于上述前提,我可以想到两种方法来实现:
1. 在解决方案的入口点(Program类)中初始化记录器并获取记录器实例,并将其用作需要记录日志的每个类的成员变量。 2. 添加另一个项目“Utilities”,并定义一个具有静态日志记录方法的Logging类。这个类应该在解决方案的入口点(Program类)中初始化。
哪种方法可能是最佳的解决方案?
5个回答

7

我有类似的情况。我们所做的是使用一个应用程序配置文件来管理所有项目,并使用链接引用它。

在您的应用程序的app.config中,设置log4net配置部分。

  <configSections>
    <section name="log4net" type="log4net.Config.Log4NetConfigurationSectionHandler, log4net"/>
  </configSections>

然后设置Appender:

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

在你想要记录日志的每个类中,你需要放置类似于以下的行:
private static readonly ILog log = log4net.LogManager.GetLogger(MethodBase.GetCurrentMethod().DeclaringType);

那么每个类都获取相同的日志记录器(单例)。这对你有用吗?


0
在我的项目中,我编写了一个LOG4NET的包装器,理论上可以将其与其他日志框架(如NLOG)交换而不破坏我的代码。
我的自定义日志类通过静态单例可访问。它在这个单例中进行初始化。
(顺便说一句:我之前在Code Project上发布了源代码,也许可以给你一些启示)

1
你是否曾经发现自己在交换log4net? - Tundey
还没有,我完全满意 :-) 我编写包装器的另一个原因是使函数更易于使用(对我来说)。 - Uwe Keim

0
如果你每次都想在入口点初始化某些东西,那么你就需要为依赖注入编写一个案例。使用 DI 库(如 Unity、Castle 或你个人喜欢的任何风格),你可以使用构造函数注入或属性注入来自动初始化日志记录器类(或 Log4Net)。
此外,你还可以使用 DI 内核将其设置为单例,这样你只有一个实例处于活动状态。

0
建立在Queso的回答之上,我们在运行时使用反射导入了.dll文件。为了让它们使用Log4Net,我们创建了一个log4net.config文件,其中包含所有适当的配置部分。我们还使用了Queso引用的每个类中相同的代码行来初始化日志记录。不同的配置允许我们在整个应用程序域中使用它。
编辑:我们还必须修改appsettings文件以允许此操作。

http://haacked.com/archive/2005/03/07/ConfiguringLog4NetForWebApplications.aspx


0

选项1是可行的方法。

如果您使用静态方法,您将失去使用分层记录器的能力。此功能允许您为单个类甚至整个子系统(例如YourNameSpace.Security)配置不同的日志输出。 tutorial详细介绍了此主题(也可以阅读其他章节)。

构建包装器当然不是一个坏主意,但这并非完全必要。它确实允许一些事情:更改日志框架,使用DI,添加额外的日志级别(例如log.Verbose())或不同的重载以进行记录......

顺便说一句,我会像这样初始化记录器:

ILog log = LogManager.GetLogger(typeof(YourClass));

虽然如果您要默认包含模板类,这似乎是一个可以接受的解决方案,但不使用 copypasta 友好版本 (GetCurrentMethod.DeclaringType) 有什么好理由吗? - Tetsujin no Oni
有另一种获取记录器的方法。看看这个链接:https://dev59.com/JknSa4cB1Zd3GeqPOXw7 - Stefan Egli
当然,如果您从不需要在静态方法中记录日志... 如果您需要捕获静态方法(比如从扩展方法中记录日志),那么这就不是正确的答案了,对吧? - Tetsujin no Oni
这对于静态方法不起作用,但对我来说这不是问题。如果模板更重要,那么你当然可以使用“DeclaringType”版本... - Stefan Egli

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接