.Net Core3.1からNLogを使用します。
条件は以下の通りです。
・NLogの設定は設定ファイルから行います。NLog.configファイルのみです。
・NLogの設定ファイル読み込みは自動で行います。設定ファイル名を変更するなどの作業は行いません。
・使用するパッケージは NLog 、NLog.config のみです。
OSはWindows10を使いますが、他の環境でも大した違いはないと思います。
まず.Net Coreのバージョンを確認します。
>dotnet --version
3.1.100
コンソールアプリケーションを作成します。
任意のディレクトリ内でコンソールアプリケーションを作成します。今回は「nlog_console_01」ディレクトリとします。
>cd nlog_console_01
>dotnet new console
nlogをインストールします。
>dotnet add package nlog
この時点のProgram.csファイルは以下のようになっていました。
using System;
namespace nlog_console_01
{
class Program
{
static void Main(string[] args)
{
Console.WriteLine("Hello World!");
}
}
}
ログを出力するため、以下のように変更します。
これをこう変えます。
using System;
namespace nlog_console_01
{
class Program
{
static void Main(string[] args)
{
var logger = NLog.LogManager.GetCurrentClassLogger();
logger.Info("info");
}
}
}
実行してみます。
dotnet build
dotnet run
もちろんですが、VSCodeの出力にも、ファイルにもログは吐き出されません。
設定ファイルに設定を書き込むので、Nlog.Configパッケージを追加します。
dotnet add package NLog.Config
設定ファイルを追加します。
ファイル名: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>
ビルドして実行します。
dotnet build
dotnet run
この時点でtreeを実行して、ファイルの構造を確認してみます。ログファイルは出力されているでしょうか。
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 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を開きます。以下のようになっていました。
<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
以上を参考にして修正した所、以下のようになりました。
<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>
ビルドして実行します。
dotnet build
dotnet run
出力されたファイルを見てみましょう。
>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
設定ファイルは正常にコピーされており、ログも出力されました。
以上です。