【问题标题】:How do I make log4net available from a class library dll?如何使 log4net 从类库 dll 中可用?
【发布时间】:2012-02-03 07:47:05
【问题描述】:

我想我错过了什么。我在类库 dll 中编写了一个自定义 log4net 附加程序,所以我想我也应该通过它公开 log4net。这样其他人只需添加带有 log4net 的单个日志记录类库,他们就可以获得自定义附加程序。

我需要包装 log4net 来执行此操作还是有其他方法可以公开它?

【问题讨论】:

    标签: .net log4net


    【解决方案1】:

    【讨论】:

      【解决方案2】:

      我更喜欢封装 log4net 并为所有日志记录需求提供单点入口。 例如。

      我的界面会是这样的

      public interface ICustomLogger : ILog
          {
      
          }
      

      我的记录器类将是这样的。

          public  class CustomLogger : ICustomLogger
              {
                  private ILog log4netLogger;
                  public TMALogger(ILog logger)
                  {
                      log4netLogger = logger;
                  }
      //Plus all the methods that you would need to implement for ICustomLogger
          }
      

      LogManager 会是这样的。

      public class LogManager
          {
              public static ICustomLogger GetLogger(Type type)
              {
                  ICustomLogger logger = null;
                  try
                  {
                      ILog log4netLogger = log4net.LogManager.GetLogger(type);
                      CustomLogger customLogger = new CustomLogger(log4netLogger);
                      logger = customLogger;
                  }
                  catch (Exception ex)
                  {
                      logger = null;
      
                  }
                  return logger;
              }
          }
      

      最后记录器将在类中使用

      private readonly ICustomLogger _logger = LogManager.GetLogger(typeof(ClassName));
      

      我希望这会有所帮助。

      【讨论】:

      • 在这种情况下配置如何工作?你还在config中引用log4net.Appender.ConsoleAppender还是变成customdll.Appender.ConsoleAppender?
      • Config 的工作方式与 log4net 相同。我还是参考log4net.Appender.ConsoleAppender,配置部分不会有变化。
      【解决方案3】:

      如果您编写了一个 appender,您需要做两件事才能使用它:配置它(像任何其他 appender 一样)并确保您的程序集已部署。

      为了配置它,您需要在 log4net 配置中的某个地方为您的 appender 设置一个块:

      <appender name="YourCustomAppenderName" type="YourAssemblyNameSpace.YourAppenderType">
          ....
      </appender>
      

      根据我的经验,当您 fully qualify 您的程序集时效果最好,但这并不是绝对必要的。第二部分可以由安装程序完成,但一种可能有点粗略但非常有效的方法是在应用程序中创建对 appender 程序集的引用。这样程序集将始终被复制到输出目录。

      为此不需要编写包装器。编写包装器可能是有原因的,但如果您希望能够拥有附加功能(例如接受附加参数的方法),则应该这样做。包装器的另一个原因可能是您可以用其他东西替换 log4net(尽管更新所有配置文件仍然需要一些工作)

      【讨论】:

      • 我可以使用 appender,但它在所有需要日志记录的内部项目中都很有用,因此我可以将单个 dll 添加到项目中似乎是合乎逻辑的。
      • 我同意将所有日志记录功能放在一个程序集中,但我绝不会考虑将 log4net 与我的 DLL 合并或编写包装器而没有任何理由。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2013-11-26
      • 2014-12-28
      • 1970-01-01
      • 2012-09-21
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多