首页 > 解决方案 > C# .net-core Web API Serilog:根据属性(即控制器名称)将文件记录到不同的文件夹

问题描述

我们的客户希望将日志文件存储在基于控制器的单独文件夹中。例如,命中 Shipping 控制器的所有日志都将存储在 C:\logs\shipping\ 中,而命中订单控制器的日志将存储在 c:\logs\orders 中,依此类推。下面是我的 ConfigureLoggingServices 方法。我正在使用 Serilog 并写入文件和 Seq。我正在使用中间件来捕获客户端用户和会话 ID(存储在请求标头中)并使用 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();
}

标签: asp.net-core-webapiserilog

解决方案


.WriteTo.Map(
    "Controller",
    "(None)",
    (ctrl, wt) => wt.File($"C:\\Logs\\{ctrl}\\lis_api.log"))

推荐阅读