为什么我的所有log4net级别都是假的?

时间:2011-12-28 15:53:18

标签: c# asp.net-mvc-3 log4net log4net-configuration

我在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没有任何制定者:/

我该怎么办才能让这个该死的东西上班?

14 个答案:

答案 0 :(得分:29)

我遇到过同样的问题。我使用Global.asax.cs中的Application_Start方法中的以下代码行来假设它(假设它是.Net Web应用程序)

log4net.Config.XmlConfigurator.Configure();

答案 1 :(得分:18)

AssemblyInfo.cs

中将您的行更改为以下内容
[assembly: log4net.Config.XmlConfigurator(ConfigFile = "log4net.config", Watch = true)]

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

答案 2 :(得分:6)

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

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

答案 3 :(得分:4)

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

答案 4 :(得分:3)

日志级别区分大小写,因此不是:

<level value="All" />

应该是

<level value="ALL" />

我还发现创建单独的log4net配置文件要容易得多。创建一个名为log4net.config的文件,并将复制到输出目录的属性设置为始终复制 - (将配置从App.config复制到此文件中)

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

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

答案 5 :(得分:2)

我之前从未见过<level value="All" />,通常我只是将value设置为其中一个级别(因为它们包含了它们之上的级别,或者低于它们,因为它们已列在其中您的配置,在级别堆栈中)。像这样:

<level value="DEBUG" />

您也可以尝试使用显式记录器对其进行测试,以查看问题是否可能是其他问题。像appender节点那样简单的东西,如:

<logger name="Log4NetTEST" >
  <level value="DEBUG" />
  <appender-ref ref="AdoNetAppender" />
</logger>

然后在您的代码中测试它时,您将创建这样的记录器:

LogManager.GetLogger("Log4NetTEST");

答案 6 :(得分:1)

在AssemblyInfo.cs中将您的行更改为以下内容:

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

确保添加log4net dll并将log4net的配置放在web.config文件中

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

答案 7 :(得分:1)

您无法在应用程序中初始化log4net。可以通过将其放置在“ Application_Start”下方来明确初始化

log4net.Config.XmlConfigurator.Configure();

答案 8 :(得分:0)

IsDebugEnabled没有setter,因为它是只读的。

使用log4net.Config.XmlConfigurator.Configure();在使用日志之前的任何方法

并在app.Config中设置应为:

    <root>
      <level value="ALL" />
      <appender-ref ref="AppenderName" />
    </root>

答案 9 :(得分:0)

您错过了applicationSettings的开头标记。这可能是原因

答案 10 :(得分:0)

如果类日志文件(Log4NetLogger)在一个单独的类库中,那么代码: [assembly:log4net.Config.XmlConfigurator(C .... 应该在同一个类库中。

例如: lib 1:my.web(一个mvc项目) lib 2:my.common(类库项目)

如果你在my.common中包装logmanager代码,那么&#34; [assembly:log4net.Config.XmlConfigurator(C ...&#34;应该在my.common中,如果你把它放在my.web中) ,它不会起作用!

修改

所有配置文件(app.config,web.config,log4net.config等)的使用都是基于上下文的。因此,如果您有一个应用程序调用类库,将使用的配置文件是App项目中的.Config而不是类库。

另一个例子,如果您对应用程序进行单元测试,则上下文是单元测试项目,以及将使用哪个配置文件,而不是应用程序的配置。

答案 11 :(得分:0)

在我的情况下,这是因为<configSections>不是<configuration>部分的第一个标记。这可以防止识别部分名称log4net。因此,日志实例显示IsDebugEnabled,所有其他实例显示为默认布尔值false。

这应该是这样的。

<configuration>
  <configSections>
    <section name="log4net" type="log4net.Config.Log4NetConfigurationSectionHandler,Log4net" />    
    <section name="entityFramework" type="System.Data.Entity.Internal.ConfigFile.EntityFrameworkSection, EntityFramework, Version=6.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" requirePermission="false" />
  </configSections>
<configuration>

答案 12 :(得分:0)

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

答案 13 :(得分:0)

您可能想要添加良好的旧系统诊断程序,以找出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属性复制到始终复制