Я создаю библиотеку классов, которые будут повторно использоваться среди многих новых проектов в нашей компании. Мне нужно добавить 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 таким же образом, config написан в файлах приложений app.config или web.config и наблюдателя файлов, настроенных в коде приложения. Библиотека регистрируется только с использованием того же статического параметра журнала, что и вы. Я предполагаю, что ваши вызовы конфигурации с двойной сборкой вызывают проблему. Попробуйте удалить его из библиотеки.
Когда у вас есть несколько журналов приложений в один и тот же файл, вам нужно будет настроить модель блокировки. При установке блокировки на MinimalLock приложения будут блокировать файл только при записи. Это можно сделать, добавив узел lockModel в ваш appender:
<appender name="DebugFileAppender" type="log4net.Appender.RollingFileAppender" >
**<lockingModel type="log4net.Appender.FileAppender+MinimalLock"/>**
[...]
</appender>