c# - 我的 .Net 网站中的 Log4Net 调试时始终将 IsErrorEnabled 值显示为 FALSE
问题描述
我一直在尝试使用 Log4Net AdoNetAppender 将我的 .Net 网站中的错误记录到 SQL 数据库中,但是错误消息没有记录到数据库中。看起来 AdoNetAppender 没有被启用或读取。在调试时,我观察到 Logger.Log 将其所有属性值显示为 false。即 IsErrorEnabled / IsDebugEnabled / IsFatalEnabled / IsInfoEnabled / IsWarnEnabled 全部为假。
我使用的 log4net.dll 版本是 2.0.8.0
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
配置文件并显式加载。
将文件中的
<log4net> ... </log4net>
内容移动到网站项目根目录中app.config
的单独文件(按照约定命名)。Log4net.config
该<log4net>
元素必须是该文件中的根 xml 元素。[assembly: log4net.Config.XmlConfigurator(Watch = true)]
从您的Logger
项目中删除。将以下代码添加到
Application_Start
网站Global.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 的内部调试日志显示配置文件没有从假定的位置加载。
更正此位置(在
XmlConfigurator.Configure
方法调用中)和提供如上所示配置的组合解决了该问题。
推荐阅读
- sql - 在 mongodb 上进行 sql 查询以根据单列的 id 值获取多列的计数
- tensorflow - CNN - 在 1 张图片中显示的两个类别之间进行选择
- excel - 在代码问题中使用 Union 将工作表与源工作表分开
- python - 如何将元组值添加到值也是 nd.array 的字典的每个键中?
- java - 当它从java中的内部“for”循环“中断”时它会“更新”吗?
- for-loop - for-range 结构与 Go 中的闭包有何关系?
- html - 在 Bootstrap 4.1 container-fluid > row > col 中间垂直对齐 div
- python - 将多个文件合并为若干个文件
- angular - 在 Angular Nrwl Nx 中创建组件作为库
- javascript - 使用 jQuery 发送 AJAX 请求时,如何省略数据对象中的参数?