いつもどこかでデスマーチ♪

不定期に、私の日常を書き込みしていきます。

Entity Framework Core 3.1 で やっとでSQLがログに出力できた!

2021年02月05日 15時05分41秒 | .NET系
環境:
Visual Studio 2019
.netCore 3.1
Microsoft.EntityFrameworkCore 3.1.5 系
NLog 4.7.2
SQLite 3

この環境で EFCore の 実行SQLログが出なくて相当悩んだ…
結果、GitHub をいろいろな条件で検索しまくった結果下記の状態で出力できた。
てか、バージョン上がったらまた出せなくなるのかな…orz

行きついたサイトは3をターゲットにしていて、
builder.AddDebug() とか builder.AddConsole()
とか書いてあるけど、builderクラスの候補に、AddDebugも、AddConsoleも出てこないんだよなぁ…
なんでだろう…なくなったのかね…?

2021年02月05日追記
コメントにて教えて頂きました!
下記ライブラリが足りてなかったっぽいですね。助かりました!
NuGetで
Microsoft.Extensions.Logging.Debug
Microsoft.Extensions.Logging.Console




しかしソースが見にくい…
いい加減ブログサイト変えないとだめかね…?orz



MyContext.cs クラス(DbContext を継承したクラス) 必要な処理以外は消してます
using Microsoft.Extensions.Logging;

protected override void OnConfiguring(DbContextOptionsBuilder optionsBuilder)
{
    // DBログ出力
    var loggerFactory = LoggerFactory.Create(builder =>
    {
        builder.AddProvider(new LoggerProvider())
               // DBログとDBログレベルを制限してSQLのみにする(なぜInfoなのさ…)
               .AddFilter((category, level) => category == DbLoggerCategory.Database.Command.Name && 
                                               level == LogLevel.Information);
    });

    // DB接続先指定
    var connectionString = new SqliteConnectionStringBuilder { DataSource = ”./DataBase.db”}.ToString();
    optionsBuilder.UseSqlite(new SqliteConnection(connectionString))
                  .EnableSensitiveDataLogging()
                  .UseLoggerFactory(loggerFactory); // ここでログファクトリを指定
}




LoggerProvider.cs クラス (実際のログ出力クラスを取得するクラス) これだけです。ソースを省いていません
using Microsoft.Extensions.Logging;

class LoggerProvider : ILoggerProvider
{
    public ILogger CreateLogger(string className)
    {
        // 実際にログを出力するクラスを指定
        return new LoggerSQL();
    }
    public void Dispose() { 
    }
}




LoggerSQL クラス(実際にログを出力するクラス) これだけです。 ソースを省いていませんが各自カスタマイズしてください
using Microsoft.Extensions.Logging;
using System;

class LoggerSQL : ILogger
{
    /// <summary>
    /// NLogクラス
    /// </summary>
    private readonly NLog.Logger Logger = NLog.LogManager.GetCurrentClassLogger();
    public IDisposable BeginScope<TState>(TState state)
    {
        return null;
    }
    public bool IsEnabled(LogLevel logLevel)
    {
        bool result = false;

        if (Logger.IsDebugEnabled)
        {
            // SQLログはデバッグの時のみ出力したい
            result = true;
        }

        return result;
    }
    public void Log<TState>(LogLevel logLevel, EventId eventId, TState state, Exception exception, Func<TState, Exception, string> formatter)
    {
        // SQLはDebugとして出力する
        Logger.Debug(exception, formatter(state, exception));
    }
}




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="./logs/nlog-internal.log">
  <targets async="true">
      
      <target xsi:type="Debugger" name="LogConsole" layout="${longdate} [${uppercase:${level:padding=-5}}] ${message} ${exception:format=Message, Type, ToString:separator=\r\n}" />
  </targets>
  <rules>
      
      <logger name="*" minlevel="Debug" writeTo="LogConsole" />
  </rules>
</nlog>



検索用:EntityFrameworkCore Entity Framework Core .net Core 3.1 NLog SQL 実行SQL ログ 出力 出力方法 出来ない 出ない 出し方
コメント (2)    この記事についてブログを書く
  • Twitterでシェアする
  • Facebookでシェアする
  • はてなブックマークに追加する
  • LINEでシェアする
« Apache Tomcat がついにJava... | トップ | OMV5 は raspberry pi zero ... »

2 コメント

コメント日が  古い順  |   新しい順
Unknown (ra)
2020-12-22 23:35:49
NuGetで
Microsoft.Extensions.Logging.Debug
Microsoft.Extensions.Logging.Console
Unknown (管理人)
2021-02-05 15:03:16
ご指摘ありがとうございます!

なるほど、それが無かったんですね!
こんな苦労する事なかったのか…orz
ありがとうございます!

コメントを投稿

ブログ作成者から承認されるまでコメントは反映されません。

.NET系」カテゴリの最新記事