2016-12-14 90 views
2

我有兩個使用redis底板和使用log4net的SignalR服務器。當我啓動應用程序時,一切正常,日誌文件在兩臺服務器上都正確寫入。但有時,日誌文件不再寫和內部調試日誌說:爲什麼log4net隨機停止使用SignalR進行登錄?

log4net: Opening file for writing [C:\myLogPath\] append [True]

...每次一個新行必須以秒爲單位記錄(100次以上 - 這是預期的日誌率)沒有任何錯誤消息,無論之前或之後。兩臺服務器在同一時間發生問題 - 記錄的最後一行完全相同;這就是爲什麼我編寫SignalR服務器時使用了背板。這裏是我的log4net.config:

<log4net> 
    <appender name="LogFileAppender" type="log4net.Appender.RollingFileAppender" > 
     <param name="File" value="C:\myLogPath\SignalR\log.txt" /> 
     <lockingModel type="log4net.Appender.FileAppender+MinimalLock" /> 
     <appendToFile value="true" /> 
     <rollingStyle value="Date" /> 
     <maxSizeRollBackups value="-1" /> 
     <maximumFileSize value="100MB" /> 
     <datePattern value="ddMMyyyy" /> 
     <staticLogFileName value="true" /> 
     <layout type="log4net.Layout.PatternLayout"> 
      <conversionPattern value="%date - %-5level - %message%newline" /> 
     </layout> 
    </appender> 

    <root> 
     <level value="ALL" /> 
     <appender-ref ref="LogFileAppender" /> 
    </root> 
</log4net> 

我相信這些文件不會被捲起,作爲maxSizeRollBackups設置爲-1(相當於無窮大)和log.txt文件砝碼〜16MB,遠從maximumFileSize。我嘗試過和沒有MinimalLock,沒有任何影響。


這裏是Startup類,在那裏我開始log4net的:

public class Startup 
    { 
     public void Configuration(IAppBuilder app) 
     { 
      Common.Logger.Start(ConfigurationManager.AppSettings["pathLog4net"]); 
      Common.Logger.Info("Démarrage SignalR"); 

      //Connect to backplane, make some DI, singletons initialisations... 

      Common.Logger.Info("Mapping"); 
      app.Map("/signalr", map => 
      { 
       map.UseCors(CorsOptions.AllowAll); 
       var hubConfiguration = new HubConfiguration 
       { 
        EnableJSONP = true, 
        EnableDetailedErrors = HttpContext.Current.IsDebuggingEnabled 
       }; 
       map.RunSignalR(hubConfiguration); 
      }); 
     } 
    } 

...和Common.Logger類,封裝log4net的:

public static class Logger 
    { 
     private static log4net.ILog Log { get; set; } 

     static Logger() 
     { 
      Log = log4net.LogManager.GetLogger(typeof(Logger)); 
     } 

     public static void Start(string path) 
     { 
      log4net.Config.XmlConfigurator.Configure(new FileInfo(path)); 
     } 

     public static void Error(object msg) 
     { 
      Log.Error(msg); 
     } 

     public static void Info(object msg) 
     { 
      Log.Info(msg); 
     } 
    } 

Logger.Info方法是在一個名爲每個集線器的方法,所以我想知道它是否可能是一個併發問題,但log4net文檔聲明它是安全的 - 雖然我不知道它在哪個級別;並且問題發生在第二個SignalR完全在同一時間。每次我重新啓動應用程序時,日誌都會在未定義的時間內運行,然後再次停止。

我試着改變log4net配置,禁用內部日誌,但沒有任何工作。我不知道該怎麼辦......爲什麼日誌停止了?爲什麼log4net無法追加到文件中,即使內部日誌顯示Opening file [...] append [True]?如果有人有一些想法,我會永遠感激:)


編輯:顯然,權限設置正確 - 我是如此F * cked了我可恥地試圖Full controlEveryone ...

+0

@stuartd該參數已經存在。 – gobes

+0

抱歉抱歉..... – stuartd

回答

1

SOOOOO ...實際上這是一個簡單的問題。我的網站正在使用業務層,他們有自己的log4net實例,使用相同的配置文件...所以它只是一個鎖定錯誤。

我改變了信號記錄封裝以使用業務層的log4net,現在一切都很好。

相關知識:當出現鎖定錯誤時,log4net似乎只在第一次嘗試寫入該文件時才記錄它。