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

时间:2014-03-18 20:34:50

标签: c# .net 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

<?xml version="1.0" encoding="utf-8" ?>
<configuration>
  <configSections>
    <section name="log4net" type="log4net.Config.Log4NetConfigurationSectionHandler, log4net"/>
  </configSections>
    <startup> 
        <supportedRuntime version="v4.0" sku=".NETFramework,Version=v4.5" />
    </startup>
    <log4net>
      <appender name="RollingFileAppender" type="log4net.Appender.RollingFileAppender">
        <file type="log4net.Util.PatternString" value ="%property{LogFileName}"/> 
        <layout type="log4net.Layout.PatternLayout">
          <conversionPattern value="%date [%thread] %level  - %message%newline%exception" />
        </layout>
      </appender>
      <root>
        <level value="ALL" />
        <appender-ref ref="RollingFileAppender" />
      </root>
    </log4net>
</configuration>

班级图书馆

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在发布模式下不会在日志文件中写入?

log4net doesn't log when running a .Net 4.0 Windows application built in Release mode

5 个答案:

答案 0 :(得分:5)

有一些解决方法。

  • 您可以添加[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方法名称。

答案 1 :(得分:1)

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

enter image description here

答案 2 :(得分:1)

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

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

这是我的配置文件:

<?xml version="1.0"?>
<configuration>
  <configSections>
    <section name="log4net" type="log4net.Config.Log4NetConfigurationSectionHandler, log4net"/>
  </configSections>
  <log4net>
    <root>
      <level value="ALL"/>
      <appender-ref ref="RollingFileAppender"/>
    </root>
    <appender name="RollingFileAppender" type="log4net.Appender.RollingFileAppender">
      <file value="C:/absolute/path/to/logfile.log" />
      <appendToFile value="true" />
      <rollingStyle value="Size" />
      <maximumFileSize value="10MB"/>
      <datePattern value="yyyyMMdd'-FULL.log'" />
      <maxSizeRollBackups value="-1"/>
      <staticLogFileName value="false"/>
      <layout type="log4net.Layout.PatternLayout">
        <conversionPattern value="%date [%thread] %-5level %logger [%property{NDC}] - %message%newline" />
      </layout>
    </appender>
  </log4net>
</configuration>

答案 3 :(得分:0)

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

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

答案 4 :(得分:0)

确保将log4net.config文件添加到最终发行版二进制文件中,并且与ConfigFile = "log4Net.config"中提到的路径相对应。

我遇到了同样的问题,然后我意识到我只是在我的发行二进制文件中丢失了此配置文件。