首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >ASP.NET Core6健康检查不记录异常

ASP.NET Core6健康检查不记录异常
EN

Stack Overflow用户
提问于 2022-01-26 06:00:52
回答 1查看 391关注 0票数 0

我在asp.net核心应用程序中添加了健康检查。当健康检查失败时-返回“不健康”,但我无法得到任何信息,它失败的原因。在带有文件的记录器中,没有登录控制台。我怎么能看到错误,异常?

我简化了.net6 for应用程序的代码

Programm.cs

代码语言:javascript
运行
复制
using WebApi6HealthCheck;
using Microsoft.EntityFrameworkCore;
using Serilog;
using Microsoft.AspNetCore.Diagnostics.HealthChecks;

var builder = WebApplication.CreateBuilder(args);
builder.Host.UseSerilog((ctx, lc) => lc
        .WriteTo.Console());

builder.Services.AddControllers();
builder.Services.AddEndpointsApiExplorer();

builder.Services.AddDbContext<OneProfileContext>(opt =>
    opt.UseSqlServer("Data Source=fake-dbsql-S2016;Initial Catalog=S7OneProfile;User Id=kos_debugger;Password=SecretPassword;Connect Timeout=3;"));

builder.Services.AddHealthChecks()
    .AddDbContextCheck<OneProfileContext>(tags: new[] { "live" });

var app = builder.Build();

app.UseHttpsRedirection();
app.MapControllers();
app.MapHealthChecks("/health/live", new HealthCheckOptions()
{
    Predicate = (check) => check.Tags.Contains("live")
});
app.Run();

没有数据库,dbcontext的健康检查将失败。在控制台中,我看到了这个图像

参考文献

代码语言:javascript
运行
复制
<PackageReference Include="Microsoft.EntityFrameworkCore" Version="6.0.1" />
<PackageReference Include="Microsoft.EntityFrameworkCore.SqlServer" Version="6.0.1" />
<PackageReference Include="Microsoft.Extensions.Diagnostics.HealthChecks.EntityFrameworkCore" Version="6.0.1" />
<PackageReference Include="Serilog.AspNetCore" Version="4.1.0" />

更新

如果我从控制器方法中调用dbContext,我会在控制台中看到异常--这是正确的,很好,扇。但是,当调用HealthCheck - /health/live时,我希望看到同样的异常

WeatherForecastController.cs

代码语言:javascript
运行
复制
using Microsoft.AspNetCore.Mvc;

namespace WebApi6HealthCheck.Controllers
{
    [ApiController]
    [Route("[controller]")]
    public class WeatherForecastController : ControllerBase
    {
        private readonly ILogger<WeatherForecastController> _logger;
        private readonly OneProfileContext _dbContext;

        public WeatherForecastController(ILogger<WeatherForecastController> logger, OneProfileContext dbContext)
        {
            _logger = logger;
            _dbContext = dbContext;
        }

        [HttpGet(Name = "GetWeatherForecast")]
        public string Get()
        {
            var appEvent=_dbContext.ApplicationEvents.FirstOrDefault();

            return "Hello,world";
        }
    }
}

获取https://localhost:7197/WeatherForecast

EN

回答 1

Stack Overflow用户

发布于 2022-01-26 10:16:07

我的建议如下:使用.NET Core和Serilog在控制台上添加日志

1.安装SerilogSerilog.AspNetCoreSerilog.Extensions.Logging NuGet包,以集成Serilog的基本功能。

2.下载Serilog.Sinks.ConsoleSerilog.Sinks.Async NuGet包,将控制台用作日志的目的地。

3.更新Program类以指定应用程序必须使用Serilog。

代码语言:javascript
运行
复制
Log.Logger = new LoggerConfiguration().CreateLogger();
var builder = WebApplication.CreateBuilder(args);
builder.Host.UseSerilog((hostingContext, loggerConfiguration) =>
loggerConfiguration.ReadFrom.Configuration(hostingContext.Configuration));

4.使用ILogger<T>而不是Serilog.ILogger

由于我们已经将Serilog记录器绑定到.NET上的本地日志程序--来自Microsoft.Extensions.Logging的本地日志程序--所以我们可以在项目中的任何地方使用本机记录器。

在构造函数中向ILogger<T>添加依赖项,其中T是类本身的名称:

代码语言:javascript
运行
复制
public class HomeController : Controller

    {
        private readonly ILogger<HomeController> _logger;

        public HomeController(ILogger<HomeController> logger)
        {
            _logger = logger;
        }

        public IActionResult Index()
        {
            _logger.LogInformation("Getting random items. There are {AvailableItems} possible values");

            _logger.LogWarning("This is a warning");

            try
            {
                throw new ArgumentException();//you can modify codes to catch your health-check
            }
            catch (Exception ex)
            {
                _logger.LogError(ex, "And this is an error");
            }
            return View();
        }
}

5.在appsettings.json文件中而不是直接在代码中定义设置

代码语言:javascript
运行
复制
{

  "Serilog": {
    "Using": [ "Serilog.Sinks.Console" ],
    "MinimumLevel": {
      "Default": "Verbose",
      "Override": {
        "Microsoft": "Warning",
        "Microsoft.AspNetCore": "Warning",
        "System": "Error"
      }
    },
    "WriteTo": [
      {
        "Name": "Async",
        "Args": {
          "configure": [
            {
              "Name": "Console",
              "Args": {
                "theme": "Serilog.Sinks.SystemConsole.Themes.AnsiConsoleTheme::Code, Serilog.Sinks.Console",
                "formatter": "Serilog.Formatting.Compact.RenderedCompactJsonFormatter, Serilog.Formatting.Compact"
              }
            }
          ]
        }
      }
    ]
  },
  "AllowedHosts": "*"
}

结果:

我找到了一个链接,希望它能帮助你。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/70859162

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档