Преобразование 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