带有log4Net的.NET Web部署工具:不覆盖日志

时间:2011-05-19 15:46:44

标签: asp.net asp.net-mvc visual-studio-2010 log4net web-deployment

我正在使用Web部署工具从VS 2010构建和发布MVC站点到运行IIS的服务器。我还将log4net日志记录到我正在部署到的Web应用程序的根目录下的子目录中。我已经弄清楚如何在该目录上使用此工具进行部署时保持写权限不变,但现在我遇到的问题是,我不想在部署时丢失日志,而且部署失败因为日志log4net正在使用的文件“被另一个进程使用”(可能是w3wp)并且不会让部署继续进行。

因此,我想保留日志文件,而不是删除或覆盖它们,以便进行审计。有没有办法在Web部署工具的范围内做到这一点?

编辑:以下是Web.Config中log4net配置的适用位。

<?xml version="1.0" encoding="utf-8"?>
<configuration>
  <configSections>
    <section name="log4net" type="log4net.Config.Log4NetConfigurationSectionHandler,Log4net" />
  </configSections>
  <log4net>
    <appender name="RollingLog" type="log4net.Appender.RollingFileAppender">
      <param name="File" value="Logs\Log.txt" />
      <param name="AppendToFile" value="true" />
      <rollingStyle value="Composite" />
      <maxSizeRollBackups value="20" />
      <maximumFileSize value="10MB" />
      <datePattern value="yyyyMMdd" />
      <staticLogFileName value="true" />
      <layout type="log4net.Layout.PatternLayout">
        <conversionPattern value="{%level}%date{MM/dd HH:mm:ss} - %message%newline" />
      </layout>
    </appender>
    <root>
      <level value="DEBUG" />
      <appender-ref ref="RollingLog" />
    </root>
  </log4net>
</configuration>

2 个答案:

答案 0 :(得分:2)

通过搜索来找到它:当您调用预先打包的部署脚本时,可以使用“skip”参数来查看命令。你必须使用常规的旧CMD提示; Powershell疯狂逃避报价使得几乎不可能做到正确,所以我放弃了。无论如何,这是我想出的最终结果:

.\MyProject.deploy.cmd /Y /M:MyServerName "-skip:skipAction=Delete,objectName=filePath,absolutePath=Logs"

“MyProject.deploy.cmd”是预先打包的部署命令的名称,“MyServerName”是我部署到的服务器的名称,“Logs”是我想要跳过的文件夹的名称。这个命令似乎只留下了Logs目录并部署了其他重要的东西。

我开始磨练事物的来源:http://blogs.iis.net/msdeploy/archive/2009/04/23/what-has-changed-about-skip-replace-rules-in-rc.aspx

答案 1 :(得分:0)

将appender的锁定模型设置为最小锁定,一切都会正常:

<appender name="RollingLog" type="log4net.Appender.RollingFileAppender">
  ...
  <lockingModel type="log4net.Appender.FileAppender+MinimalLock" />
  ...
</appender>

log4net.Appender.FileAppender(见备注)