我对log4net有一个奇怪的问题。
在ASP.NET应用程序中,我想在外部配置log4net,所以我有一个单独的log4net.config文件,我在属于我的web应用程序的AssemblyInfo.cs文件中使用此行连接到我的Web应用程序:< / p>
[assembly: log4net.Config.XmlConfigurator(ConfigFile = "Log4Net.config", Watch = true)]
现在,如果我以这样的正常方式实例化log4net记录器类:
public class MyClass
{
private static readonly ILog _logger = log4net.LogManager.GetLogger(typeof(MyClass));
....
然后这个工作,并且日志记录正常工作。但是,我将日志代码包装在LogManager类中,该类是单独程序集(Infrastructure)的一部分,并在多个项目中重用。它有一个GetLogger,如下所示:
public static class LogManager
{
public static ILog GetLogger()
{
var stack = new StackTrace();
var frame = stack.GetFrame(1);
return new log4net.LogManager.GetLogger(frame.GetMethod().DeclaringType);
}
}
所以我可以在我的asp.net代码中使用它:
public class MyClass
{
private static readonly ILog _logger = LogManager.GetLogger();
....
但是......这不起作用!没有生成日志记录它似乎没有正确地连接配置文件。如果我将我的log4net配置直接放入web.config,那么这个LogManager工作正常。
答案 0 :(得分:3)
总结Bibhu所说的话。它与log4net.Config.XmlConfigurator
有关。
在开始记录之前配置log4net。因此,无论何时使用LogManager类,托管应用程序(windows,web)都必须配置日志记录。
或者您需要在LogManager中执行此操作。
答案 1 :(得分:2)
告诉应用程序使用外部配置文件配置log4net。这有两个地方。首先是global.asax,第二个是assemblyInfo.cs文件。请注意,大多数情况下,您将使用包含所有内联代码的global.asax文件开始。无论出于何种原因,我可以使用它的唯一方法是将global.asax分解为使用代码隐藏然后使用assemblyInfo.cs文件。所以最终看起来像这样。
global.asax:
<%@ Application Language="C#" Inherits="GlobalAsax" %>
global.asax.cs (in your App_Code folder):
using System;
using System.Web;
public class GlobalAsax : HttpApplication
{
// you may have lots of other code here
void Application_Start(object sender, EventArgs e)
{
log4net.Config.XmlConfigurator.Configure();
}
}
现在您的应用程序正在调用log4net的配置,您可以在程序集信息中设置一个属性,以便log4net知道在哪里查找配置文件。
AssemblyInfo.cs (in your App_Code folder):
[assembly: log4net.Config.XmlConfigurator(ConfigFile = "log4net.config", Watch = true)]
watch标志告诉log4net密切关注配置文件是否存在潜在的变化。如果您希望仅在测试过程中将配置从记录外部更改为错误,这将非常有用。
然后,开始记录。