redwarrior’s diary

C#, ASP.NET, WEB, G*などの雑多な情報

NLogを使用して、開発環境と本番環境でログの出力先を切り替える設定について

問題

Webアプリケーション開発でNLogを使ってログ出力をしていて、本番環境に乗せることになった時に、開発環境と同じパスにログを出力できない事ってありますよね。

例えば、開発時はソリューション内のフォルダに出力していたけど、本番ではWebから参照できない場所に出力したりとか、他のソフトやシステムの連携のためにログの出力先が決められていたりとかです。開発環境、テスト環境、本番環境でログ出力先が異なるというケースもありそうです。
そういった場合にどうすれば良いのか?調べました。

調査

とりあえず、以下の公式ドキュメントを見てみたり、検索エンジンで調べてみましたが、NLog.configにはそういった設定はなさそうでした。(調べたのは少し前なので最新の情報では変わっているかもしれません)

github.com

対処方法

NLog.config→Web.configへの設定の移動

では、どうするか。今回使用した方法は、NLog.configを使わないという方法です。実は、NLog.configの設定は、Web.configに書くことが出来ます。

まず、先頭で、nlogセクションを使用する事を宣言します。

<?xml version="1.0" encoding="utf-8"?>
<!--
  For more information on how to configure your ASP.NET application, please visit
  https://go.microsoft.com/fwlink/?LinkId=301880
  -->
<configuration>
  <configSections>
    <!-- For more information on Entity Framework configuration, visit http://go.microsoft.com/fwlink/?LinkID=237468 -->
    <section name="entityFramework" type="System.Data.Entity.Internal.ConfigFile.EntityFrameworkSection, EntityFramework, Version=6.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" requirePermission="false" />
    <!-- ↓この行を追加 -->
    <section name="nlog" type="NLog.Config.ConfigSectionHandler, NLog" />
  </configSections>

次に、ファイルの最後にnlogセクションを追加します。(追加する場所はどこでも良いと思いますが、わかりやすいので最後にしました)

    <providers>
      <provider invariantName="System.Data.SqlClient" type="System.Data.Entity.SqlServer.SqlProviderServices, EntityFramework.SqlServer" />
    </providers>
  </entityFramework>
  <!-- 以下の一連の行を追加 -->
  <nlog xmlns="http://www.nlog-project.org/schemas/NLog.xsd"
        xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
    <targets>
      <target xsi:type="File" name="f" fileName="${basedir}/logs/current.log"
              layout="${longdate} ${uppercase:${level}} ${message}"
              archiveEvery="Day"
              archiveFileName="${basedir}/logs/archive_{#}.log"
              archiveNumbering="Date"
              archiveDateFormat="yyyyMMdd"
              maxArchiveFiles="3"/>
    </targets>
    <rules>
      <logger name="*" minlevel="Trace" writeTo="f" />
    </rules>
  </nlog>
</configuration>

ちなみに上記の設定は、以下の過去記事からコピーした内容です。

redwarrior.hateblo.jp

そして、設定が重複してしまうのでNLog.configを削除します。

この状態でアプリケーションを起動して、ログが出力されていることを確認します。

Web.config変換を使用した切り替え

いよいよ、開発環境と本番環境で切り替える設定ですが、Web.configに設定が書けるという事は、Web.config変換を使用することが出来るということです。
以下のサイトを参考にして、発行先ごとのWeb.config作成することで、発行時にNLogによるログの出力先を切り替えることが出来ます。

kkamegawa.hatenablog.jp

最後に、発行先ごとのWeb.config(Web.発行先プロファイル名.config)の内容をのせておきます。

<?xml version="1.0" encoding="utf-8"?>
<configuration xmlns:xdt="http://schemas.microsoft.com/XML-Document-Transform">
  <nlog xmlns="http://www.nlog-project.org/schemas/NLog.xsd"
        xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
        autoReload="true">
    <targets>
      <target name="f" fileName="D:/WepApplicationLogs/current.log"
              archiveFileName="D:/WepApplicationLogs/archive_{#}.log"
              xdt:Transform="SetAttributes" xdt:Locator="Match(name)"/>
    </targets>
  </nlog>
</configuration>

ログ出力パスとアーカイブ用のパスを変更しています。それ以外の設定は元のWeb.configの内容をそのまま引き継ぎます。(Web.config変換の機能)
発行先が複数ある場合でも、各ファイルの設定を変えることで対応できるのでなかなか便利です。
以上です。