【问题标题】:Log4net does not write the log in the log fileLog4net 不将日志写入日志文件
【发布时间】:2023-03-31 23:55:01
【问题描述】:

我使用 Log4net 创建了一个简单的场景,但我的日志附加程序似乎不起作用,因为消息没有添加到日志文件中。

我在 web.config 文件中添加了以下内容:

<configSections>
    <section name="log4net" type="log4net.Config.Log4NetConfigurationSectionHandler, log4net" requirePermission="false"/>        
</configSections>

<log4net>
    <appender name="LogFileAppender" type="log4net.Appender.FileAppender">
            <file value="D:\MyData\Desktop\LogFile.txt" />
            <appendToFile value="true" />
            <encoding value="utf-8" />
            <layout type="log4net.Layout.SimpleLayout" />
    </appender>


    <root>
        <level value="INFO" />
        <appender-ref ref="LogFileAppender" />
    </root>
</log4net>

在我添加的全局 ASAX 文件中:

ILog logger = LogManager.GetLogger(typeof(MvcApplication));

在 Application_Start 方法中:

logger.Info("Starting the application...");

为什么没有将测试日志“正在启动应用程序...”添加到日志文件中?

【问题讨论】:

    标签: asp.net asp.net-mvc logging log4net log4net-appender


    【解决方案1】:

    确保运行站点的进程(帐户)具有写入输出目录的权限。

    在 IIS 7 及更高版本中,这是在应用程序池中配置的,通常是 AppPool Identity,通常没有写入所有目录的权限。

    检查您的事件日志(应用程序和安全性)以查看是否引发了任何异常。

    【讨论】:

    • 感谢您的帮助,我也考虑过权限问题,但如果我在文件夹上设置读取、写入、修改和执行权限给每个人,它都不起作用。
    • @john84 - 你有例外吗?你看过事件日志吗?
    • 我刚刚发现,Windows 服务在特定帐户下运行也很重要。
    • 非常感谢对我有很大帮助。
    【解决方案2】:

    使用此常见问题页面:Apache log4net Frequently Asked Questions

    大约 3/4 的部分告诉您如何使用应用程序跟踪来启用 log4net 调试。这将告诉您问题出在哪里。

    基础是:

    <?xml version="1.0" encoding="utf-8" ?>
    <configuration>
        <appSettings>
            <add key="log4net.Internal.Debug" value="true"/>
        </appSettings>
    </configuration>
    

    你会在标准输出中看到跟踪

    【讨论】:

    • 谢谢,我查看了常见问题解答,但这些无法解决我的问题。
    • 感谢这个答案,我能够确定我的 root 部分指的是错误的记录器!!
    • 很好的提示。我发现asp.net用户的访问被拒绝了
    • 如果它对某人不起作用,那么请尝试我的使用方法: log4net>
    • 这让我头痛了几个小时。
    【解决方案3】:

    你打电话吗

    log4net.Config.XmlConfigurator.Configure();
    

    让 log4net 读取你的配置的地方?例如。在 Global.asax 中:

    void Application_Start(object sender, EventArgs e) 
    {
        // Code that runs on application startup
    
        // Initialize log4net.
        log4net.Config.XmlConfigurator.Configure();
    }
    

    【讨论】:

    • 非常感谢,就是这样,我有以下行:log4net.Config.BasicConfigurator.Configure();如果我使用 c# 配置而不是 web.config 来配置 log4net,我会调用它吗?是否需要以任何方式调用此“配置”方法,因为在许多教程中我没有找到这行代码。
    • 有很多方法可以告诉 log4net 在哪里寻找配置,请参阅logging.apache.org/log4net/release/manual/configuration.html。调用 XmlConfigurator.Configure() 将使 log4net 在 .config 或 web.config 中查找配置。 BasicConfigurator.Configure 将(根据 SDK 文档):“使用将写入 Console.Out 的 ConsoleAppender 初始化 log4net 日志系统。”
    • 仅供参考 - 如果您不希望它基于文件,您也可以使用 log4net.Config.BasicConfigurator。输出被发送到控制台。
    • 我正在AssemblyInfo 文件中进行配置。在下面作为答案发布。
    • 哎呀,发现了很多这样的问题,而且到处都没有提到在哪里可以找到实际的日志文件……是不是很明显,每个人都已经知道了?
    【解决方案4】:

    正如@AndreasPaulsson 建议的那样,我们需要对其进行配置。我正在AssemblyInfo 文件中进行配置。我在这里指定configuration file name

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

    【讨论】:

    • 如果我同时拥有这个和 log4net.Config.XmlConfigurator.Configure() 会发生什么;加载中?
    • @n00b,然后我们可以评论这一行,实际上只有这样才能对我有用“log4net.Config.XmlConfigurator.Configure();”,还有一件事:我在我的web.config 设置太
    【解决方案5】:

    另外,确保为 [log4net].config 选择了 “始终复制” 选项

    【讨论】:

    • 这是对我的修复。我总是忘记这个设置。
    【解决方案6】:

    插入:

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

    AssemblyInfo.cs 文件的末尾

    【讨论】:

    • 这是我的救命稻草。做一个桌面表单项目并将 log4net.Config.XmlConfigurator.Configure();主要没有帮助。谢谢
    • 这对我有帮助。我在 web.config 中进行了配置,但 log4net 似乎没有接受所做的更改。我在该属性中添加了“Watch=true”,然后开始工作
    【解决方案7】:

    在我的例子中,log4net 没有正确记录,因为我的项目名称中有空格。让我发疯,为什么相同的代码在不同的项目中工作得很好,但在新项目中却没有。空间。一个简单的空间。

    因此,请注意项目名称中的空格。我已经吸取了教训。

    【讨论】:

    • 您在哪里遇到了这个问题? Log4Net 在一个项目中运行良好,但在另一个项目中却不行……不知道为什么。 Tks
    【解决方案8】:

    对我来说,我移动了日志文件的位置,只有当我将文件名更改为其他名称时,它才会重新开始。

    似乎如果已经存在同名的日志文件,则什么都不会发生。

    之后,我重命名了旧文件并将配置中的日志文件名改回原来的样子。

    【讨论】:

      【解决方案9】:

      在我的情况下,我必须授予 IIS_IUSRS 对日志文件的读\写权限。

      【讨论】:

        【解决方案10】:

        确保 AssemblyInfo.cs 文件中应包含以下行代码。

        [程序集:log4net.Config.XmlConfigurator(ConfigFile = "Web.config", Watch = true)]

        并在 Application_start() 方法中检查这一行。

        log4net.Config.XmlConfigurator.Configure();
        

        【讨论】:

          【解决方案11】:

          您的配置文件似乎正确。然后,您必须将 Log4net 配置文件注册到应用程序。所以你可以使用下面的代码:

          var logRepo = LogManager.GetRepository(Assembly.GetEntryAssembly());
          XmlConfigurator.Configure(logRepo, new FileInfo("log4net.config"));
          

          注册进程后,你可以调用下面的定义来调用logger:

          private static readonly ILog log = LogManager.GetLogger(MethodBase.GetCurrentMethod().DeclaringType);
          
          log.Error("Sample log");
          

          【讨论】:

            【解决方案12】:

            对我来说,我不得不将 Logger 移至 Nuget 包。以下代码需要在 NuGet 包工程中添加。

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

            更多详情请见https://gurunadhduvvuru.wordpress.com/2020/04/30/log4net-issues-when-moved-it-to-a-nuget-package/

            【讨论】:

            • 尽量避免链接作为答案。它们可能并不总是有效。也许编辑您的答案以在链接中包含信息摘要。
            【解决方案13】:

            有几种使用 log4net 的方法。 我在寻找解决方案时发现它很有用。解决方案在这里描述:https://www.hemelix.com/log4net/

            【讨论】:

              猜你喜欢
              • 2016-05-08
              • 2012-11-11
              • 1970-01-01
              • 1970-01-01
              • 2012-11-03
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              相关资源
              最近更新 更多