2013-04-23 124 views
9

我正在使用Microsoft的Web部署远程代理服务,以便在Visual Studio中轻松地将代码发布到服务器。由于文件正在使用而导致Web部署失败

我正在部署的网站使用log4net将消息记录到日志文件,每次尝试部署新版本的代码时,我都会在Visual Studio中看到此错误,指出当前的log4net日志文件位于使用:

在远程 计算机上处​​理请求时发生错误。文件'Web.log'正在使用中。

该进程无法访问'C:\ inetpub \ wwwroot \ Logs \ Web.log',因为其他进程正在使用 。

我可以去到服务器,并在发布前做一个iisreset解决这个...但是,这是一种击败从Visual Studio :)

“容易”出版的一点是有一些方法我可以让发布任务自动发布iisreset,或者我可以通过其他方式解决这个问题?

+0

这是您的log4Net日志文件吗? – Tommy 2013-04-23 17:25:27

+0

@Tommy是的,对不起,我应该更清楚:) – Cocowalla 2013-04-23 18:37:36

+0

我想知道是否可以绑定到您的global.asax中的Application_End事件并调用log4Net的关闭选项。这应该释放文件上的锁定。我不必这样做,因此不会作为答案发布,但有几个SO问题和其他与关闭记录服务有关的其他各种原因。 – Tommy 2013-04-23 19:24:13

回答

9

我一直在四处寻找,发现一些小文件被锁定在其他一些论坛上。你试过在web.config文件中添加

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

要将<appender>元素?从Apache docs

打开文件一次为每个AcquireLock/RELEASELOCK周期,从而 保持的时间的最小量的锁。锁定方法 比FileAppender.ExclusiveLock慢得多,但 允许其他进程移动/删除日志文件,同时继续记录 。

至于性能方面的考虑,我想你会需要测试这是否会影响到你或不作为,我假定这真的取决于你是如何经常到写入日志文件的多少这将影响性能。我无法相信,获得/释放锁可能需要全部那么多时间。

6

有一个MSDEPLOY provider called recycleApp正是为此使用。您可以将其包含在您的部署清单中。

另一种选择是使用ignoreOnErrors标志,该标志将跳过正在使用的文件并继续部署。

+0

您能否提供有关recycleApp的一些信息以及如何实际包含此信息?我在Visual Studio中看不到任何选项,与ignoreOnErrors相同标志 – Cocowalla 2013-04-28 20:37:12

+0

您可以手动运行此命令作为预部署步骤或自动使用VS部署步骤 - 检查['AfterTargets =“CopyAllFilesToSingleFolderForPackage”'](http: //stackoverflow.com/a/12579589)。 VS中还没有选择让它回收应用程序 - 只有文件+ SQL发布选项。 – SliverNinja 2014-03-20 15:35:15

相关问题