Перенаправлять журналы log4net от сторонних производителей

У меня есть сторонний файл конфигурации, который выглядит так:

<?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 использовала мой собственный appender, определенный в моем собственном файле конфигурации. Как я могу это сделать?

Примечание:

  • третьей стороне необходимо использовать собственный файл конфигурации, поскольку другие разделы обязательны, и я не могу добавить их в свой файл
  • Я могу изменить файл конфигурации третьей стороны, я не могу изменить мой

Ответы

Ответ 2

Насколько я понимаю, вы должны использовать файл конфигурации третьей стороны, и вы можете его изменить.

Свойство/атрибут configSource должно работать для перенаправления раздела конфигурации log4net файла конфигурации вашей сторонней организации.

В файле конфигурации третьей стороны:

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

<log4net configSource="pathtoyourlog4net.config" />

Ответ 3

Если ваше приложение .NET ссылается на файл thirdparty.dll, во время выполнения приложение полностью игнорирует файл thirdparty.dll.config. Кроме того, файл thirdparty.dll не будет загружать настройки в файле thirdparty.dll.config, так как ожидается, что они будут загружены exe.

Что вам нужно сделать, это объединить (или реплицировать) содержимое файла thirdparty.dll.config в свой собственный app.config. Как ваше приложение, так и файл thirdparty.dll смогут загружать настройки в файл app.exe.config, и вам нужно поддерживать только один файл .config.

Кроме того, вы можете добавить дополнительные приложения в раздел log4net, и это будет срабатывание как вашего приложения, так и файла thirdparty.dll

Ответ 4

Библиотека log4net - это инструмент, помогающий выводам операторов журнала вывода к различным целевым показателям.

Вы также можете настроить log4net в коде вместо использования файла конфигурации, this Сообщение SO четко объясняет вопрос.

Динамически изменить приложение:

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();                   
                }
            }           
        }

Ссылка