【问题标题】:log4Net dilemmalog4Net 困境
【发布时间】:2011-03-16 18:43:06
【问题描述】:

我有一个包含多个 C# 项目的 C# 解决方案。我计划在其中添加日志记录。此日志记录应该在所有项目中都可用,并且最好使用带有滚动文件日志的 log4Net。

在上述前提下,我可以想到两种方法。

  1. 在解决方案的入口点(程序类)中初始化记录器并获取记录器实例并将其用作每个需要记录的类的成员变量。

  2. 添加另一个项目,实用程序并使用静态日志记录方法定义一个日志记录类。此类应在解决方案的入口点(程序类)中初始化。

最好的解决方案是什么?

【问题讨论】:

    标签: c# logging log4net


    【解决方案1】:

    我也有类似的情况。我们所做的是为所有项目使用 1 个应用配置并使用链接来引用它。

    在 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);
    

    然后每个类都抓取相同的记录器(单例)。 这对你有用吗?

    【讨论】:

      【解决方案2】:

      在我的项目中,我围绕 LOG4NET 编写了一个包装器,以便(理论上)与 NLOG 等其他日志记录框架交换它,而不会破坏我的代码。

      我自己的日志类可以通过静态单例访问。它在这个单例中进行初始化。

      (顺便说一句:I published the source code over at the Code Project前段时间,或许能给你一些启发)

      【讨论】:

      • 你有没有发现自己在交换 log4net?
      • 还没有,我完全满意 :-) 我编写包装器的另一个原因是让函数更易于使用(对我而言)。
      【解决方案3】:

      如果您正在考虑每次都在入口点初始化某些东西,那么您就是在为自己编写一个依赖注入的案例。使用 DI 库(如 Unity、Castle 或您个人喜欢的任何风格),您可以执行构造函数注入或属性注入来自动初始化您的记录器类(或 Log4Net)。

      此外,您可以使用 DI 内核使其成为单例,这样您就只有一个活动实例。

      【讨论】:

        【解决方案4】:

        根据 Queso 的回答,我们有在运行时通过反射导入的 .dll。为了让他们使用 Log4Net,我们创建了一个包含所有适当配置部分的 log4net.config 文件。我们还使用同一行代码来初始化 Queso 引用的每个类中的日志。单独的配置允许我们在整个应用程序域中使用它。

        编辑我们还必须对 appsettings 文件进行修改以允许这样做。

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

        【讨论】:

          【解决方案5】:

          选项 1 是要走的路。

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

          构建包装器当然不是一个坏主意,但也不是绝对必要的。但它确实允许做一些事情:更改日志框架、使用 DI、添加额外的日志级别(例如 log.Verbose())或不同的日志重载......

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

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

          【讨论】:

          • 虽然如果您要将类模板化为默认包含该类,这似乎是一个不错的解决方案,但是否有充分的理由不使用可复制粘贴的版本 (GetCurrentMethod.DeclaringType)?
          • 还有另一种获取记录器的方法。看看这个:stackoverflow.com/questions/1466740/…
          • 当然,如果您不需要登录静态方法......如果您需要捕获静态方法(例如,从扩展方法记录),那将是不正确的回答,是吗?
          • 这不适用于静态方法,但对我来说这不是问题。如果模板更重要,那么您当然可以使用“DeclaringType”版本...
          猜你喜欢
          • 2013-04-23
          • 1970-01-01
          • 2011-04-14
          • 2017-10-08
          • 2016-02-04
          • 2012-01-08
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多