我的 ASP.NET Core 2.1 应用程序将所有“常用内容”记录到 Serilog 文件接收器 - 即与应用程序相关的内容,例如调试、监控、性能等。
但是,我们还需要将其他数据记录到单独的文件中。与应用程序无关,但与客户相关——这种东西应该进入数据库。然而,由于遗留原因,该系统上没有数据库,因此需要将数据保存到文件中。显然这不能写入同一个日志文件。
我可以写信给FileStream
。但我更喜欢使用 Serilog 进行结构化日志记录。
那么有没有办法同时拥有两个记录器呢?它将不同的数据记录到不同的文件接收器。
(如果是这样,我如何将它们注入到我的类中 - 现在我只是注入ILogger<ClassName>
.)
我设法做到这一点的最简单方法是实现一个新的独特接口,我可以将其传递到 DI 系统以供控制器使用。
注意:在示例中我使用了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 );
...
在控制器中的使用
public class MyTestController : Controller
{
private readonly ICustomLogger _customLogger;
public MyTestController( ICustomLogger customLogger )
{
_customLogger = customLogger;
}
public IActionResult Index()
{
...
_customLogger.Log.Debug( "Serving Index" );
...
}
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)