Log4net无法将日志写入日志文件。

168

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

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

13个回答

335

你会调用吗?

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();
}

4
非常感谢,以下是需要翻译的内容:谢谢,就这样了。我有以下代码行:log4net.Config.BasicConfigurator.Configure();如果我使用 C# 配置而不是 web.config 来配置 log4net,我是否需要调用这个方法?在许多教程中,我没有找到这行代码,那么这个 "Configure" 方法调用是否必需的呢? - john84
9
有许多方法可以告诉log4net去哪里查找配置文件,详见http://logging.apache.org/log4net/release/manual/configuration.html。调用XmlConfigurator.Configure()会使log4net在<app.exe>.config或web.config中查找配置。BasicConfigurator.Configure会根据SDK文档:“使用将写入Console.Out的ConsoleAppender初始化log4net日志记录系统。” - Andreas Paulsson
请注意 - 如果您不想使用基于文件的配置方式,您也可以使用log4net.Config.BasicConfigurator。输出将发送到控制台。 - silverArc
2
我正在 AssemblyInfo 文件中进行配置。 - LCJ
啊,发现这样的问题很多,但是到处都没有提到在哪里找到实际的日志文件... 难道这么明显,每个人都已经知道了吗? - MrFox
不,这一点都不明显。缺乏直观的使用是Log4Net最大的缺陷。 - Rhyous

56

使用这个FAQ页面:Apache log4net常见问题解答

在页面的3/4位置,它告诉您如何通过使用应用程序跟踪来启用log4net调试。这将告诉您问题所在。

基础知识如下:

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

你可以在标准输出中看到跟踪信息


1
谢谢,我已经查看了常见问题解答,但这些不能解决我的问题。 - john84
2
感谢这个答案,我能够确定我的“root”部分引用了错误的记录器! - seebiscuit
很好的提示。我发现ASP.NET用户被拒绝访问。 - Blue Clouds
如果这个不起作用,请尝试使用我的方法: <log4net> <internal> <Debug value="true"> </Debug> </internal> </log4net> - himanshupareek66
这让我省了 x 小时的头疼。 - Master Azazel
我以为我要疯了,这真的救了我。 (在我的情况下,我有一个转换器,在重构中改变了命名空间,我没有意识到这一点,所以lo4net找不到它) - lluchmk

41

此外,确保对[log4net].config选择了"始终复制"选项。

在此输入图片描述


2
这对我来说是解决办法。我总是忘记这个设置。 - Ju66ernaut

40

如 @AndreasPaulsson 所建议,我们需要进行配置。我正在 AssemblyInfo 文件中进行配置,在这里指定了 配置文件名称

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

9
如果我在加载时同时使用了这两个东西:this 和 log4net.Config.XmlConfigurator.Configure(); 会发生什么? - n00b
1
@n00b,我们可以注释掉这一行,实际上只有这种方式对我有效“log4net.Config.XmlConfigurator.Configure();”,还有一件事:我也在我的web.config设置中添加了以下内容 <add key="log4net.Internal.Debug" value="true"/> - himanshupareek66

26

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

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

检查事件日志(应用程序和安全)是否出现任何异常。


谢谢您的帮助,我也考虑了权限问题,但是即使我将文件夹的读取、写入、修改和执行权限设置为所有人,它仍然无法正常工作。 - john84
@john84 - 你有收到异常吗?你看过事件日志了吗? - Oded
同样重要的是,正如我刚刚发现的那样,当在特定帐户下运行Windows服务时。 - Bob Mc
非常感谢,这对我帮助很大。 - Abbas

22

插入:

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

AssemblyInfo.cs 文件的末尾


这是我的救命稻草。在桌面Forms项目中将log4net.Config.XmlConfigurator.Configure();放在main函数中并没有起到帮助作用。谢谢。 - Tomas Hesse
这对我很有帮助。我在web.config中进行了配置,但log4net似乎没有捕捉到所做的更改。我将“Watch=true”添加到该属性中,然后一切都开始正常工作了。 - albe

4
在我的情况下,我需要将IIS_IUSRS赋予日志文件读写权限。

3

我的做法是将日志文件位置移动,只有在我将文件名改为其他名称时才重新开始记录。

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

之后,我将旧文件重命名,并再次将配置中的日志文件名改回原来的名称。


2

在我的情况下,log4net由于项目名称中有一个空格而无法正确记录日志。让我疯狂的是,同样的代码在另一个项目中运行得非常好,但在新项目中却不行。只因为有一个简单的空格。

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


1
你在哪里遇到了这个问题?Log4Net在一个项目中运行得很好,但在另一个项目中却不行……不知道为什么。谢谢。 - Pascal

1

1
尽量避免将链接作为答案。它们可能并不总是有效的。也许可以编辑您的答案,包括链接中信息的摘要。 - Derek C.

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接