c# - 我可以使用 Serilog 登录到单独的文件吗?

标签 c# asp.net-core serilog

我的 ASP.NET Core 2.1 应用程序将所有“常用内容”记录到 Serilog 文件接收器 - 即与应用程序相关的内容,例如调试、监控、性能等。

但是我们还需要将其他数据记录到一个单独的文件中。与应用程序无关,但与客户相关 - 应该进入数据库的那种东西。但是,由于遗留原因,此系统上没有数据库,因此需要将数据保存到文件中。显然这不能写入同一个日志文件。

我可以写信给 FileStream .但我更喜欢使用 Serilog 进行结构化日志记录。

那么有没有办法同时拥有两个记录器呢?将不同的数据记录到不同的文件接收器。

(如果是这样,我如何将它们注入(inject)我的类 - 现在我只是注入(inject) ILogger<ClassName> 。)

最佳答案

我设法做到这一点的最简单方法是实现一个新的独特接口(interface),我可以将其传递给 DI 系统以供 Controller 使用。
注意:在示例中,我使用了 Serilog.Sinks.RollingFile NuGet 包。使用您认为合适的任何其他水槽。我使用的是 asp.net Core 2.1。

新界面

using Serilog;
using Serilog.Core;

public interface ICustomLogger
{
    ILogger Log { get; }
}

public class CustomLogger : ICustomLogger
{
    private readonly Logger _logger;

    public ILogger Log { get { return _logger; } }

    public CustomLogger( Logger logger )
    {
        _logger = logger;
    }
}

Startup.cs 中的实现(.Net 6 之前)

using Serilog;
...
public void ConfigureServices( IServiceCollection services )
{
    ...

    ICustomLogger customLogger = new CustomLogger( new LoggerConfiguration()
        .MinimumLevel.Debug()
        .WriteTo.RollingFile( @"Logs\CustomLog.{Date}.log", retainedFileCountLimit: 7 )
        .CreateLogger() );
    services.AddSingleton( customLogger );
     
    ...
}

Program.cs (.Net 6) 中的实现

using Serilog;
...

... 
ICustomLogger customLogger = new CustomLogger( new LoggerConfiguration()
    .MinimumLevel.Debug()
    .WriteTo.RollingFile( @"Logs\CustomLog.{Date}.log", retainedFileCountLimit: 7 )
    .CreateLogger() );
builder.Services.AddSingleton( customLogger );
     
...

在 Controller 中的使用

public class MyTestController : Controller
{
    private readonly ICustomLogger _customLogger;

    public MyTestController( ICustomLogger customLogger )
    {
        _customLogger = customLogger;
    }

    public IActionResult Index()
    {
        ...
        _customLogger.Log.Debug( "Serving Index" );
        ...
    }
}

关于c# - 我可以使用 Serilog 登录到单独的文件吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51213779/

相关文章:

c# - 如何将缩进的文本转换为一行 xml 字符串?

C# XmlDocument SelectNodes

migration - 在应用程序启动时使用Entity Framework核心运行数据库迁移

javascript - 如何在 JQuery 中制作通用切换功能?

c# - 如何在多个类中使用带有 Serilog 的同一个日志文件

c# - 在网页中嵌入 .Net C#?

c# - 在使用 C# 安装服务后传递命令行参数

asp.net-core - 从命令行使用开发环境的 dotnet run 或 dotnet watch?

c# - 程序类中的 Serilog

c# - 向 Microsoft "ILogger"LogDebug 消息添加额外的元数据?