2014-12-15 12 views
5

Ho un problema "interessante" di valutazione, in cui log4net non scrive i messaggi di registro se provengono da un thread di lavoro in ASP.NET MVC. Questo sembra essere un problema solo quando ho aggiunto <lockingModel type="log4net.Appender.FileAppender+MinimalLock" /> alla mia configurazione log4net e quando il sito Web è in esecuzione sul mio server (IIS 8.0). Sul mio computer log4net registra i messaggi bene - anche con la configurazione MinimalLock e se rimuovo questo 'MinimalLock' registrerà anche i messaggi nei thread worker sul server.log4net non esegue l'accesso ai thread di lavoro con il modello MinimalLock

Ecco un esempio:

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(); 
    } 

} 

e qui è la mia configurazione log4net:

<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> 

Senza la MinimalLock lockingModel configurato, io sono in grado di leggere il file di log sul server, in modo da rimuoverlo non è davvero un'opzione. Inoltre, non riesco a evitare la registrazione all'interno dei thread di lavoro, in quanto è necessario registrare potenziali errori all'interno degli utenti generati da Quartz.net.

Ho il sospetto che si tratti di autorizzazioni sul server, ma ho un accesso molto limitato al server, perché non sono l'amministratore (in pratica ho solo accesso FTP - non mi concedono nemmeno l'accesso esterno al MSSQL DB).

ecco la domanda

Se il mio sospetto è corretto, quali cambiamenti devo chiedere dal mio amministratore del server al fine di risolvere il problema? Quali autorizzazioni dovrebbero essere concesse a quale utente, in modo che MinimalLock funzioni correttamente nel mio ambiente ospitato?

Se non si tratta di un problema con le autorizzazioni, cosa potrebbe essere invece?

Qualsiasi aiuto è molto apprezzato. Grazie in anticipo.

Aggiornamento:

Dopo aver abilitato il registro di debug per log4net, ho trovato i seguenti errori quando si esegue il codice di esempio di cui sopra (percorso completo omesso):

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() 

Questi avvenire solo sulla server.

+1

Come presumibilmente hai abbastanza accesso al server per modificare il sito lo4net config e puoi creare un file di registro di debug (o richiederne uno), quindi puoi [configurare la modalità di debug interno di log4net per accedere a un file sul server] (http : //logging.apache.org/log4net/release/faq.html#internalDebug) - questo potrebbe dare qualche indicazione sul problema sottostante. – stuartd

+0

Grazie. Ho appena provato e trovato alcuni errori nel log log4net. Non sono sicuro di come risolverli. Ho aggiornato la mia domanda con i messaggi di errore. –

risposta

1

Sono riuscito a risolvere il problema.

Nel mio ambiente di hosting, i thread di lavoro sono associati a un'identità Windows diversa da quella principale. L'identità utilizzata dai thread worker ha avuto solo il permesso di lettura sulla mia cartella App_Data/Logs. Poiché il mio accesso al server è limitato, ho creato un file .cshtml per aggiungere programmaticamente autorizzazioni di scrittura e modifica all'identità dei thread di lavoro.

Problemi correlati