Web.ConfigおよびNLog.configファイルに多数の構成が保存されているWebプロジェクト(ASP.NET MVC 4プロジェクト)があります。
いくつかの公開プロファイルがありますPublishProfile1、PublishProfile2など。公開プロファイルを使用してWebプロジェクトをサーバーにデプロイするときに、両方の構成ファイルからいくつかの構成を変更したいデプロイ後(Web.configのいくつかのアプリ設定とNLog.configのいくつかの値)。
here の手順に従いましたが、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では問題なく機能する理由について誰かが手がかりを持っていますか?
この問題を解決するには、次のことを行う必要がありました。
1)nlog.configの使用を避けます
2)web.config内にnlogセクションを作成し、nlog.configの内容をweb.configに移動して、1つのファイルでweb.config変換機能を使用できるようにします。詳細な手順については、以下を参照してください。 NLog構成手順
3)nlogノードからxmlns属性を削除します。 web.configの変換中にすべてを台無しにするバグがあるようです。次のノードを安全に削除できます。
xmlns="http://www.nlog-project.org/schemas/NLog.xsd"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
4)nlog/targetsノードの下にある単一のターゲットのみを変換する方法が見つかりませんでした。ロガーの接続文字列を変更するには、次のように親ノードでxdt:Transform = "Replace"を使用して、xmlノード全体をコピーする必要がありました。
<nlog
throwExceptions="true"
internalLogLevel="Trace"
internalLogFile="..\..\..\Logs\nlog-app.log"
xdt:Transform="Replace">
<!--(copy and paste all nlog configuration here)-->
</nlog>
すべての構成をweb.configまたはapp.configに移動せずに管理しました。 (web/app.configのnlogに接続されているものはありません)。
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.configファイルには次のものが必要であることがわかりました。
<?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.configファイル(またはその名前)には、次のものが含まれています。
<?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);
}
変換構成で、ブログセクションのweb.configで定義されたxmlns:xsi名前空間を含めることでこれを機能させました。
<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(別名Webデプロイ)を使用するプロファイルの公開でのみ機能することに注意してください。ローカルフォルダに公開するには、このターゲットを使用しますCopyAllFilesToSingleFolderForPackage。
受け入れられた答えは私にはうまくいきませんでした。
内部ロギングをローカルで実行したかったのですが、本番環境では実行しませんでした。ルート構成ノードに名前空間を含める必要があることがわかりました。
私のために働いたもの:web.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.config.Release
<?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/
更新-設定ファイルと変換ファイルに「key」属性を追加し、変換ファイルで変更される行に「Transform」属性と「Locator」属性を追加すると、スタンドアロンのNLog.configファイルで次のように機能します。
<nlog xmlns="http://www.nlog-project.org/schemas/NLog.xsd"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
autoReload="true"
throwExceptions="false">
<targets async="true">
<target name="MyLogFile"
xsi:type="File"
keepFileOpen="false"
fileName="C:/File/Logs/Example.${shortdate}.log"
archiveFileName="C:/File/Logs/Example.${shortdate}.{#}.log"
archiveEvery="Day"
archiveNumbering="Rolling"
maxArchiveFiles="30"
layout="${Date:universalTime=false:format=o}, ${logger}, ${Level}, ${Message:jsonEncode=true} ${onexception:${newline}'Exception\: ${Exception:format=tostring:jsonEncode=true}', 'StackTrace\:${stacktrace:topFrames=12:jsonEncode=true}'}">
</target>
</targets>
<rules>
<logger key="logRule" name="*" minlevel="Trace" writeTo="MyLogFile" />
</rules>
</nlog>
変換ファイル:
<?xml version="1.0" encoding="utf-8"?>
<nlog xmlns:xdt="http://schemas.Microsoft.com/XML-Document-Transform"
xmlns="http://www.nlog-project.org/schemas/NLog.xsd"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
autoReload="true"
throwExceptions="false">
<rules>
<logger key="logRule" name="*" minlevel="Info" writeTo="MyLogFile" xdt:Transform="Replace" xdt:Locator="Match(key)" />
</rules>
</nlog>
SlowCheetahNuGetパッケージでビルド時間web.config
変換と、組み込みの展開時間変換の両方を使用しています。 NLog.config
ファイルの場合、ビルド環境ごとにNLog.*.config
ファイルがあります。以前は、これらの各ファイルには完全なNLog.config
コンテンツがあり、展開中にNLog.config
を特定のNLog.*.config
で上書きし、その後すべてのNLog.*.config
を削除するタスクがありました。
web.config
がweb.template.config
とweb.template.*.config
から生成される方法と同様に(ProjectName.wpp.targets
ファイルの助けを借りて)、代わりにこれらのファイルを変換可能にすることを本日決定しましたが、置き換えはしませんビルド時のNLog.config
(ローカルホストでサーバーのログファイルパスを実行したくない)。
これが私がそれをどのように機能させるかです-ProjectName.wpp.targets
ファイルでOnAfterCopyAllFilesToSingleFolderForPackage
"event"を使用してNLog.config
ファイルを一時的な中間ディレクトリ(後で公開に使用されます)に変換しました。これは完全なProjectName.wpp.targets
ファイルです。
<?xml version="1.0" encoding="utf-8"?>
<Project ToolsVersion="4.0" xmlns="http://schemas.Microsoft.com/developer/msbuild/2003">
<!-- Make sure Web.config will be there even for package/publish -->
<Target Name="CopyWebTemplateConfig" BeforeTargets="PrepareForBuild">
<Copy SourceFiles="Web.template.config"
DestinationFiles="Web.config"/>
</Target>
<PropertyGroup>
<PrepareForRunDependsOn>
$(PrepareForRunDependsOn);
UpdateWebConfigBeforeRun;
</PrepareForRunDependsOn>
</PropertyGroup>
<PropertyGroup>
<OnAfterCopyAllFilesToSingleFolderForPackage>
$(OnAfterCopyAllFilesToSingleFolderForPackage);
UpdateNLogConfigBeforePublish;
</OnAfterCopyAllFilesToSingleFolderForPackage>
</PropertyGroup>
<!-- This target will run right before you run your app in Visual Studio -->
<Target Name="UpdateWebConfigBeforeRun">
<Message Text="Configuration: $(Configuration): Web.template.$(Configuration).config"/>
<TransformXml Source="Web.template.config"
Transform="Web.template.$(Configuration).config"
Destination="Web.config" />
</Target>
<Target Name="UpdateNLogConfigBeforePublish">
<Message Text="Configuration: $(Configuration): NLog.$(Configuration).config"/>
<TransformXml Source="NLog.config"
Transform="NLog.$(Configuration).config"
Destination="$(IntermediateOutputPath)\Package\PackageTmp\NLog.config" />
</Target>
<!-- Exclude the config template files from the created package -->
<Target Name="ExcludeCustomConfigTransformFiles" BeforeTargets="ExcludeFilesFromPackage">
<ItemGroup>
<ExcludeFromPackageFiles Include="Web.template.config;Web.template.*.config"/>
<ExcludeFromPackageFiles Include="NLog.*.config"/>
</ItemGroup>
<Message Text="ExcludeFromPackageFiles: @(ExcludeFromPackageFiles)" Importance="high"/>
</Target>
</Project>
NLog.*.config
ファイルは、標準の変換を使用します。例:
<?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" xmlns:xdt="http://schemas.Microsoft.com/XML-Document-Transform"
internalLogFile="c:\temp\ProjectName.ENV.nlog.txt"
xdt:Transform="SetAttributes(internalLogFile)">
<variable name="envName" value="ENV"
xdt:Transform="SetAttributes" xdt:Locator="Match(name)" />
<targets>
<target name="exceptionsMail" to="[email protected]"
xdt:Transform="SetAttributes(to)" xdt:Locator="Match(name)" />
</targets>
<rules>
<logger name="Exceptions" minlevel="Error" writeTo="exceptionsMail"
xdt:Transform="Insert" />
</rules>
</nlog>
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