.Net Core 3.1 Console Application からNLogを使用する

.Net Core3.1からNLogを使用します。
条件は以下の通りです。
・NLogの設定は設定ファイルから行います。NLog.configファイルのみです。
・NLogの設定ファイル読み込みは自動で行います。設定ファイル名を変更するなどの作業は行いません。
・使用するパッケージは NLog 、NLog.config のみです。

OSはWindows10を使いますが、他の環境でも大した違いはないと思います。

まず.Net Coreのバージョンを確認します。

```Console
>dotnet --version
3.1.100
```
コンソールアプリケーションを作成します。
任意のディレクトリ内でコンソールアプリケーションを作成します。今回は「nlog_console_01」ディレクトリとします。

```Console
>cd nlog_console_01
>dotnet new console
```

nlogをインストールします。

```
>dotnet add package nlog
```

この時点のProgram.csファイルは以下のようになっていました。

```C#:Program.cs
using System;

namespace nlog_console_01
{
    class Program
    {
        static void Main(string[] args)
        {
            Console.WriteLine("Hello World!");
        }
    }
}
```

ログを出力するため、以下のように変更します。
これをこう変えます。

```C#:Program.cs
using System;

namespace nlog_console_01
{
    class Program
    {
        static void Main(string[] args)
        {
            var logger = NLog.LogManager.GetCurrentClassLogger();
            logger.Info("info");
        }
    }
}
```

実行してみます。

```Console
dotnet build
dotnet run
```

もちろんですが、VSCodeの出力にも、ファイルにもログは吐き出されません。

設定ファイルに設定を書き込むので、Nlog.Configパッケージを追加します。

```Console
dotnet add package NLog.Config
```

設定ファイルを追加します。
ファイル名：NLog.config
パス：プロジェクト直下
中身：

```XML
<?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">

    <targets>
        <target name="logfile" xsi:type="File" fileName="file.txt" />
        <target name="logconsole" xsi:type="Console" />
    </targets>

    <rules>
        <logger name="*" minlevel="Info" writeTo="logconsole" />
        <logger name="*" minlevel="Debug" writeTo="logfile" />
    </rules>
</nlog>
```

ビルドして実行します。

```Console
dotnet build
dotnet run
```

この時点でtreeを実行して、ファイルの構造を確認してみます。ログファイルは出力されているでしょうか。

```Console
nlog_console_01>tree /F
フォルダー パスの一覧:  ボリューム OS
ボリューム シリアル番号は XXXX-XXXX です
C:.
│  NLog.config
│  nlog_console_01.csproj
│  Program.cs
│
├─bin
│  └─Debug
│      └─netcoreapp3.1
│              NLog.config
│              NLog.dll
│              nlog_console_01.deps.json
│              nlog_console_01.dll
│              nlog_console_01.exe
│              nlog_console_01.pdb
│              nlog_console_01.runtimeconfig.dev.json
│              nlog_console_01.runtimeconfig.json
│
└─obj
    │  nlog_console_01.csproj.nuget.cache
    │  nlog_console_01.csproj.nuget.dgspec.json
    │  nlog_console_01.csproj.nuget.g.props
    │  nlog_console_01.csproj.nuget.g.targets
    │  project.assets.json
    │
    └─Debug
        └─netcoreapp3.1
                nlog_console_01.AssemblyInfo.cs
                nlog_console_01.AssemblyInfoInputs.cache
                nlog_console_01.assets.cache
                nlog_console_01.csproj.CopyComplete
                nlog_console_01.csproj.FileListAbsolute.txt
                nlog_console_01.csprojAssemblyReference.cache
                nlog_console_01.dll
                nlog_console_01.exe
                nlog_console_01.pdb
```

ログは出力されていません。Debugディレクトリ内にNLog.configのファイルがある事から、もしかしたら設定ファイルはちゃんと読み込まれているのかもしれません。
\bin\Debug\netcoreapp3.1\NLog.config を開いてみます。

```XML: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"
      autoReload="true"
      throwExceptions="false"
      internalLogLevel="Off" internalLogFile="c:\temp\nlog-internal.log">

  <!-- optional, add some variables
  https://github.com/nlog/NLog/wiki/Configuration-file#variables
  -->
  <variable name="myvar" value="myvalue"/>

  <!--
  See https://github.com/nlog/nlog/wiki/Configuration-file
  for information on customizing logging rules and outputs.
   -->
  <targets>

    <!--
    add your targets here
    See https://github.com/nlog/NLog/wiki/Targets for possible targets.
    See https://github.com/nlog/NLog/wiki/Layout-Renderers for the possible layout renderers.
    -->

    <!--
    Write events to a file with the date in the filename.
    <target xsi:type="File" name="f" fileName="${basedir}/logs/${shortdate}.log"
            layout="${longdate} ${uppercase:${level}} ${message}" />
    -->
  </targets>

  <rules>
    <!-- add your logging rules here -->

    <!--
    Write all events with minimal level of Debug (So Debug, Info, Warn, Error and Fatal, but not Trace)  to "f"
    <logger name="*" minlevel="Debug" writeTo="f" />
    -->
  </rules>
</nlog>
```

中身が全然違います。設定ファイルがコピーされていないため、自動で生成されたようです。

恐らくプロジェクトファイルに記載が必要なのでしょう。
ビルドの設定ファイルを修正し、NLog.configがコピーされるように修正します。
csprojを開きます。以下のようになっていました。

```XML:nlog_soncole_01.csproj
<Project Sdk="Microsoft.NET.Sdk">

  <PropertyGroup>
    <OutputType>Exe</OutputType>
    <TargetFramework>netcoreapp3.1</TargetFramework>
  </PropertyGroup>

  <ItemGroup>
    <PackageReference Include="nlog" Version="4.6.8" />
    <PackageReference Include="NLog.Config" Version="4.6.8" />
  </ItemGroup>
</Project>
```

この内容はteratailで質問しました。
https://teratail.com/questions/229298
ItemGroupには必要な全てのリソースを含まなくてはいけないようです。
https://docs.microsoft.com/ja-jp/dotnet/core/tools/csproj 
stackoverflowでは以下の質問が近いものでした。
https://stackoverflow.com/questions/44374074/copy-files-to-output-directory-using-csproj-dotnetcore
Noneタグ、属性については以下を参考にしました。
https://docs.microsoft.com/en-us/visualstudio/msbuild/common-msbuild-project-items?view=vs-2019
https://docs.microsoft.com/ja-jp/visualstudio/msbuild/item-element-msbuild?view=vs-2019 

以上を参考にして修正した所、以下のようになりました。

```XML:
<Project Sdk="Microsoft.NET.Sdk">

  <PropertyGroup>
    <OutputType>Exe</OutputType>
    <TargetFramework>netcoreapp3.1</TargetFramework>
  </PropertyGroup>

  <ItemGroup>
    <PackageReference Include="nlog" Version="4.6.8" />
    <PackageReference Include="NLog.Config" Version="4.6.8" />
    <None Update="NLog.config" CopyToOutputDirectory="Always" />
  </ItemGroup>
  
</Project>
```


ビルドして実行します。

```Console
dotnet build
dotnet run
```
出力されたファイルを見てみましょう。

```Console
>dir /B bin\Debug\netcoreapp3.1\
file.txt
NLog.config
NLog.dll
nlog_console_01.deps.json
nlog_console_01.dll
nlog_console_01.exe
nlog_console_01.pdb
nlog_console_01.runtimeconfig.dev.json
nlog_console_01.runtimeconfig.json

>more bin\Debug\netcoreapp3.1\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">

    <targets>
        <target name="logfile" xsi:type="File" fileName="file.txt" />
        <target name="logconsole" xsi:type="Console" />
    </targets>

    <rules>
        <logger name="*" minlevel="Info" writeTo="logconsole" />
        <logger name="*" minlevel="Debug" writeTo="logfile" />
    </rules>
</nlog>

>more bin\Debug\netcoreapp3.1\file.txt
2019-12-13 17:18:16.7859|INFO|nlog_console_01.Program|info
```

設定ファイルは正常にコピーされており、ログも出力されました。
以上です。