C#. net -core Web API Serilog: файлы журналов для разных папок на основе свойства (то есть имя контроллера) - PullRequest
1 голос
/ 27 марта 2020

Наш клиент хочет, чтобы файлы журналов хранились в отдельных папках на основе контроллера. Например, все журналы, попавшие в контроллер доставки, будут храниться в C: \ logs \ shipping \, а журналы, попавшие в контроллер заказов, будут в c: \ logs \ orders и т. Д. Ниже мой метод ConfigureLoggingServices. Я использую Serilog и пишу в файл и в Seq. Я использую промежуточное программное обеспечение для захвата пользователя клиента и идентификатора сеанса (хранится в заголовке запроса) и помещаю эти значения в запись журнала с помощью 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();
}

1 Ответ

0 голосов
/ 01 апреля 2020
.WriteTo.Map(
    "Controller",
    "(None)",
    (ctrl, wt) => wt.File($"C:\\Logs\\{ctrl}\\lis_api.log"))
...