.NET Web Deployment Tool с log4Net: не перезаписывать журналы - PullRequest
1 голос
/ 19 мая 2011

Я использую инструмент веб-развертывания для создания и выпуска сайта MVC из VS 2010 на сервер с IIS. У меня также есть log4net, регистрирующийся в подкаталоге корневого каталога веб-приложения, на которое я развертываю. Я уже выяснил, как сохранить права на запись без изменений при развертывании с помощью этого инструмента в этом каталоге, но теперь я столкнулся с проблемой, заключающейся в том, что я не буду терять журналы при развертывании, а также при развертывании происходит сбой, поскольку журнал файл, используемый log4net, «используется другим процессом» (предположительно w3wp) и не позволяет продолжить развертывание.

Итак, я хотел бы сохранить файлы журналов, а не удалять или перезаписывать их для целей аудита. Есть ли способ сделать это в рамках инструмента веб-развертывания?

РЕДАКТИРОВАТЬ : Вот соответствующие биты конфигурации log4net, в Web.Config.

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

2 голосов
/ 19 мая 2011

Обнаружил это путем поиска: есть параметр «пропустить», который можно привязать к команде при вызове предварительно упакованного сценария развертывания. Вы должны использовать для этого обычную старую подсказку 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

0 голосов
/ 19 мая 2011

Установите модель блокировки вашего приложения на минимальную блокировку, и все будет хорошо:

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

log4net.Appender.FileAppender (см. Примечания)

...