Рейтинговые книги
Читем онлайн Язык программирования C#9 и платформа .NET5 - Эндрю Троелсен

Шрифт:

-
+

Интервал:

-
+

Закладка:

Сделать
1 ... 378 379 380 381 382 383 384 385 386 ... 407
class="p1">  [CallerLineNumber] int sourceLineNumber = 0)

{

  var list = PushProperties(memberName, sourceFilePath, sourceLineNumber);

  _logger.LogDebug(message);

  foreach (var item in list)

  {

    item.Dispose();

  }

}

public void LogAppTrace(string message,

  [CallerMemberName] string memberName = "",

  [CallerFilePath] string sourceFilePath = "",

  [CallerLineNumber] int sourceLineNumber = 0)

{

  var list = PushProperties(memberName, sourceFilePath, sourceLineNumber);

  _logger.LogTrace(message);

  foreach (var item in list)

  {

    item.Dispose();

  }

}

public void LogAppInformation(string message,

  [CallerMemberName] string memberName = "",

  [CallerFilePath] string sourceFilePath = "",

  [CallerLineNumber] int sourceLineNumber = 0)

{

  var list = PushProperties(memberName, sourceFilePath, sourceLineNumber);

  _logger.LogInformation(message);

  foreach (var item in list)

  {

    item.Dispose();

  }

}

public void LogAppWarning(string message,

  [CallerMemberName] string memberName = "",

  [CallerFilePath] string sourceFilePath = "",

  [CallerLineNumber] int sourceLineNumber = 0)

{

  var list = PushProperties(memberName, sourceFilePath, sourceLineNumber);

  _logger.LogWarning(message);

  foreach (var item in list)

  {

    item.Dispose();

  }

}

Конфигурация ведения журнала

Начните с замены стандартного средства ведения журнала инфраструктурой Serilog, добавив новый класс по имени LoggingConfiguration в каталог Logging проекта AutoLot.Services. Модифицируйте операторы using и сделайте класс открытым и статическим:

using System;

using System.Collections.Generic;

using System.Data;

using Microsoft.Extensions.Configuration;

using Microsoft.Extensions.Hosting;

using Microsoft.Extensions.Logging;

using Serilog;

using Serilog.Events;

using Serilog.Sinks.MSSqlServer;

namespace AutoLot.Services.Logging

{

  public static class LoggingConfiguration

  {

  }

}

Для записи в различные целевые объекты для ведения журналов инфраструктура Serilog использует приемники (sink). Целевыми объектами, которые будут применяться для ведения журнала в приложениях ASP.NET Core, являются текстовый файл, база данных и консоль. Приемники типа текстового файла и базы данных требуют конфигурации — выходного шаблона для текстового файла и списка полей для базы данных. Чтобы настроить выходной шаблон, создайте следующее статическое строковое поле, допускающее только чтение:

private static readonly string OutputTemplate =

   @"[{TimeStamp:yy-MM-dd HH:mm:ss} {Level}]{ApplicationName}:

{SourceContext}{NewLine} Message:{Message}{NewLine}in method

{MemberName} at {FilePath}:{LineNumber}{NewLine} {Exception}{NewLine}";

Приемник SQL Server нуждается в списке столбцов, идентифицированных с использованием типа SqlColumn. Добавьте показанный далее код для конфигурирования столбцов базы данных:

private static readonly ColumnOptions ColumnOptions = new ColumnOptions

{

  AdditionalColumns = new List<SqlColumn>

  {

    new SqlColumn {DataType = SqlDbType.VarChar, ColumnName = "ApplicationName"},

    new SqlColumn {DataType = SqlDbType.VarChar, ColumnName = "MachineName"},

    new SqlColumn {DataType = SqlDbType.VarChar, ColumnName = "MemberName"},

    new SqlColumn {DataType = SqlDbType.VarChar, ColumnName = "FilePath"},

    new SqlColumn {DataType = SqlDbType.Int, ColumnName = "LineNumber"},

    new SqlColumn {DataType = SqlDbType.VarChar, ColumnName = "SourceContext"},

    new SqlColumn {DataType = SqlDbType.VarChar, ColumnName = "RequestPath"},

    new SqlColumn {DataType = SqlDbType.VarChar, ColumnName = "ActionName"},

  }

};

Замена стандартного средства ведения журнала вариантом Serilog представляет собой процесс из трех шагов. Первый шаг — очистка существующего поставщика, второй — добавление Serilog в HostBuildern третий — завершение конфигурирования Serilog. Добавьте новый метод по имени ConfigureSerilog(), который является расширяющим методом для IHostBuilder:

public static IHostBuilder ConfigureSerilog(this IHostBuilder builder)

{

  builder

    .ConfigureLogging((context, logging) => { logging.ClearProviders(); })

    .UseSerilog((hostingContext, loggerConfiguration) =>

  {

    var config = hostingContext.Configuration;

    var connectionString = config.GetConnectionString("AutoLot").ToString();

    var tableName = config["Logging:MSSqlServer:tableName"].ToString();

    var schema = config["Logging:MSSqlServer:schema"].ToString();

    string restrictedToMinimumLevel =

      config["Logging:MSSqlServer:restrictedToMinimumLevel"].ToString();

    if (!Enum.TryParse<LogEventLevel>(restrictedToMinimumLevel, out var logLevel))

    {

      logLevel = LogEventLevel.Debug;

    }

     LogEventLevel level = (LogEventLevel)Enum.Parse(typeof(LogEventLevel),

                            restrictedToMinimumLevel);

    var sqlOptions = new MSSqlServerSinkOptions

   {

      AutoCreateSqlTable = false,

      SchemaName = schema,

      TableName = tableName,

    };

    if (hostingContext.HostingEnvironment.IsDevelopment())

    {

      sqlOptions.BatchPeriod = new TimeSpan(0, 0, 0, 1);

      sqlOptions.BatchPostingLimit = 1;

    }

    loggerConfiguration

      .Enrich.FromLogContext()

      .Enrich.WithMachineName()

      .WriteTo.File(

        path: "ErrorLog.txt",

        rollingInterval: RollingInterval.Day,

        restrictedToMinimumLevel: logLevel,

        outputTemplate: OutputTemplate)

      .WriteTo.Console(restrictedToMinimumLevel: logLevel)

      .WriteTo.MSSqlServer(

        connectionString: connectionString,

        sqlOptions,

        restrictedToMinimumLevel: level,

        columnOptions: ColumnOptions);

  });

  return builder;

}

Теперь, когда все готово, пора заменить стандартное средство ведения журнала на Serilog.

Обновление настроек приложения

Раздел Logging во всех файлах настроек приложения (appsettings.json, appsettings.development.json и appsettings.production) для проектов AutoLot.Api и AutoLot.Dal потребуется модифицировать с учетом новой информации о ведении журнала и добавить имя приложения.

Откройте файлы appsettings.json и обновите размертку JSON, как показано ниже; удостоверьтесь в том, что применяете корректное имя проекта в узле ApplicationName и указываете строку подключения, соответствующую вашей системе:

// appsettings.json

{

  "Logging": {

    "MSSqlServer": {

      "schema": "Logging",

      "tableName": "SeriLogs",

      "restrictedToMinimumLevel": "Warning"

    }

  },

  "ApplicationName": "AutoLot.Api",

  "AllowedHosts": "*"

}

// appsettings.development.json

{

  "Logging": {

    "MSSqlServer": {

      "schema": "Logging",

      "tableName": "SeriLogs",

      "restrictedToMinimumLevel": "Warning"

    }

  },

  "RebuildDataBase": false,

  "ApplicationName": "AutoLot.Api - Dev",

  "ConnectionStrings": {

    "AutoLot": "Server=.,5433;Database=AutoLot;User ID=sa;Password=P@ssw0rd;"

  }

}

// appsettings.production.json

{

  "Logging": {

    "MSSqlServer": {

      "schema": "Logging",

      "tableName": "SeriLogs",

      "restrictedToMinimumLevel": "Warning"

    }

  },

  "RebuildDataBase": false,

  "ApplicationName": "AutoLot.Api - Prod",

  "ConnectionStrings": {

    "AutoLot": "It's

1 ... 378 379 380 381 382 383 384 385 386 ... 407
На этой странице вы можете бесплатно читать книгу Язык программирования C#9 и платформа .NET5 - Эндрю Троелсен бесплатно.

Оставить комментарий