【问题标题】:Prevent SQL queries from appearing in my logging防止 SQL 查询出现在我的日志中
【发布时间】:2021-12-15 05:21:58
【问题描述】:

我正在使用 Serilog 登录我的控制台应用程序。我设置如下。

// Build configuration
IConfiguration configuration = new ConfigurationBuilder()
    .SetBasePath(ApplicationInfo.DataPath)
    .AddJsonFile("appsettings.json", false, false)
    .Build();

// Configure Serilog
string logFormat = "[{Timestamp:yyyy-MM-dd hh:mm:ss tt}][{Level:u3}] {Message:lj}{NewLine}{Exception}";
Log.Logger = new LoggerConfiguration()
    .ReadFrom.Configuration(configuration)
    .WriteTo.Console(LogEventLevel.Verbose, logFormat)
    .WriteTo.File(ApplicationInfo.GetDataFileName("log"), LogEventLevel.Verbose, logFormat)
    .CreateLogger();

AppHost = Host.CreateDefaultBuilder(args)
    .ConfigureServices((context, services) =>
    {
        services.AddDbContext<TTApplicationDbContext>(options =>
        {
            options.UseSqlServer(configuration.GetConnectionString("DefaultConnection"));
        });
        services.Configure<EmailSettings>(configuration.GetSection("EmailSettings"));
        services.Configure<SftpSettings>(configuration.GetSection("FtpSettings"));
    })
    .UseSerilog()
    .Build();

在我的 appsettings.json 文件中。

"Serilog": {
  "MinimumLevel": {
    "Default": "Information",
    "Override": {
      "Microsoft": "Warning",
      "System": "Warning"
    }
  }
}

除了 SQL 查询明显显示在我的日志中之外,这一切正常,与实体框架异常有关。

我不想更改日志级别。我想记录这些错误。我只是不希望包含实际的 SQL 查询。这甚至不是安全问题。它们太冗长了,很难找到实际的错误。

在我的 ASP.NET Core 应用程序中,我必须添加以下行以在日志记录中启用 SQL 查询。

builder.EnableSensitiveDataLogging();

我的控制台应用程序需要与此相反。

注意:请不要太快将其标记为重复。我发现了类似的问题,但找不到任何直接回答我所问问题的问题。

【问题讨论】:

  • 您可以添加环境检查是否调试,然后添加 builder.EnableSensitiveDataLogging() 如果它在发布或生产中它不会添加此信息,因为调试将只适用于开发人员!
  • @khaledDehia:你误读了这个问题。我不想要EnableSensitiveDataLogging()。我想要相反的结果。
  • 感谢澄清,顺便说一句,我的意思是开发环境不是调试,我的错
  • 您使用哪些 Serilog 扩展?
  • @TiesonT.:这一切都在我的代码中。第二块是我配置 Serilog 的地方。

标签: c# .net asp.net-core .net-core serilog


【解决方案1】:

您可以过滤生成 SQL 命令并覆盖的特定命名空间

// Configure Serilog
string logFormat = "[{Timestamp:yyyy-MM-dd hh:mm:ss tt}][{Level:u3}] {Message:lj}{NewLine}{Exception}";
Log.Logger = new LoggerConfiguration()
    .ReadFrom.Configuration(configuration)
    .WriteTo.Console(LogEventLevel.Verbose, logFormat)
    .WriteTo.File(ApplicationInfo.GetDataFileName("log"), LogEventLevel.Verbose, logFormat)
    .MinimumLevel.Verbose().MinimumLevel.Override("Microsoft.EntityFrameworkCore.Database.Command", Serilog.Events.LogEventLevel.Warning)
        .MinimumLevel.Verbose().MinimumLevel.Override("Microsoft.EntityFrameworkCore.Database.Query", Serilog.Events.LogEventLevel.Warning)
                .CreateLogger();

【讨论】:

  • 这只是阻止来自该源的日志记录。如我的问题所示,我仍然想知道异常。我只是不想要所有的 SQL 查询。
  • 我已经根据您的需要更新了答案。您将需要覆盖 Verbose 最低级别...
  • 再一次,我仍然想要例外。所以我不想更改异常过滤器。
  • 更新后的答案就是原来的样子,正常情况下会隐藏sql语句,但出现warning、error、fatal case时会显示。它并没有隐藏所有输出。试试看输出。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-05-19
  • 2020-09-16
  • 2015-06-06
  • 1970-01-01
  • 2011-01-17
  • 2012-07-16
相关资源
最近更新 更多