log4net в библиотеке классов

1

Я создаю библиотеку классов, которые будут повторно использоваться среди многих новых проектов в нашей компании. Мне нужно добавить log4net в журнал как для этой библиотеки, так и для проектов, которые используют библиотеку.

В моем проекте я использую следующие библиотеки:

log4net.config (используя DatePattern для создания файла журнала с именем Debug_2014-05.txt)

<?xml version="1.0" encoding="utf-8" ?>
<log4net xsi:noNamespaceSchemaLocation="log4net.xsd" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">

  <!-- Setup Rolling Log File to log all information -->
  <appender name="DebugFileAppender" type="log4net.Appender.RollingFileAppender" >
    <param name="File" value="${ProgramData}\\ConsoleExample\\log\\Debug" />
    <param name="AppendToFile" value="true"/>
    <param name="RollingStyle" value="Date"/>
    <param name="DatePattern" value="_yyyy-MM.\tx\t"/>
    <param name="StaticLogFileName" value="false"/>
    <layout type="log4net.Layout.PatternLayout">
      <conversionPattern value="%date [%thread] %-5level %logger - %message%newline" />
    </layout>
  </appender>

  <root>
    <level value="ALL" />
    <appender-ref ref="DebugFileAppender" />
  </root>

</log4net>

AssemblyInfo.cs

...
[assembly: log4net.Config.XmlConfigurator(ConfigFile = "log4net.config", Watch = true)]

App.config

<?xml version="1.0" encoding="utf-8" ?>
<configuration>

  <!-- log4net section -->
  <configSections>
    <section name="log4net" type="log4net.Config.Log4NetConfigurationSectionHandler, log4net" requirePermission="false" />
  </configSections>

  <startup> 
    <supportedRuntime version="v4.0" sku=".NETFramework,Version=v4.5" />
  </startup>
</configuration>

В любом файле, который реализует протоколирование:

private static readonly log4net.ILog log = log4net.LogManager.GetLogger
            (System.Reflection.MethodBase.GetCurrentMethod().DeclaringType.Name);

Если я ничего не добавляю к библиотечным файлам AssemblyInfo.cs, то регистрация не делает ничего в библиотечных файлах, которые вызывают метод журнала (проект, используя библиотеку, правильно регистрирует события).

Если я добавлю [assembly: log4net.Config.XmlConfigurator(ConfigFile = "log4net.config", Watch = true)] в файл AssemblyInfo.cs библиотеки, я получаю сообщение об ошибке:

log4net:ERROR [RollingFileAppender] Unable to acquire lock on file C:\ProgramData\ConsoleExample\log\Debug_2014-05.txt. The process cannot access the file 'C:\ProgramData\Delphia Consulting\ConsoleExample\log\Debug_2014-05.txt' because it is being used by another process.

Удивительно, но log4net создает еще один файл Debug_201405.txt_2014-05.txt. Есть ли способ получить файлы библиотеки для входа в файл Debug_2014-05.txt (тот же файл, который файлы проекта используют для ведения журнала)? Является ли второй файл каким-то по умолчанию, что log4net возвращается, если он не может получить доступ к указанному файлу?

РЕДАКТИРОВАТЬ

Я нашел еще одно сообщение, в котором объяснялось, как реализовать сообщения журнала для log4net, и обнаружил следующее, что кажется проблемой:

ConsoleExample started                                                          
log4net: log4net assembly [log4net, Version=1.2.10.0, Culture=neutral, PublicKeyToken=692fbea5521e1304]. Loaded from [Global Assembly Cache]. (.NET Runtime [4.0.30319.34014] on Microsoft Windows NT 6.3.9600.0)
log4net: DefaultRepositorySelector: defaultRepositoryType[log4net.Repository.Hierarchy.Hierarchy] 
log4net: DefaultRepositorySelector: Creating repository for assembly [DelphiaLibrary, Version=1.0.0.18979, Culture=neutral, PublicKeyToken=null] 
log4net: DefaultRepositorySelector: Assembly [DelphiaLibrary, Version=1.0.0.18979, Culture=neutral, PublicKeyToken=null] Loaded From [C:\Projects\DelphiaLibrary\ConsoleExample\bin\Debug\DelphiaLibrary.dll] 
--> log4net: DefaultRepositorySelector: Assembly [DelphiaLibrary, Version=1.0.0.18979, Culture=neutral, PublicKeyToken=null] does not have a RepositoryAttribute specified. 
log4net: DefaultRepositorySelector: Assembly [DelphiaLibrary, Version=1.0.0.18979, Culture=neutral, PublicKeyToken=null] using repository [log4net-default-repository] and repository type [log4net.Repository.Hierarchy.Hierarchy]             
log4net: DefaultRepositorySelector: Creating repository [log4net-default-repository] using type [log4net.Repository.Hierarchy.Hierarchy]   
Теги:
log4net

2 ответа

1

Я использую log4net таким же образом, config написан в файлах приложений app.config или web.config и наблюдателя файлов, настроенных в коде приложения. Библиотека регистрируется только с использованием того же статического параметра журнала, что и вы. Я предполагаю, что ваши вызовы конфигурации с двойной сборкой вызывают проблему. Попробуйте удалить его из библиотеки.

  • 0
    Как я уже говорил в своем посте, когда я убираю ссылку на log4net в сборке библиотеки, из библиотеки ничего не записывается, только проект, использующий библиотеку.
0

Когда у вас есть несколько журналов приложений в один и тот же файл, вам нужно будет настроить модель блокировки. При установке блокировки на MinimalLock приложения будут блокировать файл только при записи. Это можно сделать, добавив узел lockModel в ваш appender:

<appender name="DebugFileAppender" type="log4net.Appender.RollingFileAppender" >
   **<lockingModel type="log4net.Appender.FileAppender+MinimalLock"/>**
   [...]
</appender>

Ещё вопросы

Сообщество Overcoder
Наверх
Меню