Serilog不会获取应用程序事件,而只会获取编码的记录器事件 [英] Serilog not getting application events, only coded logger events

查看:180
本文介绍了Serilog不会获取应用程序事件,而只会获取编码的记录器事件的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我将我的应用程序设置为使用Serilog作为日志记录机制.实际上,我确实可以获取日志文件,并且可以在Seq上查看它们.最初,我记录了应用程序事件,但是由于某种原因,我不再获取它们了.请参见下面的图像.

在第一张图片中,我正在获取应用程序事件.后来,当执行相同的测试操作时,我再也没有得到应用程序事件,只有文件中的编码事件(即_logger.LogWarning("Warning");)

我在Main方法中设置了Serilog.

 public static int Main(string[] args)
{
    var currentEnv = Environment.GetEnvironmentVariable("ASPNETCORE_ENVIRONMENT");

    var configuration = new ConfigurationBuilder()
        .AddJsonFile("appsettings.json")
        .AddJsonFile($"appsettings.{currentEnv}.json", optional: true)
        .AddEnvironmentVariables()
        .Build();

    //Configure logger
    Log.Logger = new LoggerConfiguration()
        .ReadFrom.Configuration(configuration)
        .CreateLogger();

    Log.Information("Logger created");

    try
    {
        Log.Information("Starting web host");
        BuildWebHost(args).Run();
        return 0;
    }
    catch (Exception ex)
    {
        Log.Fatal(ex, "Web Host terminated unexpectedly");
        return 1;
    }
    finally
    {
        Log.CloseAndFlush();
    }
}

    public static IWebHost BuildWebHost(string[] args) =>
        WebHost.CreateDefaultBuilder(args)
            .UseStartup<Startup>()
            .Build();
}
 

我的Serilog设置

  "Serilog": {
  "Using": [
    "Serilog.Sinks.RollingFile",
    "Serilog.Sinks.Async",
    "Serilog.Sinks.ApplicationInsights",
    "Serilog.Sinks.Console",
    "Serilog.Sinks.Seq"
  ],
  "MinimumLevel": {
    "Default": "Information",
    "Override": {
      "Microsoft": "Warning"
    }
  },
  "WriteTo": [
    {
      "Name": "Async",
      "Args": {
        "configure": [
          {
            "Name": "RollingFile",
            "Args": { "pathFormat": "C:/Logs/Serilog/log-{Date}.log" }
          },
          {
            "Name": "Seq",
            "Args": { "serverUrl": "http://localhost:5341" }
          }
        ]
      }
    }
  ],
  "Enrich": [ "FromLogContext", "WithMachineName", "WithThreadId" ],
  "Properties": {
    "Application": "WebTemplate"
  }
}
 

在继续使Serilog更具功能性之前,我想弄清楚为什么我不再收到应用程序事件.

解决方案

我希望这可以归结为Serilog设置中的以下部分:

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

Nicholas Blumhardt的博客帖子详细介绍了Override设置有效:

那么,当记录器归Microsoft.*名称空间中的类型所有时,以上配置的作用是仅在警告级别或更高级别生成事件.

此引用似乎直接适用于您的情况,即您要求Serilog过滤掉属于Microsoft的任何事件.*名称空间的严重性低于Warning./p>

您在第一个屏幕截图中显示的消息来自MVC或Entity Framework,它们位于Microsoft.*名称空间中,并且记录的严重性低于警告级别.

I set up my application to use Serilog as the logging mechanism. And I do in fact get log files and can view them on Seq. Initially I was getting the application events logged, but for some reason I am no longer getting them. See the images below.

In the first image I am getting application events. Later, when doing the same testing operations, I am NOT getting the application events any more, only the coded events in the files (i.e. _logger.LogWarning("Warning");)

I set up Serilog in Main method.

public static int Main(string[] args)
{
    var currentEnv = Environment.GetEnvironmentVariable("ASPNETCORE_ENVIRONMENT");

    var configuration = new ConfigurationBuilder()
        .AddJsonFile("appsettings.json")
        .AddJsonFile($"appsettings.{currentEnv}.json", optional: true)
        .AddEnvironmentVariables()
        .Build();

    //Configure logger
    Log.Logger = new LoggerConfiguration()
        .ReadFrom.Configuration(configuration)
        .CreateLogger();

    Log.Information("Logger created");

    try
    {
        Log.Information("Starting web host");
        BuildWebHost(args).Run();
        return 0;
    }
    catch (Exception ex)
    {
        Log.Fatal(ex, "Web Host terminated unexpectedly");
        return 1;
    }
    finally
    {
        Log.CloseAndFlush();
    }
}

    public static IWebHost BuildWebHost(string[] args) =>
        WebHost.CreateDefaultBuilder(args)
            .UseStartup<Startup>()
            .Build();
}

My Serilog settings

 "Serilog": {
  "Using": [
    "Serilog.Sinks.RollingFile",
    "Serilog.Sinks.Async",
    "Serilog.Sinks.ApplicationInsights",
    "Serilog.Sinks.Console",
    "Serilog.Sinks.Seq"
  ],
  "MinimumLevel": {
    "Default": "Information",
    "Override": {
      "Microsoft": "Warning"
    }
  },
  "WriteTo": [
    {
      "Name": "Async",
      "Args": {
        "configure": [
          {
            "Name": "RollingFile",
            "Args": { "pathFormat": "C:/Logs/Serilog/log-{Date}.log" }
          },
          {
            "Name": "Seq",
            "Args": { "serverUrl": "http://localhost:5341" }
          }
        ]
      }
    }
  ],
  "Enrich": [ "FromLogContext", "WithMachineName", "WithThreadId" ],
  "Properties": {
    "Application": "WebTemplate"
  }
}

Before I move on to making Serilog more functional, I would like to sort out why I am not getting application events any longer.

解决方案

I expect this is down to the following section in your Serilog settings:

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

Nicholas Blumhardt's blog post goes into detail about how the Override setting works:

The effect of the configuration above, then, is to generate events only at or above the Warning level when the logger is owned by a type in a Microsoft.* namespace.

This quote seems to apply directly to your situation, whereby you are asking Serilog to filter out any events that belong to the Microsoft.* namespace and are lower than a severity of Warning.

The messages you show in your first screenshot are coming from either MVC or Entity Framework, which live in the Microsoft.* namespace and will be logging at a lower severity than warning.

这篇关于Serilog不会获取应用程序事件,而只会获取编码的记录器事件的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆