9

我正在使用 Microsoft 的 Web Deploy Remote Agent 服务,让我可以轻松地从 Visual Studio 中将代码发布到服务器。

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

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

该进程无法访问“C:\inetpub\wwwroot\Logs\Web.log”,因为它正被另一个进程使用。

我可以通过进入服务器并iisreset在发布之前执行此操作来解决这个问题......但这有点违背了从 Visual Studio 发布“轻松”的观点:)

有什么方法可以让发布任务自动发出 iisreset,或者我可以通过其他方式解决这个问题吗?

4

2 回答 2

9

我一直在四处寻找,发现文件被锁定在其他几个论坛中的一些花絮。您是否尝试过添加

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

<appender>web.config 文件中的元素?来自Apache 文档

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

至于性能方面的考虑,我想您需要测试这是否会影响您,因为我假设这实际上取决于您写入日志文件的频率以及这会对性能产生多大影响。我无法相信获取/释放锁可能需要这么多时间

于 2013-04-24T13:45:45.353 回答
6

有一个名为的 MSDEPLOY 提供程序recycleApp正是用于此目的。您可以将其包含在部署清单中。

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

于 2013-04-28T16:28:47.693 回答