Log4Net不会在发布模式下写入日志 – 控制台应用程序

我有一个控制台应用程序,并有一个包装Log4Net方法的类库。 现在,当在调试模式下运行应用程序时,它会写入日志,但是当它在发布模式下构建时,它不会写入日志文件。 对此有什么解决方案? 示例代码和配置文件如下所示

我的开发环境是

  • Visual Studio 2013和.NET Framework 4.5

控制台应用

namespace ConsoleApplication1 { class Program { static void Main(string[] args) { log4net.GlobalContext.Properties["LogFileName"] = "TestLogin.txt"; Logger log = new Logger(typeof(Program)); log.Info("Logging is enabled!!"); } } } 

控制台应用程序中的App.config

    

class级图书馆

 using log4net; using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; [assembly: log4net.Config.XmlConfigurator(Watch = true)] namespace Logging { public class Logger { private readonly ILog log = null; public Logger(Type type) { log = LogManager.GetLogger(type); } public void Info(object message) { log.Info(message); } } } 

我已经关注了这篇文章并且它没有帮助我弄清楚为什么Log4Net在发布模式下不会在日志文件中写入?

运行在发布模式下构建的.Net 4.0 Windows应用程序时,log4net不会记录

有一些解决方法。

  • 您可以将[MethodImpl(MethodImplOptions.NoInlining)]属性添加到类库中的Logger构造函数方法中。

  • 您可以将[assembly: log4net.Config.XmlConfigurator(Watch = true)]到Console Project中的AssemblyInfo.cs(而不是类库项目)

  • 您可以添加log4net.Config.XmlConfigurator.Configure(); 在Logger构造函数的开头。

我认为发生这种情况的原因是在发布模式下,您的类库是内联的,因此当log4net尝试查找属性时,它认为调用程序集是您的exe,它不包含该属性。

PS。

我假设你知道你的Logger类意味着你失去了按方法名称过滤的能力,因为log4net只会看到Logger.Info方法名称。

应将[assembly: log4net.Config.XmlConfigurator(Watch = true)]行添加到Properties文件夹中的AssemblyInfo.cs文件中。

在此处输入图像描述

对于具有MVC应用程序的用户,该应用程序已在AssemblyInfo.cs和log4net.Config.XmlConfigurator.Configure();包含[assembly: log4net.Config.XmlConfigurator(ConfigFile = "log4net.config", Watch = true)] log4net.Config.XmlConfigurator.Configure(); 在Global.asax.cs中,但它仍然没有编写,请确保应用程序池用户有权写入您正在编写日志的位置。

为了解决这个问题,我只是在IIS服务器上创建了一个inetpub里面的日志目录,给了它足够的权限(我想它可以是“Everyone”,“完全控制”,如果它只是一个子日志目录而你感觉很懒),并在log4net.config(或Web.config,如果你没有隔离它)中写入完整路径。

这是我的配置文件:

    

我在我的Logging.dll和我的Program.exe assembly.cs中有这个。 然后它在调试和释放模式下都有效。 我的程序是一个Windows服务。

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

确保在最终版本二进制文件中添加了log4net.config文件,该文件对应于ConfigFile = "log4Net.config"提到的路径。

我有同样的问题,然后我意识到我只是错过了我的发布二进制文件中的配置文件。