3
3

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 3 years have passed since last update.

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

Posted at

.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ファイルは以下のようになっていました。

Program.cs
using System;

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

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

Program.cs
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 を開いてみます。

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を開きます。以下のようになっていました。

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

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

<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

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

3
3
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
3
3

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?