【问题标题】:redirect log4net logs from third party从第三方重定向 log4net 日志
【发布时间】:2018-10-18 21:56:52
【问题描述】:

我有一个第三方使用如下配置文件:

<?xml version="1.0" encoding="utf-8" ?>
<configuration>
  <configSections>
    <section name="log4net" type="log4net.Config.Log4NetConfigurationSectionHandler,log4net" />
    <!--Others sections-->
  </configSections>

  <log4net>
    <appender name="RollingFileAppender" type="log4net.Appender.RollingFileAppender">
      <file value=".\logs\logclient.txt" />
      <appendToFile value="false" />
      <rollingStyle value="Date" />
      <maximumFileSize value="1000KB" />
      <layout type="log4net.Layout.PatternLayout">
        <conversionPattern value="%date  [%thread] %-5level %logger [%ndc] - %message%newline" />
      </layout>
    </appender>
    <root>
      <level value="DEBUG" />
      <appender-ref ref="RollingFileAppender" />
    </root>
  </log4net>

</configuration>

第三方代码如下:

LogManager.GetRepository(Assembly.GetCallingAssembly()), configFile);

LogManager.GetLogger(MethodBase.GetCurrentMethod().DeclaringType);

我希望第三方 dll 使用我自己的配置文件中定义的附加程序。我该如何管理?

注意:

  • 第三方需要使用自己的配置文件,因为其他人 部分是强制性的,我无法将它们添加到我的文件中
  • 我可以修改第三方配置文件,我的不能修改

【问题讨论】:

  • DLL 使用托管它们的任何 EXE 的 app.config。因此,如果您加载 DLL,它正在使用您的 app.config。所以当你说“第三方需要使用自己的配置文件”时,我很困惑。 .NET app.configs 不能这样工作。
  • 其实我有两个配置文件:一个app.config(我的代码使用)和一个thirdParty.dll.config(第三方使用)。我不知道是否相关,但 thirdParty.dll 与我的应用程序不在同一个文件夹中,它是手动加载并由反射使用。
  • 与其试图强制它使用您自己的配置中定义的附加程序,为什么不直接将其复制并粘贴到他们的配置中,然后瞧......?
  • @JohnnyStrings 我真的很讨厌重复 :) 我需要在执行时进行复制/粘贴,因为我不想维护这两个配置文件,而且主 log4net 文件配置也很大( 1000+ 行)并且可以“隐藏”第三方配置的相关配置。认为这应该工作:)
  • 部署时间和执行时间一样好吗?如果是这样,也许自动部署可以为您完成副本?

标签: c# log4net


【解决方案1】:

现有两个问题提出了动态编辑 log4net 配置的解决方案:

【讨论】:

    【解决方案2】:

    据我了解,你必须使用第三方配置文件,你可以修改它。

    configSource 属性/属性应该可以重定向第三方配置文件的 log4net 配置部分。

    在第三方配置文件中:

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

    【讨论】:

      【解决方案3】:

      log4net 库是一个帮助程序员输出日志语句的工具 到各种输出目标。

      您也可以在代码中配置log4net 而不是使用配置文件,this SO 帖子清楚地解释了这个问题。

      动态改变appender:

      public static void ChangeFilePath(string appenderName, string newFilename)
              {                       
                  log4net.Repository.ILoggerRepository repository = log4net.LogManager.GetRepository();
                  foreach (log4net.Appender.IAppender appender in repository.GetAppenders())
                  {
                      if (appender.Name.CompareTo(appenderName) == 0 && appender is log4net.Appender.FileAppender)
                      {
                          log4net.Appender.FileAppender fileAppender = (log4net.Appender.FileAppender)appender;
                          fileAppender.File = System.IO.Path.Combine(fileAppender.File, newFilename);
                          fileAppender.ActivateOptions();                   
                      }
                  }           
              }
      

      Reference post

      【讨论】:

        【解决方案4】:

        如果您的 .NET 应用程序引用了thirdparty.dll,则在运行时应用程序将完全忽略thirdparty.dll.config。此外,thirdparty.dll 不会获取 thirdparty.dll.config 中的设置,因为它希望这些设置由 exe 加载。

        您要做的就是将thirdparty.dll.config 的内容合并(或复制)到您自己的app.config 中。您的应用和第三方.dll 都可以获取您的 app.exe.config 中的设置,您只需要维护一个 .config 文件。

        此外,您可以向 log4net 部分添加额外的附加程序,您的应用程序和第三方.dll 都会获取该附加程序。

        【讨论】:

        • 第三方从他们期望的文件格式为 ThirdPartyDllPath.dll.config 手动加载 log4net 配置
        猜你喜欢
        • 2011-05-29
        • 2012-04-22
        • 2016-12-18
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2020-01-10
        • 1970-01-01
        相关资源
        最近更新 更多