【问题标题】:How to set the minimum loglevel with serilog's application insights sink如何使用 serilog 的应用程序洞察接收器设置最小日志级别
【发布时间】:2021-06-02 21:02:38
【问题描述】:

我正在使用 Serilog 来记录应用程序洞察,但我只得到日志级别警告、错误和要记录的关键。在 appsettings.json 中,我将最低日志级别设置为详细,这会记录文件和控制台接收器的所有内容。

默认情况下,应用洞察只能记录警告及以上。在代码中(在配置日志中),我可以添加一个过滤器来覆盖这个默认的警告及以上。我更喜欢在 appsettings 中使用其他日志记录配置来执行此操作。

我如何使用 appsettings 允许 Serilog 将所有级别记录到 Application Insights?

  • 我在应用程序洞察中获得了一些日志,因此连接性是 工作。
  • 我在日志文件和控制台上看到了所有日志级别。

在配置日志记录的地方,如果我添加 LogLevel 文件管理器(注释掉),我可以让它工作。我需要通过 appsettings 工作。

host.ConfigureLogging(
                loggingBuilder =>
                {
                    var configuration = new ConfigurationBuilder()
                       .AddJsonFile("appsettings.json")
                       .Build();
                    var logger = new LoggerConfiguration()
                        .ReadFrom.Configuration(configuration)
                        .CreateLogger();
                    loggingBuilder.AddApplicationInsights();
                    loggingBuilder.AddSerilog(logger, dispose: true);
                    //loggingBuilder.AddFilter<ApplicationInsightsLoggerProvider>("", LogLevel.Trace);
            
                }
            );

这是我的代码和结果:

这是我的应用设置:

"Serilog": {
    "AllowedHosts": "*",
    "Enrich": [ "WithMachineName" ],
    "MinimumLevel": {
      "Default": "Verbose",
      "Override": {
        "Microsoft": "Warning",
        "System": "Warning"
      }
    },
    "WriteTo": [
      {
        "Name": "Console"
      },
      {
        "Name": "File",
        "Args": {
          "fileSizeLimitBytes": "1048576",
          "formatter": "Serilog.Formatting.Compact.CompactJsonFormatter, Serilog.Formatting.Compact , Version=1.0.0.0, Culture=neutral, PublicKeyToken=24c2f752a8e58a10",
          "path": "c:\\LogFiles\\Publisher\\Test1\\_log.txt",
          "retainedFileCountLimit": null,
          "rollingInterval": "Day",
          "rollOnFileSizeLimit": "true"
        }
      },
      {
        "Name": "ApplicationInsights",
        "Args": {
          "restrictedToMinimumLevel": "Verbose",
          "telemetryConverter": "Serilog.Sinks.ApplicationInsights.Sinks.ApplicationInsights.TelemetryConverters.TraceTelemetryConverter, Serilog.Sinks.ApplicationInsights"
        }
      }
    ]
  },

【问题讨论】:

  • 先生有进展吗?如果您觉得我下面的帖子对您​​有帮助,您可以接受它作为答案吗?
  • @TinyWang 这就是我所做的,但它不起作用。我只在 ApplicaitonSights 中看到警告、错误和严重记录。我可以强制它工作,但在代码中添加它: loggingBuilder.AddFilter("", LogLevel.Trace);我需要它从 appsettings 工作。我的 appsettings 好像和你一样。
  • 我用代码和配置示例更新了问题。此外,我注意到我确实看到了 Microsoft 库记录的详细级别消息(在 Microsoft.EntityFrameworkCore.Infrastructure 中),只是在我记录它们时没有。
  • 我认为这是因为您的代码覆盖了应用设置。我记得代码中的配置比 appsetting 中的配置高。我看到你的appsetting中没有instrumentkey,你能把你的program.cs改成我下面贴的吗?在我的测试过程中,我还发现了许多关于 config serilog 的文档,但只有我在下面发布的内容成功。我也想不出只有那个配置才能工作的原因。我想你也可以创建一个空的 asp.net core mvc 项目并复制我的代码进行测试(只替换仪器密钥)。
  • appinsights 部分中有一个仪器键。记录器得到它,否则什么都不会记录(我可以在调试器中看到它)。

标签: azure-application-insights serilog


【解决方案1】:

这是我的测试结果:

我创建了我的 asp.net 核心 mvc 应用程序,这是我的 appsettings.json:

{
  "AllowedHosts": "*",
  "Serilog": {
    "Using": [],
    "MinimumLevel": "Verbose",
    "WriteTo": [
      {
        "Name": "Console",
        "Args": {
          "restrictedToMinimumLevel": "Verbose",
          "outputTemplate": "{Timestamp:HH:mm:ss.fff zzz} [{Level}] {Message}  {NewLine}{Exception}"

        }
      },
      {
        "Name": "ApplicationInsights",
        "Args": {
          "instrumentationKey": "instrument_key_here",
          "restrictedToMinimumLevel": "Verbose",
          "telemetryConverter": "Serilog.Sinks.ApplicationInsights.Sinks.ApplicationInsights.TelemetryConverters.TraceTelemetryConverter, Serilog.Sinks.ApplicationInsights"
        }
      }
    ],
    "Enrich": [ "FromLogContext", "WithMachineName", "WithThreadId"],
    "Properties": {
      "Application": "Sample"
    }
  }
}

我的program.cs,添加读取配置代码并添加UseSerilog():

using Microsoft.AspNetCore.Hosting;
using Microsoft.Extensions.Configuration;
using Microsoft.Extensions.Hosting;
using Serilog;

namespace serilog_appsetting_file_appinsights
{
    public class Program
    {
        public static void Main(string[] args)
        {
            var configuration = new ConfigurationBuilder()
                 .AddJsonFile("appsettings.json")
                 .Build();
            Log.Logger = new LoggerConfiguration()
                 .ReadFrom.Configuration(configuration)
                 .CreateLogger();

            CreateHostBuilder(args).Build().Run();
        }

        public static IHostBuilder CreateHostBuilder(string[] args) =>
            Host.CreateDefaultBuilder(args)
                .ConfigureWebHostDefaults(webBuilder =>
                {
                    webBuilder.UseStartup<Startup>();
                }).UseSerilog();
    }
}

我的包裹:

<ItemGroup>
    <PackageReference Include="Microsoft.ApplicationInsights.AspNetCore" Version="2.17.0" />
    <PackageReference Include="Serilog.AspNetCore" Version="4.1.0" />
    <PackageReference Include="Serilog.Settings.Configuration" Version="3.1.0" />
    <PackageReference Include="Serilog.Sinks.ApplicationInsights" Version="3.1.0" />
  </ItemGroup>

我的控制器文件:

using Microsoft.AspNetCore.Mvc;
using Microsoft.Extensions.Logging;
using Serilog;
using serilog_appsetting_file_appinsights.Models;
using System;
using System.Collections.Generic;
using System.Diagnostics;
using System.Linq;
using System.Threading.Tasks;

namespace serilog_appsetting_file_appinsights.Controllers
{
    public class HomeController : Controller
    {
        private readonly ILogger<HomeController> _logger;

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

        public IActionResult Index()
        {
            Log.Verbose("serilog_verbose_info");
            Log.Debug("serilog_debug_info");
            Log.Information("serilog_information_info");
            Log.Warning("serilog_warning_info");
            Log.Error("serilog_error_info");
            return View();
        }

        public IActionResult Privacy()
        {
            return View();
        }

        [ResponseCache(Duration = 0, Location = ResponseCacheLocation.None, NoStore = true)]
        public IActionResult Error()
        {
            return View(new ErrorViewModel { RequestId = Activity.Current?.Id ?? HttpContext.TraceIdentifier });
        }
    }
}

在 localhost 中调试时,我们可以看到应用洞察捕获这样的日志,并查看控制台日志

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-11-12
    • 2019-02-02
    • 1970-01-01
    • 1970-01-01
    • 2018-11-17
    • 1970-01-01
    相关资源
    最近更新 更多