2014-03-18 50 views
3

我有一个控制台应用程序,并有一个包装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!!"); 
     } 
    } 
} 

应用.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

+0

我将使log4net的内部调试,试图了解发生了什么,如下所述:http://logging.apache.org/log4net/release/faq.html – Joe

回答

1

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

enter image description here

+1

你尝试在释放模式?这是一个很好的代码,你应该能够运行这个很快而没有任何大惊小怪。我在发布之前尝试过。它没有工作。我再次尝试,它不工作。 – SnowWhite

+0

这里是我的AssemblyInfo.cs [程序集:log4net.Config.XmlConfigurator(Watch = true)] [assembly:AssemblyTitle(“Logging”)] [assembly:AssemblyDescription(“”)] – SnowWhite

+0

我有类似的代码,只有我使用'私人静态只读log4net.ILog日志= log4net.LogManager.GetLogger(System.Reflection.MethodBase.GetCurrentMethod()。DeclaringType);'而不是创建一个'Logger'类等 – christiandev

4

这有几个解决方法。

  • 你可以在你的类库中的[MethodImpl(MethodImplOptions.NoInlining)] 属性添加到您的记录仪的构造方法。

  • 你可以在你的控制台项目(不类库项目)

  • 添加[assembly: log4net.Config.XmlConfigurator(Watch = true)]到AssemblyInfo.cs中您可以在 开始你的记录仪的构造函数的加log4net.Config.XmlConfigurator.Configure();

我认为发生这种情况的原因是,在发行模式下,你的类库内联,所以当log4net的尝试找到属性,它认为调用程序集是你的exe文件不包含属性。

PS。

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

+0

我发布这个问题之前,我尝试了最后2个选项。我尝试了第一个选项,不幸的是它不工作。 – SnowWhite

+0

最奇怪的。我尝试了所有三个选项,他们都工作。 (没有它们在发布模式下没有发生记录)。你确定配置文件在你的发布文件夹中并且是正确的吗? – sgmoore

+1

非常感谢sgmoore !!!我总是检查调试文件夹,而不是在发布文件夹。我的错!!!是的,它会以发布模式登录。我不必做任何事情。我上面列出的代码本身是可行的,所以不需要额外的步骤来使其工作。你需要做的唯一事情就是检查版本文件夹。 – SnowWhite

1

对于那些已经在AssemblyInfo.cs中的线[assembly: log4net.Config.XmlConfigurator(ConfigFile = "log4net.config", Watch = true)]和Global.asax.cs中log4net.Config.XmlConfigurator.Configure();的MVC应用程序的用户,但它仍然不写,请确保该应用程序池用户有写入权限的位置在那里你正在写日志。

为了解决这个问题,我只是在IIS服务器上创建了一个不在inetpub内部的日志目录,给它足够的权限(我想它可以是“Everyone”,“完全控制”,如果它只是一个子日志目录而你感觉懒惰),并在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> 
0

我在Logging.dll和我的Program.exe assembly.cs有这个。然后它可以在调试和发布模式下工作。我的程序是一个Windows服务。

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