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

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

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

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

.NET Core

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

C#

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

受付中

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

AkiFuku
AkiFuku

総合スコア116

Entity Framework

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

.NET Core

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

C#

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

0回答

0評価

0クリップ

556閲覧

投稿2022/01/21 08:49

編集2022/01/21 10:13

前提・実現したいこと

EntityFrameworkCoreのDbContextクラスを使ってDBにアクセスし、テーブルの作成やレコードの操作を行うシステムを作っています。
その際、DBの呼び出しやレコード追加等のログを、NLogを使ってどこの何行目で呼ばれたのかまで取得しようとしています。
たとえば、Main.cs内で以下のように書かれている場合、Mainの2行目で呼び出され、4行目で作成し、7行目でレコードが追加されたというログを出力したいです。

C#

1:DbContextOptions<MyClassDbContext> opt = new DbContextOptionsBuilder<MyClassDbContext>().UseOracle(<接続情報>).Options; 2:var context = new MyClassDbContext(opt); 3: 4:context.Database.EnsureCreated(); 5: 6:MyUser myUser = new MyUser(); 7:context.MyUsers.Add(myUser);

DBはAmazon RDSのOracle DBです。

発生している問題・エラーメッセージ

DBへのアクセス、ログの出力まではできたのですが、DBの作成やレコードの追加などの操作がどこで呼ばれたのか、何行目で呼ばれたのかが
callsite:Oracle.EntityFrameworkCore.Trace`1.Write
callsite-linenumber:0
のようになってしまい、正しく取得できません。

該当のソースコード

DbContextを継承した独自クラスを宣言し、ILoggerFactoryにNLogを使うように設定しています。

C#

namespace MyClass.Entity { public class MyClassDbContext : DbContext { public MyClassDbContext(DbContextOptions<MyClassDbContext> options) : base(options) { } /// <summary> /// テーブルの宣言 /// </summary> public DbSet<MyUser> MyUsers { get; set; } /// <summary> /// LoggerFactory /// </summary> private static readonly ILoggerFactory LoggerFactory = new ServiceCollection().AddLogging(builder => builder.AddProvider(new NLogLoggerProvider()).AddFilter(DbLoggerCategory.Database.Command.Name, LogLevel.Debug)) .BuildServiceProvider().GetService<ILoggerFactory>(); /// <summary> /// ログ出力 /// </summary> /// <param name="optionsBuilder"></param> protected override void OnConfiguring(DbContextOptionsBuilder optionsBuilder) { optionsBuilder.UseLoggerFactory(LoggerFactory); } /// <summary> /// テーブルの作成 /// </summary> /// <param name="modelBuilder"></param> protected override void OnModelCreating(ModelBuilder modelBuilder) { modelBuilder.Entity<MyUser>().ToTable("MYUSER"); } } }

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

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

良い質問の評価を上げる

以下のような質問は評価を上げましょう

  • 質問内容が明確
  • 自分も答えを知りたい
  • 質問者以外のユーザにも役立つ

評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

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

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

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

teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

  • プログラミングに関係のない質問
  • やってほしいことだけを記載した丸投げの質問
  • 問題・課題が含まれていない質問
  • 意図的に内容が抹消された質問
  • 過去に投稿した質問と同じ内容の質問
  • 広告と受け取られるような投稿

評価を下げると、トップページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

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

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

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

ただいまの回答率
87.20%

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

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

質問する

関連した質問

同じタグがついた質問を見る

Entity Framework

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

.NET Core

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

C#

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