質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.50%
Entity Framework

Entity Frameworkは、.NET Framework 3.5より追加されたデータアクセス技術。正式名称は「ADO.NET Entity Framework」です。データベースエンジンに依存しておらず、データプロバイダの変更のみで様々なデータベースに対応できます。

.NET Core

.NET Coreは、マネージソフトウェアフレームワークでオープンソースで実装されています。クロスプラットフォームを前提に考えられており、Windows/Mac/Linuxで動くアプリケーションを作成することが可能です。

C#

C#はマルチパラダイムプログラミング言語の1つで、命令形・宣言型・関数型・ジェネリック型・コンポーネント指向・オブジェクティブ指向のプログラミング開発すべてに対応しています。

Q&A

0回答

1914閲覧

DbContextのログをNLogで取るとcallsiteとcallsite-linenumberが正しく出ない

AkiFuku

総合スコア129

Entity Framework

Entity Frameworkは、.NET Framework 3.5より追加されたデータアクセス技術。正式名称は「ADO.NET Entity Framework」です。データベースエンジンに依存しておらず、データプロバイダの変更のみで様々なデータベースに対応できます。

.NET Core

.NET Coreは、マネージソフトウェアフレームワークでオープンソースで実装されています。クロスプラットフォームを前提に考えられており、Windows/Mac/Linuxで動くアプリケーションを作成することが可能です。

C#

C#はマルチパラダイムプログラミング言語の1つで、命令形・宣言型・関数型・ジェネリック型・コンポーネント指向・オブジェクティブ指向のプログラミング開発すべてに対応しています。

0グッド

0クリップ

投稿2022/01/21 08:49

編集2022/01/21 10:13

前提・実現したいこと

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}&quot; ${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

正しい方法などご存じでしたらよろしくお願いいたします。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだ回答がついていません

会員登録して回答してみよう

アカウントをお持ちの方は

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.50%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問