Serilog.AspNetCore 8.0.2

前缀已保留
dotnet add package Serilog.AspNetCore --version 8.0.2                
NuGet\Install-Package Serilog.AspNetCore -Version 8.0.2                
该命令旨在在 Visual Studio 的包管理器控制台中使用,因为它使用 NuGet 模块的 Install-Package 版本。
<PackageReference Include="Serilog.AspNetCore" Version="8.0.2" />                
对于支持 PackageReference 的项目,将此 XML 节点复制到项目文件中以引用该包。
paket add Serilog.AspNetCore --version 8.0.2                
#r "nuget: Serilog.AspNetCore, 8.0.2"                
#r 指令可用于 F# Interactive 和 Polyglot Notebooks。将此复制到交互式工具或脚本的源代码中以引用包。
// Install Serilog.AspNetCore as a Cake Addin
#addin nuget:?package=Serilog.AspNetCore&version=8.0.2

// Install Serilog.AspNetCore as a Cake Tool
#tool nuget:?package=Serilog.AspNetCore&version=8.0.2                

Serilog.AspNetCore Build status NuGet Version NuGet Prerelease Version

针对 ASP.NET Core 的 Serilog 日志记录。本包通过 Serilog 路由 ASP.NET Core 日志消息,因此您可以将有关 ASP.NET 内部操作的信息写入与您的应用程序事件相同的 Serilog 终端。

安装并配置了 Serilog.AspNetCore 之后,您可以直接通过 Serilog 或由 ASP.NET 注入的任何 ILogger 接口写入日志消息。所有记录器都将使用相同的底层实现、级别和目标。

版本控制:本包跟踪其依赖的 Microsoft.Extensions.Hosting 的版本和目标框架支持。大多数用户应选择与其应用程序的目标框架匹配的 Serilog.AspNetCore 版本。例如,如果您针对 .NET 7.x,请选择 7.x 版本的 Serilog.AspNetCore。如果您针对 .NET 8.x,请选择 8.x 版本的 Serilog.AspNetCore,依此类推。

说明

首先,将 Serilog.AspNetCoreNuGet 包 安装到您的应用程序中。

dotnet add package Serilog.AspNetCore

接下来,在您的应用程序的 Program.cs 文件中,首先配置 Serilog。一个 try/catch 块将确保任何配置问题都得到适当的记录。

using Serilog;

Log.Logger = new LoggerConfiguration()
    .WriteTo.Console()
    .CreateLogger();

try
{
    Log.Information("Starting web application");

    var builder = WebApplication.CreateBuilder(args);
    builder.Services.AddSerilog(); // <-- Add this line
    
    var app = builder.Build();
    app.MapGet("/", () => "Hello World!");

    app.Run();
}
catch (Exception ex)
{
    Log.Fatal(ex, "Application terminated unexpectedly");
}
finally
{
    Log.CloseAndFlush();
}

builder.Services.AddSerilog() 调用将为所有日志事件重定向到您的 Serilog 管道。

最后,通过清理对默认记录器的剩余配置来完成,包括从 appsettings.*.json 文件中删除 "Logging" 部分(如果需要,可以替换为 Serilog 配置,如 Sample 项目 中所示)。

就是这样!稍微提高日志级别,您将看到类似于以下内容的日志输出

[12:01:43 INF] Starting web application
[12:01:44 INF] Now listening on: http://localhost:5000
[12:01:44 INF] Application started. Press Ctrl+C to shut down.
[12:01:44 INF] Hosting environment: Development
[12:01:44 INF] Content root path: serilog-aspnetcore/samples/Sample
[12:01:47 WRN] Failed to determine the https port for redirect.
[12:01:47 INF] Hello, world!
[12:01:47 INF] HTTP GET / responded 200 in 95.0581 ms

提示:在 IIS 下运行时,要在 Visual Studio 的输出窗口中看到 Serilog 输出,请从 显示输出自 下拉列表中选择 ASP.NET Core Web Server,或者在记录器配置中将 WriteTo.Console() 替换为 WriteTo.Debug()

一个更完整的示例,包括 appsettings.json 配置,可以在 此处的示例项目 中找到。

请求数据记录

本包包括用于更智能 HTTP 请求记录的中间件。ASP.NET Core 实现的默认请求记录非常嘈杂,每次请求都发出多个事件。所包含的中间件将这些事件压缩成一个事件,该事件包含方法、路径、状态码和计时信息。

作为文本,其格式如下

[16:05:54 INF] HTTP GET / responded 200 in 227.3253 ms

或者作为 JSON

{
  "@t": "2019-06-26T06:05:54.6881162Z",
  "@mt": "HTTP {RequestMethod} {RequestPath} responded {StatusCode} in {Elapsed:0.0000} ms",
  "@r": ["224.5185"],
  "RequestMethod": "GET",
  "RequestPath": "/",
  "StatusCode": 200,
  "Elapsed": 224.5185,
  "RequestId": "0HLNPVG1HI42T:00000001",
  "CorrelationId": null,
  "ConnectionId": "0HLNPVG1HI42T"
}

要启用中间件,请首先修改您的记录器配置或 appsettings.json 文件中将嘈杂的 ASP.NET Core 日志源的最低级别更改为 Warning

            .MinimumLevel.Override("Microsoft.AspNetCore.Hosting", LogEventLevel.Warning)
            .MinimumLevel.Override("Microsoft.AspNetCore.Mvc", LogEventLevel.Warning)
            .MinimumLevel.Override("Microsoft.AspNetCore.Routing", LogEventLevel.Warning)

提示:{SourceContext} 添加到控制台记录器的输出模板中,以查看记录器的名称;这有助于跟踪要抑制的嘈杂日志事件的来源。

然后,在您的应用程序的 Program.cs 中,使用 UseSerilogRequestLogging() 添加中间件

    var app = builder.Build();

    app.UseSerilogRequestLogging(); // <-- Add this line

    // Other app configuration

重要的是确保 UseSerilogRequestLogging() 调用出现在处理程序(如 MVC)之前。中间件不会对管道中出现在其之前的部分进行计时或记录。(可以利用此功能排除记录,例如 UseStaticFiles(),通过将 UseSerilogRequestLogging() 放在其之后。)

在请求处理过程中,可以使用 IDiagnosticContext.Set() 将附加属性附加到完成事件

    public class HomeController : Controller
    {
        readonly IDiagnosticContext _diagnosticContext;

        public HomeController(IDiagnosticContext diagnosticContext)
        {
            _diagnosticContext = diagnosticContext ??
                throw new ArgumentNullException(nameof(diagnosticContext));
        }

        public IActionResult Index()
        {
            // The request completion event will carry this property
            _diagnosticContext.Set("CatalogLoadTime", 1423);

            return View();
        }

这种模式的优势在于,它减少了每个 HTTP 请求需要构建、传输和存储的日志事件的数量。将多个属性添加到同一事件中也可以使请求细节和其他数据的协同更加容易。

默认情况下,将以下请求信息作为属性添加

  • 请求方法
  • 请求路径
  • 状态码
  • 持续时间

您可以使用UseSerilogRequestLogging()方法上的options回调来修改用于请求完成事件的模板,添加额外的属性或更改事件级别。

app.UseSerilogRequestLogging(options =>
{
    // Customize the message template
    options.MessageTemplate = "Handled {RequestPath}";
    
    // Emit debug-level events instead of the defaults
    options.GetLevel = (httpContext, elapsed, ex) => LogEventLevel.Debug;
    
    // Attach additional properties to the request completion event
    options.EnrichDiagnosticContext = (diagnosticContext, httpContext) =>
    {
        diagnosticContext.Set("RequestHost", httpContext.Request.Host.Value);
        diagnosticContext.Set("RequestScheme", httpContext.Request.Scheme);
    };
});

两阶段初始化

本页顶部示例展示了如何在应用程序启动时立即配置Serilog的方法。这样做的好处是可以捕获并报告在设置ASP.NET Core主机期间抛出的异常。

首先初始化Serilog的缺点是,此时ASP.NET Core主机的服务尚不可用,包括appsettings.json配置和依赖注入。

为了解决这个问题,Serilog支持两阶段初始化。当程序启动时立即配置一个初始的“引导”日志记录器,并在主机加载后替换为完全配置的日志记录器。

要使用这项技术,首先将初始的CreateLogger()调用替换为CreateBootstrapLogger()

using Serilog;
using Serilog.Events;

Log.Logger = new LoggerConfiguration()
    .MinimumLevel.Override("Microsoft", LogEventLevel.Information)
    .Enrich.FromLogContext()
    .WriteTo.Console()
    .CreateBootstrapLogger(); // <-- Change this line!

然后,将一个回调传递给AddSerilog()来创建最终的日志记录器

builder.Services.AddSerilog((services, lc) => lc
    .ReadFrom.Configuration(builder.Configuration)
    .ReadFrom.Services(services)
    .Enrich.FromLogContext()
    .WriteTo.Console());

需要注意的是,最终的日志记录器将**完全替换**引导日志记录器:如果您希望两者都记录到控制台,例如,您需要像示例中那样在两处都指定WriteTo.Console()

消费appsettings.json配置

使用**两阶段初始化**,插入示例中所示的ReadFrom.Configuration(builder.Configuration)调用。JSON配置语法在Serilog.Settings.Configuration的README中有文档说明。

将服务注入到增强器和目的地

使用**两阶段初始化**,插入示例中所示的ReadFrom.Services(services)调用。ReadFrom.Services()调用将使用以下服务的任何已注册实现配置日志记录管道:

  • IDestructuringPolicy
  • ILogEventEnricher
  • ILogEventFilter
  • ILogEventSink
  • LoggingLevelSwitch

JSON输出

Console()Debug()File()目的地都原生支持通过包含的Serilog.Formatting.Compact包的JSON格式输出。

要写入换行符分隔的JSON,请将CompactJsonFormatterRenderedCompactJsonFormatter传递到目的地配置方法。

    .WriteTo.Console(new RenderedCompactJsonFormatter())

写入Azure诊断日志流

Azure诊断日志流从D:\home\LogFiles\文件夹中的任何文件发送事件。要为您的应用程序启用此功能,请在LoggerConfiguration中添加一个文件目的地,并注意设置sharedflushToDiskInterval参数。

Log.Logger = new LoggerConfiguration()
    .MinimumLevel.Debug()
    .MinimumLevel.Override("Microsoft", LogEventLevel.Information)
    .Enrich.FromLogContext()
    .WriteTo.Console()
    // Add this line:
    .WriteTo.File(
       System.IO.Path.Combine(Environment.GetEnvironmentVariable("HOME"), "LogFiles", "Application", "diagnostics.txt"),
       rollingInterval: RollingInterval.Day,
       fileSizeLimitBytes: 10 * 1024 * 1024,
       retainedFileCountLimit: 2,
       rollOnFileSizeLimit: true,
       shared: true,
       flushToDiskInterval: TimeSpan.FromSeconds(1))
    .CreateLogger();

将属性推送到ILogger<T>

如果您想向代码特定部分的全部日志事件添加额外属性,您可以使用以下代码将其添加到Microsoft.Extensions.Logging中的ILogger<T>。要使上述代码生效,请确保您已将.Enrich.FromLogContext()添加到上述示例中指定的.UseSerilog(...)语句。

// Microsoft.Extensions.Logging ILogger<T>
// Yes, it's required to use a dictionary. See https://nblumhardt.com/2016/11/ilogger-beginscope/
using (logger.BeginScope(new Dictionary<string, object>
{
    ["UserId"] = "svrooij",
    ["OperationType"] = "update",
}))
{
   // UserId and OperationType are set for all logging events in these brackets
}

上述代码产生的结果与您在Serilog的LogContext中推送属性的效果相同。更多详细信息可在https://github.com/serilog/serilog/wiki/Enrichment#the-logcontext中找到。

// Serilog LogContext
using (LogContext.PushProperty("UserId", "svrooij"))
using (LogContext.PushProperty("OperationType", "update"))
{
    // UserId and OperationType are set for all logging events in these brackets
}
产品 兼容的和额外的计算目标框架版本。
.NET net5.0 已计算。 net5.0-windows 已计算。 net6.0 兼容。 net6.0-android 已计算。 net6.0-ios 已计算。 net6.0-maccatalyst 已计算。 net6.0-macos 已计算。 net6.0-tvos 已计算。 net6.0-windows 已计算。 net7.0 兼容。 net7.0-android 已计算。 net7.0-ios 已计算。 net7.0-maccatalyst 已计算。 net7.0-macos 已计算。 net7.0-tvos 已计算。 net7.0-windows 已计算。 net8.0 兼容。 net8.0-android 已计算。 net8.0-browser 已计算。 net8.0-ios 已计算。 net8.0-maccatalyst 已计算。 net8.0-macos 已计算。 net8.0-tvos 已计算。 net8.0-windows 已计算。
.NET Core netcoreapp2.0 已计算。 netcoreapp2.1 已计算。 netcoreapp2.2 已计算。 netcoreapp3.0 已计算。 netcoreapp3.1 已计算。
.NET Standard netstandard2.0 兼容。 netstandard2.1 已计算。
.NET Framework net461 已计算。 net462 兼容。 net463 已计算。 net47 已计算。 net471 已计算。 net472 已计算。 net48 已计算。 net481 已计算。
MonoAndroid monoandroid 已计算。
MonoMac monomac 已计算。
MonoTouch monotouch 已计算。
Tizen tizen40 已计算。 tizen60 已计算。
Xamarin.iOS xamarinios 已计算。
Xamarin.Mac xamarinmac 已计算。
Xamarin.TVOS xamarintvos 已计算。
Xamarin.WatchOS xamarinwatchos 已计算。
兼容的目标框架
包含的目标框架(在包中)
了解有关 目标框架.NET Standard 的更多信息。

NuGet 包 (1.3K)

显示依赖于 Serilog.AspNetCore 的前 5 个 NuGet 包

包名 下载
Umbraco.Cms.Web.Common

包含运行 Umbraco CMS 所需的 Web 程序集。

Umbraco.Cms.Web.BackOffice

包含运行Umbraco CMS后端所需的backoffice组件。

Apprio.Enablement.Telemetry.Properties

包描述

Apprio.Enablement.Telemetry

包描述

NET6CustomLibrary

开源自定义dotnet扩展库

GitHub仓库 (287)

显示依赖Serilog.AspNetCore的Top 5热门GitHub仓库

仓库 星标
jellyfin/jellyfin
免费软件媒体系统
ardalis/CleanArchitecture
清洁架构解决方案模板:Clean Architecture的ASP.NET Core入门点
bitwarden/server
Bitwarden基础设施/后端(API、数据库、Docker等)
dotnet/runtime
.NET是一个跨平台运行时,适用于云、移动、桌面和IoT应用。
abpframework/abp
开源的ASP.NET Core Web应用程序框架!提供了一种具有.NET最佳实践的见解架构,用于构建企业级软件解决方案。提供基本基础设施、跨切面实现、启动模板、应用程序模块、UI主题、工具和文档。
版本 下载 最后更新
8.0.2 364,361 7/31/2024
8.0.2-dev-00341 8,758 7/12/2024
8.0.2-dev-00338 90,099 4/5/2024
8.0.2-dev-00336 6,770 3/25/2024
8.0.2-dev-00334 17,130 3/5/2024
8.0.1 18,176,931 1/19/2024
8.0.1-dev-00329 727 1/19/2024
8.0.0 7,433,926 11/15/2023
8.0.0-dev-00323 557 11/15/2023
7.0.1-dev-00320 67,448 10/11/2023
7.0.0 24,237,385 5/11/2023
7.0.0-dev-00315 633 9/27/2023
7.0.0-dev-00314 592 9/27/2023
7.0.0-dev-00304 965 5/11/2023
7.0.0-dev-00302 4,115 5/5/2023
6.1.1-dev-00295 210,525 2/3/2023
6.1.1-dev-00293 122,237 12/19/2022
6.1.0 41,745,340 11/30/2022
6.1.0-dev-00289 26,776 11/28/2022
6.1.0-dev-00285 184,356 9/27/2022
6.1.0-dev-00281 48,803 8/29/2022
6.0.1 30,220,333 7/18/2022
6.0.1-dev-00280 849 8/29/2022
6.0.1-dev-00275 857 7/18/2022
6.0.0 1,409,614 7/14/2022
6.0.0-dev-00270 898 7/14/2022
6.0.0-dev-00265 317,623 3/4/2022
5.0.1-dev-00264 4,123 3/4/2022
5.0.1-dev-00262 11,019 2/24/2022
5.0.0 37,111,487 2/15/2022
5.0.0-dev-00259 32,482 2/8/2022
4.1.1-dev-00250 65,550 1/19/2022
4.1.1-dev-00241 206,059 11/12/2021
4.1.1-dev-00229 461,871 6/2/2021
4.1.1-dev-00227 13,973 5/27/2021
4.1.0 66,932,894 3/29/2021
4.1.0-dev-00223 1,120 3/29/2021
4.0.1-dev-00222 1,208 3/26/2021
4.0.1-dev-00219 15,519 3/17/2021
4.0.0 3,837,917 3/3/2021
4.0.0-dev-00210 1,084 3/3/2021
4.0.0-dev-00208 1,097 3/3/2021
4.0.0-dev-00206 1,303 3/3/2021
4.0.0-dev-00204 1,118 3/2/2021
4.0.0-dev-00202 10,796 2/24/2021
4.0.0-dev-00199 10,674 2/17/2021
4.0.0-dev-00198 11,087 2/17/2021
3.4.1-dev-00188 480,912 10/26/2020
3.4.1-dev-00180 360,551 9/15/2020
3.4.0 38,340,058 7/24/2020
3.4.0-dev-00177 1,236 7/24/2020
3.4.0-dev-00176 1,168 7/24/2020
3.4.0-dev-00174 1,234 7/24/2020
3.4.0-dev-00173 202,606 6/18/2020
3.4.0-dev-00171 45,552 6/3/2020
3.4.0-dev-00168 16,826 5/19/2020
3.4.0-dev-00167 6,668 5/13/2020
3.3.0-dev-00161 35,342 5/1/2020
3.3.0-dev-00160 1,217 5/1/2020
3.3.0-dev-00152 191,274 2/24/2020
3.3.0-dev-00149 65,179 2/19/2020
3.2.1-dev-00147 14,683 2/19/2020
3.2.1-dev-00142 94,202 1/24/2020
3.2.0 41,506,230 11/12/2019
3.2.0-dev-00135 15,735 11/8/2019
3.2.0-dev-00133 3,187 11/6/2019
3.1.1-dev-00132 1,484 11/6/2019
3.1.0 3,425,575 10/14/2019
3.1.0-dev-00122 12,088 10/7/2019
3.1.0-dev-00119 1,392 10/7/2019
3.1.0-dev-00118 1,351 10/7/2019
3.0.1-dev-00116 12,430 10/2/2019
3.0.1-dev-00110 1,325 10/2/2019
3.0.1-dev-00109 27,058 9/25/2019
3.0.1-dev-00099 62,016 9/3/2019
3.0.0 4,180,205 8/28/2019
3.0.0-dev-00093 1,525 8/27/2019
3.0.0-dev-00088 16,943 8/21/2019
3.0.0-dev-00086 1,432 8/21/2019
3.0.0-dev-00083 1,414 8/20/2019
3.0.0-dev-00081 1,376 8/20/2019
3.0.0-dev-00079 1,335 8/20/2019
3.0.0-dev-00077 1,326 8/20/2019
3.0.0-dev-00067 5,601 8/19/2019
3.0.0-dev-00059 43,478 7/19/2019
3.0.0-dev-00058 34,657 6/26/2019
3.0.0-dev-00057 1,393 6/26/2019
3.0.0-dev-00053 4,287 6/25/2019
3.0.0-dev-00052 1,993 6/25/2019
3.0.0-dev-00046 2,504 6/23/2019
3.0.0-dev-00043 12,781 6/5/2019
3.0.0-dev-00041 2,142 6/3/2019
3.0.0-dev-00040 1,583 6/3/2019
2.1.2-dev-00028 188,065 9/22/2018
2.1.2-dev-00026 56,826 7/19/2018
2.1.2-dev-00024 158,567 5/9/2018
2.1.1 27,894,435 3/7/2018
2.1.1-dev-00022 37,654 1/18/2018
2.1.1-dev-00021 18,095 12/17/2017
2.1.1-dev-00017 7,092 12/3/2017
2.1.0 2,464,343 10/22/2017
2.1.0-dev-00012 1,950 10/16/2017
2.0.1-dev-00011 1,748 10/16/2017
2.0.0 441,730 9/5/2017
2.0.0-dev-00002 5,280 8/29/2017
2.0.0-dev-00001 2,581 8/27/2017