c# - 我的 .Net 网站上的 Log4Net 调试时总是将 IsErrorEnabled 值显示为 FALSE

标签 c# asp.net asp.net-mvc log4net log4net-appender

我一直在尝试使用 Log4Net AdoNetAppender 将我的 .Net 网站中的错误记录到 SQL 数据库中,但错误消息没有记录到数据库中。看起来 AdoNetAppender 没有被启用或读取。在调试时,我观察到 Logger.Log 将其所有属性值显示为 false。即 IsErrorEnabled/IsDebugEnabled/IsFatalEnabled/IsInfoEnabled/IsWarnEnabled 全部为 false。

我使用的log4net.dll版本是2.0.8.0

click here to view image of object properties

logging.cs 代码如下:

[assembly: log4net.Config.XmlConfigurator(Watch = true)]
namespace Utility.Library
{
    public class Logging
    {

        public static class Logger
        {
            public static ILog Log = LogManager.GetLogger(typeof(SharedMethods));
        }

        public static class LogException
        {

            private static StringBuilder sessionJobLogBuilder = new StringBuilder();

            public static void LogError(string sMsg, Exception ex)
            {

                Logger.Log.Error(sMsg, ex);
                sessionJobLogBuilder.AppendLine(sMsg + Environment.NewLine);
                sessionJobLogBuilder.AppendLine(ex.ToString() + Environment.NewLine);

            }

            public static void LogInfo(string sMsg)
            {
                Logger.Log.Info(sMsg);
                sessionJobLogBuilder.AppendLine(sMsg + Environment.NewLine);
            }

        }

    }

}

下面是 app.config:

<?xml version="1.0" encoding="utf-8" ?>
<configuration>
  <configSections>
    <section name="log4net" type="log4net.Config.Log4NetConfigurationSectionHandler, log4net"/>
  </configSections>
  <log4net>
    <appender name="AdoNetAppender" type="log4net.Appender.AdoNetAppender">
      <bufferSize value="1" />
      <connectionType value="System.Data.SqlClient.SqlConnection, 
   System.Data, Version=1.0.3300.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" />
      <connectionString value="data source=xxx\xxx;
    initial catalog=xxx;integrated security=false;
    persist security info=True;User ID=xxx;Password=xxx" />
      <commandText value="EXECUTE [dbo].[WriteLogEntry] @App, @Module, @Ver, @Computer, @UserID, @Level, @Message, @Exception" />
      <parameter>
        <parameterName value="@App" />
        <dbType value="String" />
        <size value="30" />
        <layout type="log4net.Layout.PatternLayout">
          <conversionPattern value="%App" />
        </layout>
      </parameter>
      <parameter>
        <parameterName value="@Module" />
        <dbType value="String" />
        <size value="200" />
        <layout type="log4net.Layout.PatternLayout">
          <conversionPattern value="%Module" />
        </layout>
      </parameter>
      <parameter>
        <parameterName value="@Ver" />
        <dbType value="String" />
        <size value="20" />
        <layout type="log4net.Layout.PatternLayout">
          <conversionPattern value="%Ver" />
        </layout>
      </parameter>
      <parameter>
        <parameterName value="@Computer" />
        <dbType value="String" />
        <size value="15" />
        <layout type="log4net.Layout.PatternLayout">
          <conversionPattern value="%Computer" />
        </layout>
      </parameter>
      <parameter>
        <parameterName value="@UserID" />
        <dbType value="String" />
        <size value="30" />
        <layout type="log4net.Layout.PatternLayout">
          <conversionPattern value="%UserID" />
        </layout>
      </parameter>
      <parameter>
        <parameterName value="@Level" />
        <dbType value="Int32" />
        <layout type="log4net.Layout.PatternLayout" />
      </parameter>
      <parameter>
        <parameterName value="@Message" />
        <dbType value="String" />
        <size value="2000" />
        <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>
    <root>
      <level value="ALL" />
      <appender-ref ref="AdoNetAppender"/>
    </root>
  </log4net>
</configuration>

但是所有级别的 Logger.Log 属性都显示为 false。

最佳答案

从你的评论中我读到你有一个单独的 app.config文件和 Logger在单独的程序集中定义的类。

ASP.NET网站只考虑 web.config文件。
你的app.config文件未加载,因此 Log4net未应用配置。

解决此问题的一种方法是转换您的 app.config文件到一个单独的Log4net配置文件并显式加载它。

  1. 移动<log4net> ... </log4net>内容来自app.config文件到网站项目根目录中的单独文件(按照约定命名为 Log4net.config )。
    <log4net>元素必须是该文件中的根 xml 元素。

  2. 删除 [assembly: log4net.Config.XmlConfigurator(Watch = true)]来自你的 Logger项目。

  3. 将以下代码添加到Application_StartGlobal.asax的网站项目,以确保log4net配置在网站启动阶段加载。

    void Application_Start(object sender, EventArgs e)    
    {
        ILoggerRepository repository = log4net.LogManager.GetRepository(Assembly.GetExecutingAssembly());
        XmlConfigurator.Configure(repository, new FileInfo(Server.MapPath("log4net.config")));
    
        // Remaining startup code.
    }
    

我有以下 log4net.config在我的网站项目的根目录中(靠近 web.config)只有一个 RollingFileAppender但概念是一样的。

<log4net>
    <appender name="file" type="log4net.Appender.RollingFileAppender">
        <param name="ImmediateFlush" value="true" />
        <file value="Log.log" />
        <appendToFile value="true" />
        <rollingStyle value="Size" />
        <maxSizeRollBackups value="5" />
        <maximumFileSize value="10MB" />
        <staticLogFileName value="true" />
        <layout type="log4net.Layout.PatternLayout">
            <conversionPattern value="%date [%thread] %level %logger - %message%newline" />
        </layout>
    </appender>
    <root>
        <level value="ERROR" />
        <appender-ref ref="file" />
    </root>
</log4net>


用你的AdoNetAppender在我的 Log4net.config 中设置IsDebugEnabled 的预期值, IsErrorEnabled等。


总结:
Log4net 的 internal debug logging显示未从假定位置加载配置文件。
更正此位置(在 XmlConfigurator.Configure 方法调用中)并提供如上所示的配置的组合解决了问题。

关于c# - 我的 .Net 网站上的 Log4Net 调试时总是将 IsErrorEnabled 值显示为 FALSE,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53658910/

相关文章:

jquery - ASP.NET MVC5 Bootstrap 3 Modal Form 不验证客户端并回发到页面

C# - 如何打印出 View 数据?

c# - 无法等待 'void' 错误

c# - 是否可以向 App_Code 添加两种语言代码文件,即 C# 和 VB.NET?如果是这样,我怎么能做到这一点?

c# - 在哪里将业务模型转换为 View 模型?

asp.net-mvc - AngularJS + ASP.NET Web API + ASP.NET MVC身份验证

c# - 无法从网页下载源

c# - 无法使用模拟器上传文件, Controller 有问题

c# - Gridview 中使用索引进行编辑

asp.net - <br> 的间距问题