Log4Net 无法在任何地方找到日志文件

Log4Net can't locate logfile anywhere

我遵循了许多关于如何配置 log4net 的不同指南,它已启动 运行 但我无法在任何地方找到日志文件...

我的配置是这样的:

Web.Config

<section name="log4net" type="log4net.Config.Log4NetConfigurationSectionHandler, log4net" />
<log4net debug="true">
    <appender name="RollingLogFileAppender" type="log4net.Appender.RollingFileAppender">
        <file value="C:\temp\Log.txt" />
        <appendToFile value="true" />
        <rollingStyle value="Size" />
        <maxSizeRollBackups value="10" />
        <maximumFileSize value="10MB" />
        <staticLogFileName value="true" />
        <layout type="log4net.Layout.PatternLayout">
            <conversionPattern value="%-5p %d %5rms %-22.22c{1} %-18.18M - %m%n" />
        </layout>
    </appender>
    <root>
        <level value="DEBUG" />
        <appender-ref ref="RollingLogFileAppender" />
    </root>
</log4net>

Global.asax:

XmlConfigurator.Configure(new FileInfo(Server.MapPath("~/Web.config")));
//XmlConfigurator.Configure();

StartUp.cs

//[assembly: XmlConfigurator(ConfigFile = "Web.config", Watch = true)]
[assembly: XmlConfigurator(Watch = true)]

Declaration

readonly log4net.ILog logger = log4net.LogManager.GetLogger(System.Reflection.MethodBase.GetCurrentMethod().DeclaringType);

Logging

 BasicConfigurator.Configure();
 logger.Info("Info logging ...");
 logger.Error("Homepage loading test logging ...");

我的文件值是:<file value="C:\temp\Log.txt" />

试了好几条路,把上面的都注释掉了,都没有成功。

我做错了什么?

更新: 正如 John H 所建议的那样,我尝试在 Application_Start 方法中配置和调用记录器,并尝试了几种替代配置,但没有成功。以下是一些调试信息的 2 个屏幕截图:

主要属性:

以下是记录器属性:

我做错了什么?

从您的屏幕截图中,我们可以看到您的记录器未使用您的配置进行初始化,因为 IsDebugfalse。我从您的屏幕截图中注意到的一件事是,您正试图将 Web.config 的路径直接传递给 Configure() 方法。我意识到这可能是解决问题的尝试,因此您可能已经尝试了我的下一个建议,但是以您当前使用的方式调用 Configure() 将不起作用,因为 Web.config 未发布到您的bin\debug 文件夹。它将调用 Web.projectname.config。打电话

XmlConfigurator.Configure()

不带参数,将自动解析输出目录中的正确配置文件。我猜你已经试过了,但如果还是不行,也试试这个:

using log4net;

protected void Application_Start(object sender, EventArgs e)
{
    // Initialising configuration before requesting a logger.
    XmlConfigurator.Configure();

    // Requesting a logger only after the configuration has been initialised.
    var logger = LogManager.GetLogger(typeof(Global));
    logger.Info("Application started.");
}

我不确定这会有什么不同,但我觉得你的配置没问题。

但是通过检查记录器上的 IsDebug 属性,您至少能够判断配置是否已被读取。

编辑:另一件事,确保应用程序具有写入文件的权限。来自 documentation:

The RollingFileAppender extends the FileAppender and has the same behavior when opening the log file. The appender will first try to open the file for writing when ActivateOptions() is called. This will typically be during configuration. If the file cannot be opened for writing the appender will attempt to open the file again each time a message is logged to the appender. If the file cannot be opened for writing when a message is logged then the message will be discarded by this appender.

好的,我按照本教程开始工作:log4net-guide-dotnet-logging

  • 我创建了一个 log4net.config 文件,其内容如教程所示。
  • 用过[assembly: XmlConfigurator(ConfigFile = "log4net.config", Watch = true)]

这样称呼它:

ILog logger = LogManager.GetLogger(MethodBase.GetCurrentMethod().DeclaringType);
        logger.Info("Application started.");
  • 文件已创建,内容也已记录。 我将比较配置文件的内容,看看是否存在差异,然后逐渐比较所有内容,直到找到导致它不起作用的原因。

谢谢你帮助我! 亲切的问候