类库中的log4net

时间:2014-05-27 14:27:24

标签: c# log4net

我正在创建一个类库,它将在我们公司的许多新项目中重用。我需要将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]   

2 个答案:

答案 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>