Entity Framework Core 3.1 で やっとでSQLがログに出力できた!
環境:
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 を継承したクラス) 必要な処理以外は消してます
LoggerProvider.cs クラス (実際のログ出力クラスを取得するクラス) これだけです。ソースを省いていません
LoggerSQL クラス(実際にログを出力するクラス) これだけです。 ソースを省いていませんが各自カスタマイズしてください
NLog.config (一応)
検索用:EntityFrameworkCore Entity Framework Core .net Core 3.1 NLog SQL 実行SQL ログ 出力 出力方法 出来ない 出ない 出し方
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 ログ 出力 出力方法 出来ない 出ない 出し方
コメント
コメントを投稿