TadaoYamaokaの開発日記

個人開発しているスマホアプリや将棋AIの開発ネタを中心に書いていきます。

.NET Coreでログ出力する方法

C# ログ出力」で検索するとlog4netの情報が見つかるが、.NET Coreのアプリの場合、設定ファイルのlog4net.configを読み込むことができなかった。
NLogを使うと、あっさり解決できたのでメモを残しておく。

内容はほぼチュートリアル通り。

NLogをパッケージに追加

> dotnet add package NLog

ログ出力コード例

using System;

namespace NLogTest
{
    class Program
    {
        private static readonly NLog.Logger Logger = NLog.LogManager.GetCurrentClassLogger();

        static void Main(string[] args)
        {
            Logger.Info("Hello world");
        }
    }
}

設定ファイル例

[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>

NLog.configは、プロジェクトのルートに配置しても読み込まれない。
dotnet build(もしくはdotnet run)で作成される「bin/Debug/netcoreapp2.0」に配置する必要がある。
dotnet build -c Release(もしくはdotnet run -c Release)の場合は、「bin/Release/netcoreapp2.0」

プロジェクトの設定ファイル(.csproj)に以下のように記述することで自動でコピーされる。

<Project Sdk="Microsoft.NET.Sdk">
...
  <ItemGroup>
    <Content Include="NLog.config">
      <CopyToOutputDirectory>Always</CopyToOutputDirectory>
    </Content>  
  </ItemGroup>

</Project>

設定ファイルの代わりにプログラム中に設定を記述することもできる。

        static Program() {
            var config = new NLog.Config.LoggingConfiguration();

            // Targets where to log to: File and Console
            var logfile = new NLog.Targets.FileTarget("logfile") { FileName = "file.txt" };
            var logconsole = new NLog.Targets.ConsoleTarget("logconsole");
                        
            // Rules for mapping loggers to targets            
            config.AddRule(NLog.LogLevel.Info, NLog.LogLevel.Fatal, logconsole);
            config.AddRule(NLog.LogLevel.Debug, NLog.LogLevel.Fatal, logfile);
                        
            // Apply config           
            NLog.LogManager.Configuration = config;
        }

実行結果

以下のようにログが出力される。

2019-08-20 22:40:38.1268|INFO|NLogTest.Program|Hello world

出力先がファイルで、相対パスで指定している場合は、.dllの場所(「bin/Debug/netcoreapp2.0」もしくは「bin/Release/netcoreapp2.0」)からの相対パスになる。


なお、NLogには、Microsoft Extensions Logging (MEL)という.NET Core標準の仕組みを使う方法もあるようだが、処理の記述が増えるため特に必要がなければ上記の方法の方が簡単にログ出力できる。
Getting started with .NET Core 2 Console application · NLog/NLog Wiki · GitHub