📝

C#でDBログの出力量を制御する方法

に公開

経緯

吐く必要のない大量のクエリを含むDBログが環境問わず大量に吐かれてしまっており、検証環境にてAWSのCloudWatchを確認した際にログが埋もれてしまうため、環境によって出力量を調整したいという要望に対応したときのものです。
また、ほしい参考記事が意外となくて困ったので、同じように困っている方のために忘備録として書き留めておきます。

環境

ASP.NET Core 8.0
NLog
MySQL 8.0
Docker

原因

AddDbContext<CustomContext>によって制御が困難になっていた。

 var builder = WebApplication.CreateBuilder(args);
 .
 .
 .
 builder.Services.AddDbContext<CustomContext>(options =>
     options.UseMySQL(mysqlConnectionString)
     LogTo(NLog.Logmanager.GetLogger("DatabaseLogger").Info, LogLevel.Information);

対処

DbContextOptionsBuilder<CustomContext>()を使う

    .AddJsonFile("appsettings.{environment}.json", optional: true)
    .AddEnvironmentVariables()
    .Build();
 var logLevel = config.GetValue<LogLevel>($"Logging:LogLevel:Microsoft.EntityFrameworkCore.Database.Command");
 var dbContextOption = new DbContextOptionsBuilder<CustomContext>()
      .UseMySQL(mysqlConnectionString)
      .LogTo(NLog.LogManager.GetLogger("DatabaseLogger").Info, loglevel)
      .Options;
  builder.Services.AddScoped<CustomContext>(_ => new CustomContext(dbContextOption));

実際にはEnableSesitiveDataLoggingやEnableDetailedErrorsなども一緒に定義したし、Dockerfileに設定した環境変数を利用して環境の棲み分けはしているが、ログの出力量に直接影響した箇所のみを残しておく

最後に

初めて執筆してみたものの、対応した際のただの忘備録の域を出ないのと文章も拙いので、後々推敲・加筆していくと思います。

Discussion