Log4net 不将日志写入日志文件

Posted

技术标签:

【中文标题】Log4net 不将日志写入日志文件【英文标题】:Log4net does not write the log in the log file 【发布时间】:2011-04-06 19:29:06 【问题描述】:

我使用 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...");

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

【问题讨论】:

【参考方案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/

【讨论】:

以上是关于Log4net 不将日志写入日志文件的主要内容,如果未能解决你的问题,请参考以下文章

log4net 创建日志文件但不写入

使用了log4net,发布系统后,发现无法写日志了,怎么办

log4net无法输出日志

Log4net 在记录几秒钟后将日志路径更改为安装文件夹。这是为啥?

如何在 MYSQL 中运行查询而不将其写入二进制日志

Log4Net 正在创建文件但未写入文件