log4net无法记录日志。

4
所以由于某种原因,我们的日志记录器停止了记录,我完全不知道为什么。 我在我的项目中使用以下内容: log4net配置:
<?xml version="1.0" encoding="utf-8"?>
<log4net>
  <root>
    <level value="DEBUG" />
    <appender-ref ref="UdpAppender" />
    <appender-ref ref="RollingFile" />
  </root>

  <appender name="UdpAppender" type="log4net.Appender.UdpAppender">
    <remoteAddress value="127.0.0.1" />
    <remotePort value="8180" />
    <layout type="log4net.Layout.XmlLayoutSchemaLog4j">
      <locationInfo value="true" />
    </layout>
  </appender>

  <appender name="RollingFile" type="log4net.Appender.RollingFileAppender">
    <file value="Logs/DA.RA.log"/>
    <lockingModel type="log4net.Appender.FileAppender+MinimalLock"/>
    <appendToFile value="true"/>
    <maxSizeRollBackups value="10"/>
    <maximumFileSize value="10MB"/>
    <rollingStyle value="Size"/>
    <staticLogFileName value="true"/>
    <layout type="log4net.Layout.PatternLayout">
      <conversionPattern value="%-5level %date %logger - %message%newline"/>
    </layout>
  </appender>
</log4net>

在我的web.config文件中,我有以下这行代码:

<section name="log4net" 
         type="log4net.Config.Log4NetConfigurationSectionHandler,log4net, Version=1.2.11.0, Culture=neutral, PublicKeyToken=a3d255455d3dcb36" 
         requirePermission="false"/>

在我的 global.asax 文件中,我有以下代码行在 application_start 方法中:
string filename = Server.MapPath( @"~\XML\log4net.xml" );
log4net.Config.XmlConfigurator.ConfigureAndWatch( new System.IO.FileInfo( filename ) );

当我在任何一个页面中调用日志记录器时,我使用以下代码:

private static readonly ILog logger = LogManager.GetLogger(typeof(ReportParameters));

我尝试了许多在网上找到的不同方法。这些方法包括:

在我的项目程序集中添加以下行:

[assembly: log4net.Config.XmlConfigurator(Watch=true)]

我尝试过:

[assembly: log4net.Config.XmlConfigurator()]

我已将log4net.dll的版本从1.2.10.0升级至1.2.11.0。

我尝试将log4net追加器添加到web.config文件中而不是它自己的文件中,但仍然无法输出日志。


可能是写日志的文件夹权限问题?这是log4net经常遇到的问题,特别是在IIS中托管时。我没有完全检查您的配置,但从听起来的声音来看,这在某个时候是有效的,但现在停止了,对吧?当然,首先要找出发生了什么变化!如果您的配置没有更改,那么可能是文件夹权限被更改了? - Jim
尝试这个:<appender name="rollingFile" type="log4net.Appender.RollingFileAppender,log4net"> - Felipe Ardila
也许某些东西出了问题,根本没有加载log4net配置... - Soulbe
3个回答

2

尝试打开log4net的内部调试并检查或分享结果:

注意:我制作了一个示例应用程序,使用了您相同的log4net.xml文件和ConfigureAndWatch语句,并且没有出现问题。我认为您可能存在文件名路径解析问题或写入权限问题。如果没有,请创建日志文件夹。

您需要添加到web.config中。

<appSettings>
  <add key="log4net.Internal.Debug" value="true" />
 </appSettings>

 <system.diagnostics>
  <trace autoflush="true">
   <listeners>
    <add
     name="textWriterTraceListener"
     type="System.Diagnostics.TextWriterTraceListener"
     initializeData="c:\\inetpub\\wwwroot\\log4net.txt" />
   </listeners>
  </trace>
 </system.diagnostics>

我已经尝试过这个,但是我没有看到会在那个位置显示日志的文本文件。 - James213
1
我非常确定,如果您正在执行这些操作,那么您可能遇到了权限问题。在我的计算机上,log4net内部调试文件和日志文件都可以创建。尝试创建一个名为d:\temp的文件夹,并授予每个人完全访问权限进行测试。此外,创建一个新的简单测试应用程序可能有助于调试或与我们共享。 - Nesim Razon
每当我在应用程序中执行已知使用日志的操作时,似乎会创建日志文件夹,但不会创建日志文件。 - James213
那个解决了问题,原来是一个权限问题,现在它是一个管理问题,而不是代码问题。感谢你的帮助! - James213

0
除了可能的文件权限问题外,我发现在使用时

[assembly: log4net.Config.XmlConfigurator()]

在ASP.NET项目中,我使用调试字符串追加器时它似乎从未真正执行任何操作。
对我来说解决方案是在global.asax的Application_Start事件中启动log4net。
protected void Application_Start()
{
    log4net.Config.XmlConfigurator.Configure();
}

没错,这就是我在 global.asax 的 application_start 方法中的代码。 - James213
@James213 哎呀,我看漏了那部分,抱歉。 - Matthew

0

替换这个:

<section name="log4net" 
         type="log4net.Config.Log4NetConfigurationSectionHandler,log4net, Version=1.2.11.0, Culture=neutral, PublicKeyToken=a3d255455d3dcb36" 
         requirePermission="false"/>

对于这个:

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

而不是

log4net.Config.XmlConfigurator.ConfigureAndWatch()

调用

log4net.Config.XmlConfigurator.Configure();

如果这样可以的话,请让我知道。


我创建了一个网站并添加了您的配置,只有在我提到的更改之后才起作用。请注意,当我引用log4net dll时,xml文件也会随之而来。此外,我将配置放在了webConfig中。很抱歉这没有帮助到您。 - Soulbe

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接