2014-12-15 7 views
5

Ich habe ein rater "interessantes" Problem, wo log4net nicht die Protokollmeldungen schreibt, wenn sie aus einem Worker-Thread in ASP.NET MVC kommen. Dies scheint nur ein Problem zu sein, wenn ich meiner Log4net-Konfiguration <lockingModel type="log4net.Appender.FileAppender+MinimalLock" /> hinzugefügt habe und wenn die Website auf meinem Server (IIS 8.0) ausgeführt wird. Auf meinem eigenen Computer loggt log4net die Nachrichten gut - sogar mit der MinimalLock Konfiguration und wenn ich diese 'MinimalLock' entferne, werden auch Nachrichten in Worker Threads auf dem Server protokolliert. HierLog4net nicht Worker-Threads mit MinimalLock Modell

ein Beispiel:

public class MvcApplication : System.Web.HttpApplication 
{ 
    private static readonly log4net.ILog log = log4net.LogManager.GetLogger(
     System.Reflection.MethodBase.GetCurrentMethod().DeclaringType); 


    protected void Application_Start() 
    { 

     // This is logged just fine - with or without MinimalLock, 
     // both local and on server 
     log.Info("Logging ouside worker!"); 

     // This is only logged without MinimalLock configured 
     // if the site is hosted on my server runnning IIS 8.0. 
     var thread = new Thread(() => log.Info("Logging inside worker!")); 
     thread.Start(); 
    } 

} 

und hier ist meine log4net-Konfiguration:

<log4net> 
    <root> 
    <level value="ALL" /> 
    <appender-ref ref="LogFileAppender" /> 
    </root> 
    <appender name="LogFileAppender" type="log4net.Appender.RollingFileAppender"> 
    <file value="App_Data\log.log" /> 
    <appendToFile value="true" /> 
    <rollingStyle value="Size" /> 
    <maxSizeRollBackups value="10" /> 
    <maximumFileSize value="10MB" /> 
    <staticLogFileName value="true" /> 
    <lockingModel type="log4net.Appender.FileAppender+MinimalLock" /> 
    <layout type="log4net.Layout.PatternLayout"> 
     <conversionPattern value="%date [%thread] %level %logger - %message%newline" /> 
    </layout> 
    </appender> 
</log4net> 

Ohne die MinimalLock lockingModel konfiguriert, ich bin nicht in der Lage die Protokolldatei auf dem Server zu lesen, so Entfernen ist nicht wirklich eine Option. Ich kann auch nicht verhindern, dass ich mich in Worker-Threads einloggen kann, da ich potentielle Fehler in den von Quartz.net erstellten Arbeitern protokollieren muss.

Ich vermute, es ist ein Problem der Berechtigungen auf dem Server, aber ich habe sehr eingeschränkten Zugriff auf den Server, da ich nicht der Administrator bin (ich habe im Grunde nur FTP-Zugang - sie werden mir nicht sogar externen Zugriff gewähren zur MSSQL-Datenbank).

Hier ist die Frage

Wenn mein Verdacht richtig ist, welche Änderungen sollte ich von meinem Server-Administrator anfordern, um das Problem zu beheben? Welche Berechtigungen sollten welchem ​​Benutzer gewährt werden, damit MinimalLock in meiner gehosteten Umgebung ordnungsgemäß funktioniert?

Wenn es kein Problem mit Berechtigungen ist, was könnte es stattdessen sein?

Jede Hilfe wird sehr geschätzt. Danke im Voraus.

Update:

das Debug-Protokoll für log4net Nach der Aktivierung, fand ich die folgenden Fehler, wenn ich laufen den Beispielcode oben (vollständigen Pfad weggelassen):

log4net:ERROR [RollingFileAppender] Unable to acquire lock on file App_Data\log.log. Access to the path 'App_Data\log.log' is denied. 
log4net:ERROR [RollingFileAppender] Unable to acquire lock on file App_Data\log.log. Access to the path 'App_Data\log.log' is denied. 
log4net:ERROR [RollingFileAppender] Unable to acquire lock on file App_Data\log.log. Access to the path 'App_Data\log.log' is denied. 
log4net: ConfigureAndWatchHandler: Changed [web.config] 
log4net: ConfigureAndWatchHandler: Changed [web.config] 
log4net: Hierarchy: Shutdown called on Hierarchy [log4net-default-repository] 
log4net:ERROR [RollingFileAppender] Unable to acquire lock on file App_Data\log.log. Access to the path 'App_Data\log.log' is denied. 
log4net:ERROR [RollingFileAppender] Could not close writer [log4net.Util.CountingQuietTextWriter] 
log4net.Appender.FileAppender+LockingStream+LockStateException: The file is not currently locked 
    at log4net.Appender.FileAppender.LockingStream.AssertLocked() 
    at log4net.Appender.FileAppender.LockingStream.Flush() 
    at System.IO.StreamWriter.Flush(Boolean flushStream, Boolean flushEncoder) 
    at System.IO.StreamWriter.Dispose(Boolean disposing) 
    at System.IO.StreamWriter.Close() 
    at log4net.Util.QuietTextWriter.Close() 
    at log4net.Appender.TextWriterAppender.CloseWriter() 

Diese nur auf die auftreten Server.

+1

Da Sie vermutlich genügend Serverzugriff haben, um die Konfiguration der Site lo4net zu ändern und eine Debugprotokolldatei erstellen (oder eine anfordern), können Sie [log4nets internen Debugmodus einrichten, um eine Datei auf dem Server zu protokollieren] (http : //logging.apache.org/log4net/release/faq.html#internalDebug) - dies könnte einen Hinweis auf das zugrunde liegende Problem geben. – stuartd

+0

Danke. Ich habe es gerade ausprobiert und ein paar Fehler im Log4net-Log gefunden. Ich bin mir nicht sicher, wie ich diese lösen soll. Ich habe meine Frage mit den Fehlermeldungen aktualisiert. –

Antwort

1

Ich habe es geschafft, das Problem zu lösen.

In meiner Hosting-Umgebung sind die Worker-Threads einer anderen Windows-Identität zugeordnet als ihre Eltern. Die von den Worker-Threads verwendete Identität hatte nur Leseberechtigung für meinen App_Data/Logs-Ordner. Da mein Zugriff auf den Server begrenzt ist, habe ich eine .cshtml-Datei erstellt, um programmatisch Schreib- und Änderungsberechtigungen für die Identität der Arbeitsthreads hinzuzufügen.