Asp.net core 使用Serilog记录Blazor应用程序
在blazor应用程序中,我在main中配置了如下启动日志:Asp.net core 使用Serilog记录Blazor应用程序,asp.net-core,blazor,blazor-server-side,serilog,asp.net-core-logging,Asp.net Core,Blazor,Blazor Server Side,Serilog,Asp.net Core Logging,在blazor应用程序中,我在main中配置了如下启动日志: public static void Main(string[] args) { var assembly = Assembly.GetExecutingAssembly().GetName(); var appInsightsTelemetryConfiguration = TelemetryConfiguration.CreateDefault()
public static void Main(string[] args)
{
var assembly = Assembly.GetExecutingAssembly().GetName();
var appInsightsTelemetryConfiguration = TelemetryConfiguration.CreateDefault();
appInsightsTelemetryConfiguration.InstrumentationKey = "aa11aa11aa-a1a1-a1-aa-a111-aa11";
Log.Logger = new LoggerConfiguration()
.MinimumLevel.Override("Microsoft.AspNetCore", Serilog.Events.LogEventLevel.Warning)
.Enrich.FromLogContext()
.Enrich.WithProperty("Application", $"{assembly.Name}")
.WriteTo.Console()
.WriteTo.Seq(serverUrl: "http://myseqserver.inthecloud.azurecontainer.io:5341/")
.WriteTo.ApplicationInsights(appInsightsTelemetryConfiguration, TelemetryConverter.Traces)
.CreateLogger();
try
{
Log.Information(Constants.Logging.Messages.SERVICE_STARTED, assembly.Name);
var host = CreateHostBuilder(args).Build();
using (var serviceScope = host.Services.CreateScope())
{
var context = serviceScope.ServiceProvider.GetRequiredService<MyDbContext>();
context.Database.Migrate(); // apply outstanding migrations automatically
}
host.Run();
return;
}
catch (Exception ex)
{
Log.Fatal(ex, Constants.Logging.Messages.SERVICE_STARTED, assembly.Name);
return;
}
finally
{
// make sure all batched messages are written.
Log.CloseAndFlush();
}
}
public static IHostBuilder CreateHostBuilder(string[] args) =>
Host.CreateDefaultBuilder(args)
.UseSerilog()
.ConfigureWebHostDefaults(webBuilder =>
{
webBuilder.UseStartup<Startup>();
});
在我的blazor页面上,我无法让它工作
@inject ILogger<ThisRazorPage> Logger
@code{
protected override void OnInitialized()
{
Logger.LogTrace("Log something. Please!");
}
}
@InjectiLogger记录器
@代码{
受保护的覆盖无效OnInitialized()
{
Logger.LogTrace(“请记录一些东西!”);
}
}
但这确实有效
@inject ILoggerFactory LoggerFactory
@code{
protected override void OnInitialized()
{
var logger = LoggerFactory.CreateLogger<Incident>();
logger.LogTrace("Log something. Please!");
}
}
@inject-ilogger-factory-logger-factory
@代码{
受保护的覆盖无效OnInitialized()
{
var logger=LoggerFactory.CreateLogger();
logger.LogTrace(“请记录一些东西!”);
}
}
根据
.useserlog()
方法,为iLogger工厂
添加DI。有没有一种方法可以让我在DI框架内为ILogger
做类似的事情,这样就可以使用ILogger
,而不必在每个页面上显式创建LoggerFactory
。静态方法对我来说很有效
@using Serilog
@code {
Log.Information("Log something. Please!");
}
你需要:
- 添加
Serilog.Extensions.Logging
- 加入你的Main()
公共静态异步任务主(字符串[]args)
{
var builder=WebAssemblyHostBuilder.CreateDefault(args);
builder.RootComponents.Add(“#app”);
// ...
builder.Services.AddTransient();
var levelSwitch=新的日志levelSwitch();
Logger.Logger=新的LoggerConfiguration()
.最低液位由(液位开关)控制
.Enrich.WithProperty(“InstanceId”,Guid.NewGuid().ToString(“n”))
.CreateLogger();
//------这就是你要找的
builder.Logging.AddSerilog();
// ...
等待builder.Build().RunAsync();
}
- 在您的ViewModel中
公共类AccountsViewModel
{
专用只读ILogger记录器;
私有只读HttpClient Http;
公共帐户视图模型(
ILogger记录器,
HttpClient http
)
{
Http=Http;
记录器=记录器;
Logger.LogInformation(“AccountsViewModel()”);
}
}
- 或者在你的剃须刀页面:
@InjectiLogger记录器;
我无法让它工作。一切都像这里一样。把“@using Serilog”放到你的_Imports.razor中,你不需要每次都把它写到你的.razor文件中。当您使用代码隐藏文件(xyz.razor.cs)时,您需要提供using指令。考虑到这一点,亚当的解决方案也对我有效。但是,使用Serilog的条件是,已按照Serilogs主页上的记录实施。
@using Serilog
@code {
Log.Information("Log something. Please!");
}
public static async Task Main(string[] args)
{
var builder = WebAssemblyHostBuilder.CreateDefault(args);
builder.RootComponents.Add<App>("#app");
// ...
builder.Services.AddTransient<AccountsViewModel>();
var levelSwitch = new LoggingLevelSwitch();
Log.Logger = new LoggerConfiguration()
.MinimumLevel.ControlledBy(levelSwitch)
.Enrich.WithProperty("InstanceId", Guid.NewGuid().ToString("n"))
.CreateLogger();
// ------------- this is what you'r looking for
builder.Logging.AddSerilog();
// ...
await builder.Build().RunAsync();
}
public class AccountsViewModel
{
private readonly ILogger<AccountsViewModel> Logger;
private readonly HttpClient Http;
public AccountsViewModel(
ILogger<AccountsViewModel> logger,
HttpClient http
)
{
Http = http;
Logger = logger;
Logger.LogInformation("AccountsViewModel()");
}
}
@inject ILogger<ThisRazorPage> logger;