Log4net不写入日志文件


159

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

我做错什么了?

Answers:


316

你打电话吗

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,该如何调用?是否以任何方式需要此“配置”方法调用,因为在许多教程中我没有找到这行代码。
john84'9

9
有很多方法可以告诉log4net在哪里寻找配置,请参阅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 2012年

1
我正在AssemblyInfo文件中进行配置。在下面作为答案发布。
LCJ

Argh,发现了很多这样的问题,到处都没有提到在哪里可以找到实际的日志文件……每个人都知道如此明显吗?
MrFox 2014年

50

使用此常见问题页面: 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'9

1
多亏了这个答案,我才能够确定我的root部分是指错误的记录器!
seebiscuit 2014年

大提示。我发现对asp.net用户的访问被拒绝
Blue Clouds

如果对某人无效,请尝试使用此方法:<log4net> <internal> <Debug value =“ true”> </ Debug> </ internal> </ log4net>
himanshupareek66

35

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

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

9
如果我同时拥有log4net.Config.XmlConfigurator.Configure()会发生什么?负载?
n00b

1
@ n00b,那么我们可以注释此行,实际上仅以这种方式对我起作用“ log4net.Config.XmlConfigurator.Configure();”,还有另一件事:我也在web.config设置中添加了这行=“ log4net.Internal.Debug” value =“ true” />
himanshupareek66 '19

33

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

在此处输入图片说明


1
这是我的解决办法。我总是忘记此设置。
Ju66ernaut

25

确保网站运行所在的进程(帐户)具有写入输出目录的特权。

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

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


感谢您的帮助,我也想到了权限问题,但是如果我在文件夹上设置了对所有人读取,写入,修改和执行权限的权限,它将不起作用。
john84'9

@ john84-您有例外吗?您是否查看了事件日志?
Oded

正如我刚刚发现的,在特定帐户下运行Windows服务也很重要。
鲍勃·麦克

非常感谢,这对我有很大帮助。
阿巴斯

20

插:

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

AssemblyInfo.cs文件的末尾


这是我的营救。做一个桌面Forms项目并放入log4net.Config.XmlConfigurator.Configure(); 主要是没有帮助。谢谢
Tomas Hesse

这帮助了我。我在web.config中进行了配置,但log4net似乎无法接收所做的更改。我向该属性添加了“ Watch = true”,并且开始运行
可能是

3

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

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

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


2

就我而言,由于项目名称中有空格,log4net无法正确记录。让我发疯了,为什么相同的代码在另一个项目中可以正常工作,而在新的项目中却没有,为什么。空格。一个简单的空间。

因此,请注意项目名称中的空格。我学到了教训。


1
您在哪里遇到这个问题?Log4Net在一个项目中运行良好,但在另一个项目中却无法运行...不知道为什么。Tks
Pascal,

1

以我为例,我必须对IIS_IUSRS日志文件授予“ 读取\写入”权限。


1

确保以下行代码应位于AssemblyInfo.cs文件中。

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

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

log4net.Config.XmlConfigurator.Configure();

0

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

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

注册过程完成后,您可以调用以下定义来调用记录器:

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

log.Error("Sample log");

0

对我来说,我不得不将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/


尽量避免使用链接作为答案。他们可能并不总是工作。也许编辑您的答案以在链接中包含信息摘要。
Derek C.

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.