我尝试在 ASP Net Core 应用程序中使用 Serilog 实现不同的日志文件,但这似乎被忽略,两个记录器都写入这两个文件。
应用程序设置:
"Serilog": {
"Using": [ "Serilog.Sinks.Console", "Serilog.Sinks.File" ],
"MinimumLevel": {
"Default": "Information",
"Override": {
"TCP": "Information",
"REST": "Information"
}
},
"WriteTo": [
{
"Name": "File",
"Args": {
"path": "C:\\path\\TCP.log",
"rollingInterval": "Infinite",
"fileSizeLimitBytes": 1073741824, //1GB
"restrictedToMinimumLevel": "Information"
}
},
{
"Name": "File",
"Args": {
"path": "C:\\path\\REST.log",
"rollingInterval": "Infinite",
"fileSizeLimitBytes": 1073741824, //1GB
"restrictedToMinimumLevel": "Information"
}
}
],
"Enrich": [ "FromLogContext", "WithMachineName", "WithProcessId" ]
},
程序.cs
builder.Host.UseSerilog((context, services, configuration) => configuration
.ReadFrom.Configuration(context.Configuration)
.Enrich.FromLogContext()
.Enrich.WithMachineName()
.Enrich.WithProcessId()
);
休息控制器:
public class Controller : ControllerBase
{
private readonly Serilog.ILogger _rest_logger;
public Controller ()
{
_rest_logger = Log.ForContext("SourceContext", "REST");
_rest_logger.Information("Test in Controller");
}
}
TCP 服务器:
public class TCPServer : IHostedService, IDisposable
{
private readonly Serilog.ILogger _tcp_logger;
public TCPServer()
{
_tcp_logger = Log.ForContext("SourceContext","TCP");
_tcp_logger.Information("TCP Server starting ...");
}
}
有人可以解释一下如何解决这个问题以及问题是什么吗 谢谢你
作为一个选项,您可以将 serilog 配置分成不同的块:
"RestLogger": {
"Using": [ "Serilog.Sinks.Console", "Serilog.Sinks.File" ],
"MinimumLevel": {
"Default": "Information",
"Override": {
"REST": "Information"
}
},
"WriteTo": [
{
"Name": "File",
"Args": {
"path": "C:\\path\\REST.log",
"rollingInterval": "Infinite",
"fileSizeLimitBytes": 1073741824, //1GB
"restrictedToMinimumLevel": "Information"
}
}
],
"Enrich": [ "FromLogContext", "WithMachineName", "WithProcessId" ]
},
"TcpLogger": {
"Using": [ "Serilog.Sinks.Console", "Serilog.Sinks.File" ],
"MinimumLevel": {
"Default": "Information",
"Override": {
"TCP": "Information",
}
},
"WriteTo": [
{
"Name": "File",
"Args": {
"path": "C:\\path\\TCP.log",
"rollingInterval": "Infinite",
"fileSizeLimitBytes": 1073741824, //1GB
"restrictedToMinimumLevel": "Information"
}
}
],
"Enrich": [ "FromLogContext", "WithMachineName", "WithProcessId" ]
}
然后,如果您希望每种类型都有特定的记录器,则为记录器创建包装器:
public interface ICustomLogger
{
ILogger Log { get; }
}
public interface ITcpLogger : ICustomLogger
{
}
public interface IRestLogger : ICustomLogger
{
}
public class RestLogger : IRestLogger
{
private readonly Logger _logger;
public ILogger Log { get { return _logger; } }
public RestLogger(Logger logger)
{
_logger = logger;
}
}
public class TcpLogger : ITcpLogger
{
private readonly Logger _logger;
public ILogger Log { get { return _logger; } }
public TcpLogger(Logger logger)
{
_logger = logger;
}
}
因此,它允许您在
Program.cs
中配置记录器:
...
ITcpLogger tcpLogger = new TcpLogger(new LoggerConfiguration()
.ReadFrom.Configuration(builder.Configuration, "TcpLogger")
.CreateLogger());
builder.Services.AddSingleton(tcpLogger);
IRestLogger restLogger = new RestLogger(new LoggerConfiguration()
.ReadFrom.Configuration(builder.Configuration, "RestLogger")
.CreateLogger());
builder.Services.AddSingleton(restLogger);
...
那么您的控制器用法就很简单:
public class WeatherForecastController : ControllerBase
{
private readonly IRestLogger _restLogger;
public WeatherForecastController(IRestLogger restLogger)
{
_restLogger = restLogger;
_restLogger.Log.Information("Rest");
}
}