为什么我的log4net级别都是假的?
本文关键字:我的 log4net 为什么 | 更新日期: 2023-09-27 18:19:07
我在ASP中使用log4net。. NET MVC3项目,但所有日志属性,如IsDebugEnabled
== false
在我的AssemblyInfo我有:
[assembly: XmlConfigurator(Watch = true)]
在我的日志类中有
public Log4NetLogger()
{
log4net.Config.XmlConfigurator.Configure();
Logger = LogManager.GetLogger(System.Reflection.MethodBase.GetCurrentMethod().DeclaringType);
}
我在Web中的相关配置内容。配置是:
<?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
没有任何设置:/
我要怎么做才能让这该死的东西工作?
我也遇到过同样的问题。我通过在Global.asax.cs(假设它是一个。net web应用程序)的Application_Start
方法中使用下面的代码行来绕过它
log4net.Config.XmlConfigurator.Configure();
在AssemblyInfo.cs
中更改以下行:
[assembly: log4net.Config.XmlConfigurator(ConfigFile = "log4net.config", Watch = true)]
您似乎错过了配置文件属性设置更改复制到输出目录 ="始终复制"请查看此设置图像以了解更多详细信息。配置文件设置属性
在应用程序中初始化log4net失败。这可以通过在下面的'Application_Start',
来显式初始化log4net.Config.XmlConfigurator.Configure();
或
[assembly: log4net.Config.XmlConfigurator(ConfigFile = "log4net.config")]
在AssemblyInfo.cs Log4net希望它的配置节不被分组。因为在配置中,您将log4net部分放在ApplicationSettingsGroup (applicationSettings)
中,所以log4net将找不到它的配置。您可以将log4net部分移出组,也可以在调用XmlConfigurator.Configure
:
XmlConfigurator.Configure(
ConfigurationManager.GetSection(
"applicationSettings/log4net") as XmlElement);
日志级别是区分大小写的,所以不用:
<level value="All" />
<level value="ALL" />
我还发现创建一个单独的log4net配置文件要容易得多。创建一个名为log4net的文件。将复制到输出目录的属性设置为始终复制——(将您的配置从App.config复制到此文件)
然后,在设置配置时使用:
XmlConfigurator.Configure(new System.IO.FileInfo("log4net.config"));
在AssemblyInfo.cs中更改以下行:
[组装:log4net.Config。XmlConfigurator(Watch = true)]
确保添加了log4net dll,并将log4net的配置放在web中。配置文件为
<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>
我以前从未见过<level value="All" />
,通常我只是将value
设置为其中一个级别(因为它们包括高于它们的级别,或者低于它们,因为你在配置中列出了它们,在级别堆栈中)。像这样:
<level value="DEBUG" />
您也可以尝试使用显式记录器对其进行测试,以查看问题是否可能是其他原因。与appender
节点相邻的简单内容如下:
<logger name="Log4NetTEST" >
<level value="DEBUG" />
<appender-ref ref="AdoNetAppender" />
</logger>
然后在代码中测试它时,您将创建这样的日志记录器:
LogManager.GetLogger("Log4NetTEST");
您可能需要添加旧的系统诊断程序来找出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。配置属性到复制总是,在另一个答案中解释。
没有IsDebugEnabled的setter,因为它是只读的。
使用log4net.Config.XmlConfigurator.Configure ();在使用log
之前的任何方法中和在app.Config中的设置应该是:
<root>
<level value="ALL" />
<appender-ref ref="AppenderName" />
</root>
您缺少applicationSettings
的开始标记。这可能就是原因
在我的情况下,这是由于<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>
如果类日志文件(Log4NetLogger)在单独的类库中,则代码:(组装:log4net.Config.XmlConfigurator (C…应该在同一个类库中。
例如:Lib 1:我的。Web (MVC项目)Lib 2: my.common(一个类库项目)
如果你在my.common中包装日志管理器代码,那么"[assembly: log4net.Config.XmlConfigurator(C…"应该在我的。common,如果你把它放在我的。Web,它不会工作!
编辑:所有配置文件(app.config, web. config)的使用情况。配置,log4net。配置等)是基于上下文的。因此,如果你有一个应用程序调用类库,将使用的配置文件是应用程序项目中的。config,而不是类库。
另一个例子,如果你正在对一个应用进行单元测试,那么上下文就是单元测试项目,它是将要使用的配置文件,而不是应用的配置文件。
我也遇到了同样的问题。我使用了一个单独的文件并将其命名为log.config。我所需要做的就是在Visual Studio的解决方案资源管理器中将文件属性"Copy to Output Directory"标记为"Copy Always"。