2014-03-18 52 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)] 
相關問題