为什么我的log4net级别全部为false?

32

我在我的ASP.NET MVC3项目中使用log4net,但所有的日志属性(如IsDebugEnabled)都为false。

在我的AssemblyInfo中,我有:

[assembly: XmlConfigurator(Watch = true)]

在我的日志类中,我有

public Log4NetLogger()
{
    log4net.Config.XmlConfigurator.Configure();
    Logger = LogManager.GetLogger(System.Reflection.MethodBase.GetCurrentMethod().DeclaringType);
}

我的 Web.Config 中相关的配置内容是:

<?xml version="1.0" encoding="utf-8"?>
<!--
  For more information on how to configure your ASP.NET application, please visit
  http://go.microsoft.com/fwlink/?LinkId=152368
  -->
<configuration>
  <configSections>
    <sectionGroup name="applicationSettings" type="System.Configuration.ApplicationSettingsGroup, System, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
      <section name="log4net" type="log4net.Config.Log4NetConfigurationSectionHandler, log4net" requirePermission="false"/>
       </sectionGroup>
  </configSections>

    <log4net debug="false">
      <appender name="AdoNetAppender" type="log4net.Appender.AdoNetAppender">
        <bufferSize value="100" />
        <connectionType value="System.Data.SqlClient.SqlConnection, System.Data, Version=1.0.3300.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" />
        <connectionString value="{removed}" />
        <commandText value="INSERT INTO Logging ([Date],[Thread],[Level],[Logger],[Message],[Exception]) VALUES (@log_date, @thread, @log_level, @logger, @message, @exception)" />
        <parameter>
          <parameterName value="@log_date" />
          <dbType value="DateTime" />
          <layout type="log4net.Layout.RawTimeStampLayout" />
        </parameter>
        <parameter>
          <parameterName value="@thread" />
          <dbType value="String" />
          <size value="255" />
          <layout type="log4net.Layout.PatternLayout">
            <conversionPattern value="%thread" />
          </layout>
        </parameter>
        <parameter>
          <parameterName value="@log_level" />
          <dbType value="String" />
          <size value="50" />
          <layout type="log4net.Layout.PatternLayout">
            <conversionPattern value="%level" />
          </layout>
        </parameter>
        <parameter>
          <parameterName value="@logger" />
          <dbType value="String" />
          <size value="255" />
          <layout type="log4net.Layout.PatternLayout">
            <conversionPattern value="%logger" />
          </layout>
        </parameter>
        <parameter>
          <parameterName value="@message" />
          <dbType value="String" />
          <size value="4000" />
          <layout type="log4net.Layout.PatternLayout">
            <conversionPattern value="%message" />
          </layout>
        </parameter>
        <parameter>
          <parameterName value="@exception" />
          <dbType value="String" />
          <size value="2000" />
          <layout type="log4net.Layout.ExceptionLayout" />
        </parameter>
      </appender>
      <!--Possible levels:-->
      <!--DEBUG-->
      <!--INFO-->
      <!--WARN-->
      <!--ERROR-->
      <!--FATAL-->
      <root>
        <level value="All" />
        <appender-ref ref="AdoNetAppender" />
      </root>
    </log4net>

  </applicationSettings>

</configuration>

我已经非常沮丧,只想做...

public Log4NetLogger()
{
    Logger = LogManager.GetLogger(System.Reflection.MethodBase.GetCurrentMethod().DeclaringType);


    Logger.IsDebugEnabled = true;
}

然而,Logger.IsDebugEnabled 没有任何 setter :/

我该怎么做才能让这个该死的东西工作?


如果您已经解决了这个问题,能否请您批准下面的一个答案? - Ben Cameron
14个回答

32

我也遇到过这个问题。我通过在Global.asax.cs的Application_Start方法中使用以下代码来解决它(假设它是一个.NET Web应用程序)。

log4net.Config.XmlConfigurator.Configure();

当我调用log4net.Config.XmlConfigurator.Configure()时,出现“没有重载方法'Configure'接受0个参数”的错误。我使用的是log4net的2.0.8版本。是否有什么变化? - Laurence

19
请将您的代码更改为以下内容,放在 AssemblyInfo.cs 中:
[assembly: log4net.Config.XmlConfigurator(ConfigFile = "log4net.config", Watch = true)]

并将log4net的配置放入该文件中。


谢谢,那帮了我。有人知道为什么它不能获取配置文件吗?我的其他项目中没有这行代码也可以运行。 - Ivan Yurchenko
2
在Visual Studio中,右键单击您的配置文件>属性>在高级部分中搜索“复制到输出目录”,将其更改为始终复制。 - Anurag Choudhary
@AnuragChoudhary 这是对我来说的答案,将其复制出来。谢谢! - Trevor Hart

7

看起来您错过了配置文件属性设置更改复制到输出目录 =“始终复制” 请查看此设置图像以获取更多详细信息。 配置文件设置属性


7

您的应用程序未能成功初始化log4net。您可以在“Application_Start”中加入以下代码进行手动初始化:

log4net.Config.XmlConfigurator.Configure();

或者

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

在 AssemblyInfo.cs 文件中。

1
对于测试类,您只需将此行添加到构造函数中即可。(这就是我所缺少的。) - Nacho
这也是我的问题[在我的单元测试中]。谢谢! - Scott Fraley

6

Log4net期望其配置部分不被分组。因为在您的配置中,您将log4net部分放在了ApplicationSettingsGroup(applicationSettings)中,log4net将无法找到其配置。您可以将log4net部分移出组或在调用XmlConfigurator.Configure时指定组:

XmlConfigurator.Configure(
    ConfigurationManager.GetSection(
        "applicationSettings/log4net") as XmlElement);

3

日志级别区分大小写,所以应该使用:

<level value="ALL" />

而非

<level value="All" />

我还发现创建一个单独的 log4net 配置文件更加简单。创建一个名为 log4net.config 的文件,并将“复制到输出目录”属性设置为“始终复制”(将配置从 App.config 复制到此文件中)。

然后,在设置配置时使用:

XmlConfigurator.Configure(new System.IO.FileInfo("log4net.config"));


1
我已经都正确了,但仍然遇到了与原始问题的作者相同的问题。 - Radek Strugalski

3

请将AssemblyInfo.cs文件中的代码更改为以下内容:

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

确保已添加log4net dll,并在web.config文件中加入log4net的配置信息。

<configuration>
  <configSections>
    <section name="log4net" type="log4net.Config.Log4NetConfigurationSectionHandler" />
  </configSections>
  <log4net>
    <root>
      <level value="DEBUG" />
      <appender-ref ref="RollingFileAppender" />
    </root>
    <appender name="RollingFileAppender" type="log4net.Appender.RollingFileAppender">
      <file value="C:\LOGS\IDMUserRoleManagement\IDMUserRoleManagement.txt" />
      <appendToFile value="true" />
      <rollingStyle value="Size" />
      <maxSizeRollBackups value="5" />
      <maximumFileSize value="1000KB" />
      <staticLogFileName value="true" />
      <layout type="log4net.Layout.PatternLayout">
        <conversionPattern value="%d{yyyy-MM-ddTHH:mm:ss} %-5p [%t] - %m%n" />
      </layout>
    </appender>
  </log4net>
</configuration>

2

我以前从来没见过 <level value="All" />,通常我只会把 value 设置为这些级别中的一个(因为它们包含了它们上面或下面的级别,在您的配置文件中列出的级别栈中)。像这样:

<level value="DEBUG" />

你也可以尝试使用显式记录器进行测试,以查看问题是否可能是其他原因引起的。类似于以下代码中与appender节点相邻的简单内容:
<logger name="Log4NetTEST" >
  <level value="DEBUG" />
  <appender-ref ref="AdoNetAppender" />
</logger>

当你在代码中测试它时,你需要像这样创建日志记录器:

LogManager.GetLogger("Log4NetTEST");

3
我自多年以来一直成功地使用 <level value="ALL" /> :-) - Uwe Keim
2
FWIW:Log4Net 的可能取值包括:ALL、DEBUG、INFO、WARN、ERROR、FATAL、OFF。请记住,它们也是区分大小写的。 - Metro Smurf

1
你可能想要添加经典的系统诊断工具来找出为什么log4net无法正常工作。
将此内容添加到您的应用程序或Web配置文件中,并检查log.txt文件:
<system.diagnostics>
  <trace autoflush="true" indentsize="4">
    <listeners>
      <add name="consoleListener" type="System.Diagnostics.ConsoleTraceListener"/>
      <add name="textWriterListener" type="System.Diagnostics.TextWriterTraceListener" initializeData="log.txt"/>
      <remove name="Default"/>
    </listeners>
  </trace>
</system.diagnostics>

这是我的案例:
log4net: config file [C:\proj\bin\Debug\log4net.config] not found. Configuration unchanged.

根据另一个答案的解释,必须更改为将log4net.config属性复制到始终复制


0

我曾经遇到过同样的问题。我使用了一个单独的文件,并将其命名为log.config。我所需要做的就是在Visual Studio的解决方案资源管理器中标记该文件属性为“始终复制”以将其复制到输出目录中。这对我起了作用。


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