Asp.net core 使用Serilog记录Blazor应用程序

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()

在blazor应用程序中,我在main中配置了如下启动日志:


        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;