Search code examples
asp.net-mvcweb-deploymentwebdeploylog4net-appender

Web deployment failing due to file in use


I'm using Microsoft's Web Deploy Remote Agent service to allow me to easily publish code to the server from within Visual Studio.

The web site I am deploying is using log4net to log messages to log files, and every time I try to deploy a new version of the code, I get this error in Visual Studio stating that the current log4net log file is in use:

An error occurred when the request was processed on the remote computer. The file 'Web.log' is in use.

The process cannot access 'C:\inetpub\wwwroot\Logs\Web.log' because it is being used by another process.

I can solve this by going onto the server and doing an iisreset before publishing... but that is kind of defeating the point of 'easy' publishing from Visual Studio :)

Is there some way I can get the publish task to issue an iisreset automatically, or some other way I can work round this?


Solution

  • I kept poking around and found some tidbits around the file being locked in a few other forums. Have you tried adding

    <lockingModel type="log4net.Appender.FileAppender+MinimalLock" />
    

    To your <appender> element in the web.config file? From the Apache docs

    Opens the file once for each AcquireLock/ReleaseLock cycle, thus holding the lock for the minimal amount of time. This method of locking is considerably slower than FileAppender.ExclusiveLock but allows other processes to move/delete the log file whilst logging continues.

    As far as the performance considerations, I suppose you would need to test if this will affect you or not as I am assuming it really depends on how often you are writing to the log file as to how much this will impact performance. I can't believe that getting/releasing a lock could take all that much time though.