Serilog 忽略 SourceContext

问题描述 投票:0回答:1

我尝试在 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 ...");
    }
}

有人可以解释一下如何解决这个问题以及问题是什么吗 谢谢你

c# asp.net-core serilog
1个回答
0
投票

作为一个选项,您可以将 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");
    }
}
最新问题
© www.soinside.com 2019 - 2025. All rights reserved.