Преобразование Config в NLog не работает

У меня есть веб-проект (ASP.NET проект MVC 4), который имеет ряд конфигураций, хранящихся в Web.Config и NLog.config файлы.

У меня есть несколько профилей публикации PublishProfile1, PublishProfile2 etc. При использовании профиля публикации для развертывания моего веб-проекта на сервере я хочу изменить несколько конфигураций из обоих файлов конфигурации после развертывания (некоторые настройки приложения в Web.config и некоторые значения в NLog.config).

я следовал шагам из здесь и он отлично работает для изменения настроек в Web.Config (например, преобразования из Web.PublishProfile1.Config уважают).

Это мой NLog.PublishProfile1.Config трансформация файл:

 <nlog xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xdt="http://schemas.microsoft.com/XML-Document-Transform" xmlns="http://www.nlog-project.org/schemas/NLog.xsd">
   <nlog  xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
     <targets >
       <target xsi:type="File"
               name="tracelog"
               fileName="NEW_VALUE_HERE" layout="${longdate} [${threadname}::${threadid}] ${pad:padding=5:inner=${level:uppercase=true}} ${logger} - ${message}"
               xdt:Transform="Replace"  xdt:Locator="Match(name)" />
     </targets>
   </nlog>
  </nlog>

проблема в том, что у меня такие же преобразования в NLog.PublishProfile1.config но эти преобразования также не применяются после развертывания.

кто-нибудь имеет понятия о том, почему это преобразование не работает для NLog.config, но работает нормально для Web.config в профиле публикации?

7 ответов


чтобы решить эту проблему, мне пришлось:

1) Избегайте использования nlog.config

2) создайте раздел nlog внутри web.настройте и переместите содержимое nlog.config to web.config, чтобы иметь возможность использовать интернет.функция преобразования config с одним файлом. Для получения дальнейших инструкций, пожалуйста, посмотрите на:инструкции по настройке NLog

3) Удалите атрибуты xmlns из узла nlog. Кажется, есть ошибка, которая портит все во время интернета.конфиг преобразование. Вы можете безопасно удалить следующие узлы:

xmlns="http://www.nlog-project.org/schemas/NLog.xsd"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"

4) я не мог найти способ преобразовать только одну цель под узлом nlog/targets. Чтобы изменить строку подключения моего регистратора, мне пришлось скопировать весь узел xml, используя xdt: Transform= "Replace" на родительском узле следующим образом:

<nlog
      throwExceptions="true"
      internalLogLevel="Trace"
      internalLogFile="..\..\..\Logs\nlog-app.log" 
      xdt:Transform="Replace">
<!--(copy and paste all nlog configuration here)-->
</nlog>

Я справился с этим, не перемещая всю конфигурацию в web.config или app.конфиг. (Нет ничего, связанного с nlog в web/app.config вообще).

1) Используя эту статью:применение преобразований конфигурации msbuild к любому файлу конфигурации Я создал все преобразования, которые необходимы, и добавил задачу преобразования.

2) Затем я проверил, есть ли какие-либо другие задачи, которые делают подобные вещи. В моем случае был один, который был создан по SlowCheetah (VS расширение для автоматического добавления преобразований). Я удалил его - и все стало хорошо. (SlowCheetah может восстановить свои настройки при следующей сборке, поэтому лучше удалить его или подавить его задачу преобразования)

3) Мои файлы преобразования выглядят так:

<?xml version="1.0"?>
<!-- For more information on using app.config transformation visit http://go.microsoft.com/fwlink/?LinkId=125889 -->
<nlog xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xdt="http://schemas.microsoft.com/XML-Document-Transform" xmlns="http://www.nlog-project.org/schemas/NLog.xsd">
  <targets>
    <target xsi:type="Database" name="DbLogging"
          connectionString=".\SQLEXPRESS;Initial Catalog=xxxxx;User ID=xxxx;Pwd=xxxx;" xdt:Transform="SetAttributes(connectionString)" xdt:Locator="Match(name)">
    </target>
  </targets>
  <rules>
    <logger name="*" minlevel="Debug" writeTo="DbLogging" />
    <logger name="Namespace.*" minlevel="Debug" writeTo="DbLogging" xdt:Transform="SetAttributes(writeTo)" xdt:Locator="Match(name)" />
  </rules>
</nlog>

похоже, что я довольно поздно об этом, но я обнаружил, что это необходимо для NLog.файл конфигурации должен иметь следующее:

<?xml version="1.0" encoding="utf-8"?>
<nlog xmlns="http://www.nlog-project.org/schemas/NLog.xsd"
      xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
      xsi:schemaLocation="http://www.nlog-project.org/schemas/NLog.xsd NLog.xsd">
...
...
</nlog>

и NLogTransform.конфигурационный файл (или какое бы имя он ни имел) должен иметь следующее:

<?xml version="1.0"?>
<nlog xmlns="http://www.nlog-project.org/schemas/NLog.xsd"
      xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
      xmlns:xdt="http://schemas.microsoft.com/XML-Document-Transform">
...
...
</nlog>

вот пример кода для проверки преобразования NLog:

var tmpConfigFile = new FileInfo("C:\NLogs\NLog.config");
var transformFile = new FileInfo("C:\Transforms\NLogTransform.config");

if (transformFile.Exists) {
    var xmlTransformableDocument = new XmlTransformableDocument();
    xmlTransformableDocument.Load(tmpConfigFile.FullName);
    var xmlTransformation = new XmlTransformation(transformFile.FullName);
    xmlTransformation.Apply(xmlTransformableDocument);
    xmlTransformableDocument.Save(tmpConfigFile.FullName);
}

Я получил эту работу, в конфигурации преобразования, включая пространство имен xmlns:xsi, определенное в web.config для раздела nlog.

<nlog xmlns:xsi="...">
    <variable name="..." value="..." xdt:Transform="Replace" xdt:Locator="Match(name)" />
</nlog>

Я закончил тем, что изменил все мои профили публикации (.pubxml файлов). В качестве примера я добавил в свой профиль публикации тестирования следующее:

<Target Name="NLogTransform" AfterTargets="PipelineCopyAllFilesToOneFolderForMsdeploy">
<Message Text="NLog file transform according to NLog.WebDeploy - TEST.config" Importance="high" />
<TransformXml Source="NLog.config"
              Transform="NLog.WebDeploy - TEST.config"
              Destination="$(_PackageTempDir)\NLog.config" />
</Target>

обратите внимание, хотя это работает только для публикации профилей, которые используют MsDeploy (aka web deploy). Для публикации в локальной папке используйте эту цель CopyAllFilesToSingleFolderForPackage.


принятый ответ не работа для меня.

Я хотел иметь внутренний журнал локально, но не на производстве. Получается, вам нужно включить пространство имен в корневом узле конфигурации.

то, что работало для меня: сеть.config:

<configuration>
  <configSections>
    <section name="nlog" type="NLog.Config.ConfigSectionHandler, NLog" />
  </configSections>

  <nlog autoReload="true" internalLogLevel="Trace" internalLogFile="internalLog.txt" xmlns="http://www.nlog-project.org/schemas/NLog.xsd" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" >
  <!--nlog config stuff-->
  </nlog>
</configuration>

web.конфиг.Отпустите

<?xml version="1.0"?>
  <configuration xmlns:xdt="http://schemas.microsoft.com/XML-Document-Transform" xmlns:nlg="http://www.nlog-project.org/schemas/NLog.xsd">
   <nlg:nlog xdt:Transform="RemoveAttributes(internalLogLevel,internalLogFile)" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">>
   </nlg:nlog>
  </configuration>

нашел решение здесь: https://www.jayway.com/2011/11/14/web-config-transformations-and-xml-namespaces/


рабочий пример, когда nlog находится в web.config - максимальное использование переменных для минимизации необходимых преобразований

<?xml version="1.0" encoding="utf-8"?>
<configuration>
  <nlog xmlns="http://www.nlog-project.org/schemas/NLog.xsd" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
    <variable name="SystemName" value="MyApp" />
    <variable name="LogPath" value="c:\log${SystemName}" />
    <variable name="Layout" value="${longdate}|${level:upperCase=true}|t${threadid}|${logger}| ${message} ${exception:format=message,stacktrace}|${event-properties:item=ir-objects}" />

    <targets>
      <wrapper-target xsi:type="AsyncWrapper" name="file-info">
        <target xsi:type="File" createDirs="true" fileName="${LogPath}${SystemName}.web.info.log" archiveAboveSize="31457280" archiveNumbering="Sequence" maxArchiveFiles="5" archiveEvery="Day" layout="${Layout}" />
      </wrapper-target>

    </targets>

    <rules>
      <logger name="*" minlevel="Info" writeTo="file-info" />
    </rules>
  </nlog>
</configuration>

преобразовать файл:

<?xml version="1.0" encoding="utf-8"?>
<configuration xmlns:xdt="http://schemas.microsoft.com/XML-Document-Transform" xmlns:nlog="http://www.nlog-project.org/schemas/NLog.xsd">
  <nlog:nlog>
    <nlog:variable name="LogPath" value="D:\logs\uat${SystemName}"  xdt:Transform="SetAttributes" xdt:Locator="Match(name)"/>
  </nlog:nlog>
</configuration>

трюк состоит в том, чтобы пространство имен всех элементов nlog -nlog, variable