我的 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/