C# .net-core Web API Serilog:根据属性(即控制器名称)将文件记录到不同的文件夹
C# .net-core Web API Serilog: log files to different folders based on property (i.e. controller name)
我们的客户希望根据控制器将日志文件存储在单独的文件夹中。例如,所有命中 Shipping 控制器的日志将存储在 C:\logs\shipping\ 而那些命中订单控制器的日志将存储在 c:\logs\orders 中,依此类推。下面是我的 ConfigureLoggingServices 方法。我正在使用 Serilog 并写入文件和 Seq。我正在使用中间件来捕获客户端用户和 session ID(存储在请求 header 中)并使用 LogContext.PushProperty() 将这些值推送到日志条目。我不知何故需要将控制器的名称注入到日志文件的路径中。这可能吗?谢谢
private void ConfigureLoggingServices()
{
var appName = Configuration.GetValue<string>("Logging:AppName", string.Empty);
var SeqURL = Configuration.GetValue<string>("Logging:SeqURL", string.Empty);
var pool = Environment.UserName;
//string logFile = "C:\Logs\" + {Controller} + "\lis_api.log";
string logFile = "C:\Logs\lis_api.log";
const string customTemplate = "[{LIS_User} {Timestamp:HH:mm:ss.fff} {Level:u3} {SessionID}] {RequestMethod} {RequestPath} {Message:lj}{NewLine}{Exception}";
var name = Assembly.GetExecutingAssembly().GetName();
Log.Logger = new LoggerConfiguration()
.MinimumLevel.Debug()
.MinimumLevel.Override("Microsoft", LogEventLevel.Warning)
.MinimumLevel.Override("System", LogEventLevel.Warning)
.Enrich.FromLogContext()
.Enrich.WithMachineName()
.Enrich.WithProperty("Application", appName)
.Enrich.WithProperty("Version", $"{name.Version}")
.Enrich.WithProperty("AppPool", pool)
.Destructure.ByTransforming<User>(x => new { x.ID, x.Name, x.Controller })
// File Sink - Async
.WriteTo.Async(a => a.
File(string.Format(string.Format(logFile)),
rollingInterval: RollingInterval.Day,
outputTemplate: customTemplate,
fileSizeLimitBytes: 40000000,
shared: true,
retainedFileCountLimit: 50,
rollOnFileSizeLimit: true))
.WriteTo.Seq(SeqURL)
.CreateLogger();
LoggerFactory = CreateLoggerFactory();
}
.WriteTo.Map(
"Controller",
"(None)",
(ctrl, wt) => wt.File($"C:\Logs\{ctrl}\lis_api.log"))
我们的客户希望根据控制器将日志文件存储在单独的文件夹中。例如,所有命中 Shipping 控制器的日志将存储在 C:\logs\shipping\ 而那些命中订单控制器的日志将存储在 c:\logs\orders 中,依此类推。下面是我的 ConfigureLoggingServices 方法。我正在使用 Serilog 并写入文件和 Seq。我正在使用中间件来捕获客户端用户和 session ID(存储在请求 header 中)并使用 LogContext.PushProperty() 将这些值推送到日志条目。我不知何故需要将控制器的名称注入到日志文件的路径中。这可能吗?谢谢
private void ConfigureLoggingServices()
{
var appName = Configuration.GetValue<string>("Logging:AppName", string.Empty);
var SeqURL = Configuration.GetValue<string>("Logging:SeqURL", string.Empty);
var pool = Environment.UserName;
//string logFile = "C:\Logs\" + {Controller} + "\lis_api.log";
string logFile = "C:\Logs\lis_api.log";
const string customTemplate = "[{LIS_User} {Timestamp:HH:mm:ss.fff} {Level:u3} {SessionID}] {RequestMethod} {RequestPath} {Message:lj}{NewLine}{Exception}";
var name = Assembly.GetExecutingAssembly().GetName();
Log.Logger = new LoggerConfiguration()
.MinimumLevel.Debug()
.MinimumLevel.Override("Microsoft", LogEventLevel.Warning)
.MinimumLevel.Override("System", LogEventLevel.Warning)
.Enrich.FromLogContext()
.Enrich.WithMachineName()
.Enrich.WithProperty("Application", appName)
.Enrich.WithProperty("Version", $"{name.Version}")
.Enrich.WithProperty("AppPool", pool)
.Destructure.ByTransforming<User>(x => new { x.ID, x.Name, x.Controller })
// File Sink - Async
.WriteTo.Async(a => a.
File(string.Format(string.Format(logFile)),
rollingInterval: RollingInterval.Day,
outputTemplate: customTemplate,
fileSizeLimitBytes: 40000000,
shared: true,
retainedFileCountLimit: 50,
rollOnFileSizeLimit: true))
.WriteTo.Seq(SeqURL)
.CreateLogger();
LoggerFactory = CreateLoggerFactory();
}
.WriteTo.Map(
"Controller",
"(None)",
(ctrl, wt) => wt.File($"C:\Logs\{ctrl}\lis_api.log"))