2015-05-21 3 views
15

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

NB:

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

библиотеки DLL использовать app.config в любой EXE является их хостинг. Поэтому, если вы загружаете DLL, он использует ваш app.config. Поэтому я смущен, когда вы говорите: «третьей стороне нужно использовать собственный файл конфигурации». .NET app.configs не работают таким образом. –

+0

На самом деле у меня есть два файла конфигурации: один app.config (используется моим кодом) и один thirdParty.dll.config (используется сторонним). Я не знаю, имеет ли значение, но файл thirdParty.dll находится не в той же папке, что и мое приложение, и оно загружается вручную и используется при отражении. – Toto

+0

Вместо того, чтобы заставить его использовать приложение, определенное в вашей собственной конфигурации, почему бы просто не скопировать и вставить его в свою конфигурацию, а вуаля ...? – johnjps111

ответ

0

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

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

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

+0

Третья сторона вручную загружает конфигурацию log4net из файла, который, как они ожидают, будет иметь форму ThirdPartyDllPath.dll.config – Toto

2

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

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

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

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

<log4net configSource="pathtoyourlog4net.config" /> 
0

библиотека 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