C# 在web应用程序中配置Log4Net

C# 在web应用程序中配置Log4Net,c#,log4net,C#,Log4net,我有以下代码和配置文件: ILog log = LogManager.GetLogger(typeof(MyClass)); log.Debug("Testing"); TestProj目录没有创建,如果我创建了它,没有TestLog.txt文件,没有日志。。。没什么 有什么想法吗 谢谢 配置文件 这通常是由于缺少权限造成的。运行本地IIS应用程序池的windows帐户可能没有写入应用程序目录的权限。您可以在某处创建一个目录,给每个人在其中写入的权限,并将您的log4net配置指向该目录。如果

我有以下代码和配置文件:

ILog log = LogManager.GetLogger(typeof(MyClass));
log.Debug("Testing");
TestProj
目录没有创建,如果我创建了它,没有
TestLog.txt
文件,没有日志。。。没什么

有什么想法吗

谢谢

配置文件


这通常是由于缺少权限造成的。运行本地IIS应用程序池的windows帐户可能没有写入应用程序目录的权限。您可以在某处创建一个目录,给每个人在其中写入的权限,并将您的log4net配置指向该目录。如果在那里创建了日志文件,则您可以修改所需日志目录的权限,以便应用程序池可以对其进行写入


另一个原因可能是未初始化的log4net。在winforms应用程序中,通常在应用程序启动时配置log4net。在web应用程序中,您可以动态执行此操作(在日志组件中,检查是否可以使用其名称创建特定的Ilog记录器,如果不可以->调用configure()),或者在global.asax.cs中启动应用程序时再次执行此操作。

您需要调用
XmlConfigurator

log4net.Config.XmlConfigurator.Configure();
在第一次登录呼叫之前或在Global.asax中进行呼叫,如下所示:

protected void Application_Start(Object sender, EventArgs e) {
   log4net.Config.XmlConfigurator.Configure();
}

1:将以下行添加到AssemblyInfo类中

[assembly: log4net.Config.XmlConfigurator(Watch = true)]
2:确保不要将
.Net Framework 4客户端配置文件
用作
目标框架
(我认为这对您来说是可以的,否则它甚至无法编译)

3:确保你很早就在程序中登录。否则,在某些情况下,它将无法正确初始化(请阅读详细信息)

因此,在应用程序启动期间在Global.asax中记录一些内容

public class Global : System.Web.HttpApplication
{
    private static readonly log4net.ILog Log = log4net.LogManager.GetLogger(typeof(Global));
    protected void Application_Start(object sender, EventArgs e)
    {
        Log.Info("Startup application.");
    }
}
4:确保您有权在给定路径上创建文件和文件夹(如果文件夹本身也不存在)


5:其余的给定信息看起来正常

另一种方法是将此行添加到web应用程序的程序集信息中:

// Configure log4net using the .config file
[assembly: log4net.Config.XmlConfigurator(Watch = true)]

与Shriek的类似。

我也有类似的问题。未创建日志

请检查记录器属性名称是否应与LogManager.GetLogger(“名称”)匹配


私有静态只读ILog Log=LogManager.GetLogger(“Mylog”);

web应用程序是否有创建目录和文件的权限?它在我的开发机器上>完全权限确定可以:)现在我必须配置文件,以便在日志中查看我想要的内容。如果您使用web项目,您可能必须执行新项并添加Global.asax文件,因为默认情况下它不存在。您还应该立即记录一些内容。log4net.Config.XmlConfigurator.Configure();log4net.ILog log=log4net.LogManager.GetLogger(System.Reflection.MethodBase.GetCurrentMethod().DeclaringType);调试(“应用程序启动中的设置”);这个解决方案是否意味着(我希望是这样)这个web应用程序的所有会话都有记录器?这对我来说似乎确实有效,但这是个坏主意吗?e、 g.Globals.cs包含公共静态ILog记录器{get;set;}=LogManager.GetLogger(“记录器”);它到处被引用为Globals.Logger?.Debug(LabelMsg.Text);或者通过某个类中的变量来缩短:private ILog Logger{get;set;}=Globals.Logger;这只适用于“普通”应用程序,但不适用于web应用程序。@尖叫:我不确定你是否正确。此属性用于配置XmlConfigurator,而无需调用任何配置方法。正确的说法是,
Watch=True
没有太大价值,因为web.config中的更改总是会导致web重新启动application@hwcverwe:昨天我遇到了同样的问题,属性在那里,但记录器没有做任何事情。只有在第一次调用记录器之前调用
Configure
方法后,它才起作用。(这是针对WCF服务的)@shriek:+1用于您的解决方案,因为您正在确保log4net在开始记录之前已调用Configure方法。在某些情况下,“程序集”属性无法正常工作。但我仍然有WCF服务,它们正在正确地记录日志,所以这不是一个事实,因为网站和WCF服务不能使用assembly属性。我在web应用程序中使用assembly属性,它可以工作。关键是从具有assembly属性的同一项目(例如,在Global.asax中)实例化记录器。请参阅@Default中的“何时应记录我的第一条消息”请参阅@Default中的“何时应记录我的第一条消息”
<logger name="Mylog">
      <level value="All"></level>
      <appender-ref ref="RollingLogFileAppender" />
    </logger>



private static readonly ILog Log = LogManager.GetLogger("Mylog");