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

Joh*_*ith 30 c# log4net asp.net-mvc-3 log4net-configuration

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

在我的AssemblyInfo中,我有:

[assembly: XmlConfigurator(Watch = true)]
Run Code Online (Sandbox Code Playgroud)

在我的日志课中,我有

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

我在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>
Run Code Online (Sandbox Code Playgroud)

我已经沮丧到想要做的事情

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


    Logger.IsDebugEnabled = true;
}
Run Code Online (Sandbox Code Playgroud)

但当然Logger.IsDebugEnabled没有任何二传手:/

为了让这个该死的东西起作用,我该怎么做?

Ben*_*ron 29

我遇到过同样的问题.我通过使用Application_StartGlobal.asax.cs 中的方法中的以下代码行来解决它(假设它是一个.Net Web应用程序)

log4net.Config.XmlConfigurator.Configure();
Run Code Online (Sandbox Code Playgroud)


Azi*_*uth 19

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

[assembly: log4net.Config.XmlConfigurator(ConfigFile = "log4net.config", Watch = true)]
Run Code Online (Sandbox Code Playgroud)

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

  • 在 Visual Studio 中,右键单击您的配置文件 &gt; 属性 &gt; 在“高级”部分中,搜索“复制到输出目录”,将其更改为“始终复制”。 (2认同)

小智 7

您未能在应用程序中初始化 log4net。这可以通过放置在“Application_Start”下面来显式初始化,

log4net.Config.XmlConfigurator.Configure();
Run Code Online (Sandbox Code Playgroud)

或者

[assembly: log4net.Config.XmlConfigurator(ConfigFile = "log4net.config")]
Run Code Online (Sandbox Code Playgroud)

在 AssemblyInfo.cs 中


nem*_*esv 6

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

XmlConfigurator.Configure(
    ConfigurationManager.GetSection(
        "applicationSettings/log4net") as XmlElement);
Run Code Online (Sandbox Code Playgroud)


小智 6

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


Dav*_*vid 2

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

<level value="DEBUG" />
Run Code Online (Sandbox Code Playgroud)

您也可以尝试使用显式记录器对其进行测试,看看问题是否可能是其他原因。appender与节点相邻的简单内容如下:

<logger name="Log4NetTEST" >
  <level value="DEBUG" />
  <appender-ref ref="AdoNetAppender" />
</logger>
Run Code Online (Sandbox Code Playgroud)

然后,当在代码中测试它时,您将创建如下记录器:

LogManager.GetLogger("Log4NetTEST");
Run Code Online (Sandbox Code Playgroud)

  • 多年来我一直在成功使用 `&lt;level value="ALL" /&gt;` :-) (3认同)
  • fwiw:Log4Net 的可能值为:ALL、DEBUG、INFO、WARN、ERROR、FATAL、OFF。请记住,这些也区分大小写。 (2认同)