admin管理员组

文章数量:1035913

Serilog.AspNetCore&Serilog.Sinks.Async:提升 ASP.NET Core 日志性能实践

Serilog.AspNetCore 是一个用于 ASP.NET Core 应用程序的日志库,它允许将日志消息通过 Serilog 路由,从而实现灵活的日志记录功能。

一、安装必要的 NuGet 包

第一步,老规矩,安装Nuget包

代码语言:javascript代码运行次数:0运行复制
dotnet add package Serilog.AspNetCore
dotnet add package Serilog.Sinks.Console
dotnet add package Serilog.Sinks.File

二、配置 Serilog

1. 在 Program.cs 中配置 Serilog

Program.cs 文件中,配置 Serilog 的日志记录器,并将其集成到 ASP.NET Core 的日志系统中:

代码语言:javascript代码运行次数:0运行复制
using Serilog;

Log.Logger = new LoggerConfiguration()
    .MinimumLevel.Information() // 设置日志的最低级别
    .WriteTo.Console() // 输出到控制台
    .WriteTo.File("logs/myapp.log", rollingInterval: RollingInterval.Day) // 输出到文件
    .CreateLogger();

try
{
    Log.Information("Starting web application");
    var builder = WebApplication.CreateBuilder(args);
    builder.Host.UseSerilog(); // 集成 Serilog 到主机
    var app = builder.Build();

    //记录每个请求的摘要信息
    app.UseSerilogRequestLogging(); // 添加请求日志中间件
    app.MapGet("/", () => "Hello World!");
    app.Run();
}
catch (Exception ex)
{
    Log.Fatal(ex, "Application terminated unexpectedly");
}
finally
{
    //移除默认日志记录器,关闭应用程序时清理资源
    Log.CloseAndFlush();
}

UseSerilogRequestLogging,可以记录每个请求的摘要信息

三、使用 Serilog 记录日志

1. 使用 ILogger<T> 接口

在控制器或服务中注入 ILogger<T> 并记录日志:

代码语言:javascript代码运行次数:0运行复制
public classHomeController : Controller
{
    privatereadonly ILogger<HomeController> _logger;

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

    public IActionResult Index()
    {
        _logger.LogInformation("Hello World!");
        return View();
    }
}
2. 使用 Serilog 的静态 Log

直接使用 Serilog 的静态方法记录日志:

代码语言:javascript代码运行次数:0运行复制
Log.Information("This is an information message.");
Log.Error("This is an error message.");

四、异步日志处理(Serilog.Sinks.Async)

Serilog.Sinks.Async 用于 Serilog 的异步日志处理扩展,通过将日志写入操作委托给后台线程,减少日志调用对主线程的阻塞,从而提高应用程序的性能。

适用场景

  • 高并发的日志记录场景
  • 对性能要求较高的应用程序
  • 日志存储可能受 I/O 瓶颈影响的场景(如文件日志)
  1. 1. 安装 Serilog.Sinks.Async
代码语言:javascript代码运行次数:0运行复制
dotnet add package Serilog.Sinks.Async
  1. 2. 在 Serilog 的配置中,使用 WriteTo.Async 包装目标 Sink,使其运行在后台线程中。
代码语言:javascript代码运行次数:0运行复制
using Serilog;

Log.Logger = new LoggerConfiguration()
    .WriteTo.Async(a => a.File("logs/myapp.log", rollingInterval: RollingInterval.Day))
    .CreateLogger();
  1. 3. 配置缓冲区和丢弃行为

默认情况下,异步 Sink 的内存缓冲区大小为 10,000 条日志事件。如果缓冲区已满,后续的日志事件将被丢弃。可以通过 bufferSize 参数调整缓冲区大小:

代码语言:javascript代码运行次数:0运行复制
.WriteTo.Async(a => a.File("logs/myapp.log"), bufferSize: 500)

如果需要在缓冲区满时阻塞主线程,可以设置 blockWhenFull 参数为 true

代码语言:javascript代码运行次数:0运行复制
.WriteTo.Async(a => a.File("logs/myapp.log"), blockWhenFull: true)
  1. 4. 监控日志缓冲区状态

Serilog.Sinks.Async 提供了 IAsyncLogEventSinkInspector 接口,用于监控缓冲区的使用情况。如,可以通过以下代码检查缓冲区是否接近满载:

代码语言:javascript代码运行次数:0运行复制
void ExecuteAsyncBufferCheck(IAsyncLogEventSinkInspector inspector)
{
    var usagePct = inspector.Count * 100 / inspector.BufferSize;
    if (usagePct > 50) 
        SelfLog.WriteLine("Log buffer exceeded {0:p0} usage (limit: {1})", usagePct, inspector.BufferSize);
}
本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。原始发表:2025-03-17,如有侵权请联系 cloudcommunity@tencent 删除serilog日志实践性能core

Serilog.AspNetCore&amp;Serilog.Sinks.Async:提升 ASP.NET Core 日志性能实践

Serilog.AspNetCore 是一个用于 ASP.NET Core 应用程序的日志库,它允许将日志消息通过 Serilog 路由,从而实现灵活的日志记录功能。

一、安装必要的 NuGet 包

第一步,老规矩,安装Nuget包

代码语言:javascript代码运行次数:0运行复制
dotnet add package Serilog.AspNetCore
dotnet add package Serilog.Sinks.Console
dotnet add package Serilog.Sinks.File

二、配置 Serilog

1. 在 Program.cs 中配置 Serilog

Program.cs 文件中,配置 Serilog 的日志记录器,并将其集成到 ASP.NET Core 的日志系统中:

代码语言:javascript代码运行次数:0运行复制
using Serilog;

Log.Logger = new LoggerConfiguration()
    .MinimumLevel.Information() // 设置日志的最低级别
    .WriteTo.Console() // 输出到控制台
    .WriteTo.File("logs/myapp.log", rollingInterval: RollingInterval.Day) // 输出到文件
    .CreateLogger();

try
{
    Log.Information("Starting web application");
    var builder = WebApplication.CreateBuilder(args);
    builder.Host.UseSerilog(); // 集成 Serilog 到主机
    var app = builder.Build();

    //记录每个请求的摘要信息
    app.UseSerilogRequestLogging(); // 添加请求日志中间件
    app.MapGet("/", () => "Hello World!");
    app.Run();
}
catch (Exception ex)
{
    Log.Fatal(ex, "Application terminated unexpectedly");
}
finally
{
    //移除默认日志记录器,关闭应用程序时清理资源
    Log.CloseAndFlush();
}

UseSerilogRequestLogging,可以记录每个请求的摘要信息

三、使用 Serilog 记录日志

1. 使用 ILogger<T> 接口

在控制器或服务中注入 ILogger<T> 并记录日志:

代码语言:javascript代码运行次数:0运行复制
public classHomeController : Controller
{
    privatereadonly ILogger<HomeController> _logger;

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

    public IActionResult Index()
    {
        _logger.LogInformation("Hello World!");
        return View();
    }
}
2. 使用 Serilog 的静态 Log

直接使用 Serilog 的静态方法记录日志:

代码语言:javascript代码运行次数:0运行复制
Log.Information("This is an information message.");
Log.Error("This is an error message.");

四、异步日志处理(Serilog.Sinks.Async)

Serilog.Sinks.Async 用于 Serilog 的异步日志处理扩展,通过将日志写入操作委托给后台线程,减少日志调用对主线程的阻塞,从而提高应用程序的性能。

适用场景

  • 高并发的日志记录场景
  • 对性能要求较高的应用程序
  • 日志存储可能受 I/O 瓶颈影响的场景(如文件日志)
  1. 1. 安装 Serilog.Sinks.Async
代码语言:javascript代码运行次数:0运行复制
dotnet add package Serilog.Sinks.Async
  1. 2. 在 Serilog 的配置中,使用 WriteTo.Async 包装目标 Sink,使其运行在后台线程中。
代码语言:javascript代码运行次数:0运行复制
using Serilog;

Log.Logger = new LoggerConfiguration()
    .WriteTo.Async(a => a.File("logs/myapp.log", rollingInterval: RollingInterval.Day))
    .CreateLogger();
  1. 3. 配置缓冲区和丢弃行为

默认情况下,异步 Sink 的内存缓冲区大小为 10,000 条日志事件。如果缓冲区已满,后续的日志事件将被丢弃。可以通过 bufferSize 参数调整缓冲区大小:

代码语言:javascript代码运行次数:0运行复制
.WriteTo.Async(a => a.File("logs/myapp.log"), bufferSize: 500)

如果需要在缓冲区满时阻塞主线程,可以设置 blockWhenFull 参数为 true

代码语言:javascript代码运行次数:0运行复制
.WriteTo.Async(a => a.File("logs/myapp.log"), blockWhenFull: true)
  1. 4. 监控日志缓冲区状态

Serilog.Sinks.Async 提供了 IAsyncLogEventSinkInspector 接口,用于监控缓冲区的使用情况。如,可以通过以下代码检查缓冲区是否接近满载:

代码语言:javascript代码运行次数:0运行复制
void ExecuteAsyncBufferCheck(IAsyncLogEventSinkInspector inspector)
{
    var usagePct = inspector.Count * 100 / inspector.BufferSize;
    if (usagePct > 50) 
        SelfLog.WriteLine("Log buffer exceeded {0:p0} usage (limit: {1})", usagePct, inspector.BufferSize);
}
本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。原始发表:2025-03-17,如有侵权请联系 cloudcommunity@tencent 删除serilog日志实践性能core

本文标签: SerilogAspNetCoreampampSerilogSinksAsync提升 ASPNET Core 日志性能实践