我正在创建一个类库,它将在我们公司的许多新项目中重用。我需要将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文件添加任何内容,那么日志记录在调用log方法的库文件中不执行任何操作(使用该库的项目会正确记录事件)。
如果我将[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实现日志消息,并发现以下内容似乎是一个问题:
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]
答案 0 :(得分:1)
我以相同的方式使用log4net,配置在应用程序文件app.config或web.config中编写,并在应用程序代码中配置文件监视器。该库仅使用您使用的相同静态日志参数进行日志记录。我的猜测是你的双组件配置调用导致了一个问题。尝试从库中删除一个。
答案 1 :(得分:0)
如果有多个应用程序记录到同一文件,则需要配置锁定模型。将锁定设置为MinimalLock时,应用程序将仅在写入时锁定文件。这可以通过将lockModel节点添加到appender来完成:
<appender name="DebugFileAppender" type="log4net.Appender.RollingFileAppender" >
**<lockingModel type="log4net.Appender.FileAppender+MinimalLock"/>**
[...]
</appender>