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

我在我的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中的相关配置是:

      

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

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

但是当然Logger.IsDebugEnabled没有任何setter:/

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

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

 log4net.Config.XmlConfigurator.Configure(); 

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

 [assembly: log4net.Config.XmlConfigurator(ConfigFile = "log4net.config", Watch = true)] 

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

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

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

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

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

应该

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

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

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

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

  

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

     

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

 LogManager.GetLogger("Log4NetTEST"); 

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

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

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

   

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

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

在app.Config中,设置应为:

      

您缺少applicationSettings的开始标记。 这可能是原因

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

这应该是这样的。

   

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

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

如果你在my.common中包装logmanager代码,那么“[assembly:log4net.Config.XmlConfigurator(C …”应该在my.common中,如果你把它放在my.web中,它将无效!

编辑:

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

另一个例子,如果你是unit testing一个应用程序,上下文是unit testing项目,那将是使用哪个配置文件,而不是应用程序的配置。

您应该无法在应用程序中初始化log4net。 这可以通过在’Application_Start’下面显式初始化,

log4net.Config.XmlConfigurator.Configure();