前提・実現したいこと
EntityFrameworkCoreのDbContextクラスを使ってDBにアクセスし、テーブルの作成やレコードの操作を行うシステムを作っています。
その際、DBの呼び出しやレコード追加等のログを、NLogを使ってどこの何行目で呼ばれたのかまで取得しようとしています。
たとえば、Main.cs内で以下のように書かれている場合、Mainの2行目で呼び出され、4行目で作成し、7行目でレコードが追加されたというログを出力したいです。
C#
11:DbContextOptions<MyClassDbContext> opt = new DbContextOptionsBuilder<MyClassDbContext>().UseOracle(<接続情報>).Options; 22:var context = new MyClassDbContext(opt); 33: 44:context.Database.EnsureCreated(); 55: 66:MyUser myUser = new MyUser(); 77:context.MyUsers.Add(myUser);
DBはAmazon RDSのOracle DBです。
発生している問題・エラーメッセージ
DBへのアクセス、ログの出力まではできたのですが、DBの作成やレコードの追加などの操作がどこで呼ばれたのか、何行目で呼ばれたのかが
callsite:Oracle.EntityFrameworkCore.Trace`1.Write
callsite-linenumber:0
のようになってしまい、正しく取得できません。
該当のソースコード
DbContextを継承した独自クラスを宣言し、ILoggerFactoryにNLogを使うように設定しています。
C#
1namespace MyClass.Entity 2{ 3 public class MyClassDbContext : DbContext 4 { 5 public MyClassDbContext(DbContextOptions<MyClassDbContext> options) 6 : base(options) { 7 } 8 9 /// <summary> 10 /// テーブルの宣言 11 /// </summary> 12 public DbSet<MyUser> MyUsers { get; set; } 13 14 /// <summary> 15 /// LoggerFactory 16 /// </summary> 17 private static readonly ILoggerFactory LoggerFactory = new ServiceCollection().AddLogging(builder => 18 builder.AddProvider(new NLogLoggerProvider()).AddFilter(DbLoggerCategory.Database.Command.Name, LogLevel.Debug)) 19 .BuildServiceProvider().GetService<ILoggerFactory>(); 20 21 /// <summary> 22 /// ログ出力 23 /// </summary> 24 /// <param name="optionsBuilder"></param> 25 protected override void OnConfiguring(DbContextOptionsBuilder optionsBuilder) 26 { 27 optionsBuilder.UseLoggerFactory(LoggerFactory); 28 } 29 30 /// <summary> 31 /// テーブルの作成 32 /// </summary> 33 /// <param name="modelBuilder"></param> 34 protected override void OnModelCreating(ModelBuilder modelBuilder) 35 { 36 modelBuilder.Entity<MyUser>().ToTable("MYUSER"); 37 } 38 } 39}
nlog.configファイルは以下URLを参考に
https://qiita.com/gushwell/items/a7804394b57cfeca6bd0
layout
だけlayout="${longdate}|${event-properties:item=EventId_Id}|${uppercase:${level}}|${logger}|${message}" ${callsite}#${callsite-linenumber}|url: ${aspnet-request-url:IncludeQueryString=true}" />
のように ${callsite}#${callsite-linenumber}
を入れ込んでいます。
試したこと
https://taktak.jp/2017/01/22/1760/
上記のURLを参考にNLogLogFactoryServiceクラスを作成してみたのですが、これをLoggerFactoryに設定する方法が分かりませんでした。
https://stackoverflow.com/questions/37931013/how-to-get-a-usable-callsite-using-nlog-and-asp-net-core-rc2?rq=1
こういった方法で、間のもの?を無視する方法もあるようなのですが、これも使い方が分かりませんでした…。
他にもいろいろ検索はしたのですが、検索の仕方が悪いのか、やろうとしている内容の記事がなかなか見つかりません。
補足情報(FW/ツールのバージョンなど)
OS:Windows10
.NET:6.0
EntityFrameworkCore:6.0.1
NLog:4.7.13
Oracle.ManagedDataAccess.Core:3.21.50
正しい方法などご存じでしたらよろしくお願いいたします。
あなたの回答
tips
プレビュー