我在asp.net核心应用程序中添加了健康检查。当健康检查失败时-返回“不健康”,但我无法得到任何信息,它失败的原因。在带有文件的记录器中,没有登录控制台。我怎么能看到错误,异常?
我简化了.net6 for应用程序的代码
Programm.cs
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的健康检查将失败。在控制台中,我看到了这个图像
参考文献
<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
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
发布于 2022-01-26 10:16:07
我的建议如下:使用.NET Core和Serilog在控制台上添加日志
1.安装Serilog
、Serilog.AspNetCore
和Serilog.Extensions.Logging
NuGet包,以集成Serilog的基本功能。
2.下载Serilog.Sinks.Console
和Serilog.Sinks.Async
NuGet包,将控制台用作日志的目的地。
3.更新Program
类以指定应用程序必须使用Serilog。
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
是类本身的名称:
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文件中而不是直接在代码中定义设置
{
"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": "*"
}
结果:
我找到了一个链接,希望它能帮助你。
https://stackoverflow.com/questions/70859162
复制相似问题