Serilog MSSQLServer + Email (с пользовательской темой) Мойки - PullRequest
0 голосов
/ 06 апреля 2019

Требуемое состояние:

Следующий код работает ... но в идеале я хотел бы, чтобы все это было настроено в AppSettings в разделе Serilog, но я не смог получить егоработать даже со стандартной строкой темы электронной почты (требование № 3).

Цель / требование:

  1. Для регистрации уровня информации и более высоких журналов в базе данных SQL,
  2. Кроме того, если уровень журнала Fatal / Critical, мне также необходимо зарегистрировать его в электронной почте.
  3. В строке темы электронного письма также должна быть указана среда, в которой отправляется электронное письмо (например, DEV / Staging / Production)

Уточнение:

Я создал два отдельных приложения ASP NET Core 2.2 для следующих двух разных попыток.

Текущая рабочая реализация:

~ / AppSettings. {Среда} .json

...
  "SqlLogger": {
    "ConnectionString": <connStr>,
    "SchemaName" : "Log"
    "TableName": <tableName>
  },
 "EmailLogger": {
    "FromEmail": <email>,
    "ToEmail": <email>,
    "MailServer": <server>,
    "Subject": "Fatal Error in the App"
  },
...

~ / Models / EmailLoggerSettings.cs

public class EmailLoggerSettings
{
    public string FromEmail { get; set; }
    public string ToEmail { get; set; }
    public string MailServer { get; set; }
    public string Subject { get; set; }
}

~ / Models / SqlLoggerSettings.cs

public class SqlLoggerSettings
{
    public string ConnectionString { get; set; }
    public string SchemaName { get; set; }
    public string TableName { get; set; }
}

~ / Program.cs

public static IWebHostBuilder CreateWebHostBuilder(string[] args) =>
    WebHost.CreateDefaultBuilder(args)
        .ConfigureAppConfiguration((builderContext, config) =>
        {
            var environment = builderContext.HostingEnvironment;
            config
                .SetBasePath(environment.ContentRootPath)
                .AddJsonFile(path: "appsettings.json", optional: false, reloadOnChange: true)
                .AddJsonFile(path: $"appsettings.{environment.EnvironmentName}.json", optional: true, reloadOnChange: true)
                .AddEnvironmentVariables();
            }
        )
        .UseIIS()
        .UseIISIntegration()
        .UseStartup<Startup>();

~ / Startup.cs

public void ConfigureServices(IServiceCollection services)
{
    services.Configure<AppSettings>(Configuration.GetSection("ApplicationSettings"));
    services.Configure<EmailLoggerSettings>(Configuration.GetSection("EmailLogger"));
    services.Configure<SqlLoggerSettings>(Configuration.GetSection("SqlLogger"));
    ...
}
public void Configure(IApplicationBuilder app, IHostingEnvironment env, ILoggerFactory loggerFactory, IOptions<EmailLoggerSettings> emailLoggerSettings, IOptions<SqlLoggerSettings> sqlLoggerSettings)
{
    Log.Logger = new LoggerConfiguration()
        .MinimumLevel.Verbose()
                .WriteTo.MSSqlServer(
                        connectionString: sqlLoggerSettings.Value.ConnectionString, 
                        schemaName: "dbo",
                        tableName: sqlLoggerSettings.Value.TableName, 
                        columnOptions: new ColumnOptions(), 
                        restrictedToMinimumLevel: LogEventLevel.Information
                    )
            .MinimumLevel.Verbose()
                .WriteTo.Email(
                        fromEmail: emailLoggerSettings.Value.FromEmail,
                        toEmail: emailLoggerSettings.Value.ToEmail,
                        mailServer: emailLoggerSettings.Value.MailServer,
                        mailSubject: $"[{System.Environment.MachineName}] {emailLoggerSettings.Value.Subject}",
                        restrictedToMinimumLevel: LogEventLevel.Fatal
                    )
            .CreateLogger();



        loggerFactory.AddSerilog();


        //Serilog.Debugging.SelfLog.Enable(msg =>
        //{
        //    Debug.Print(msg);
        //    Debugger.Break();
        //});

        Serilog.Log.Information("Host starting ...");
        ...
    }

Приложение Настройка на основе конфигурации (не работает)

~ / AppSettings. {Environment} .json

  "Serilog": {
    "MinimumLevel": "Information",
    "WriteTo": [
      {
        "Name": "MSSqlServer",
        "Args": {
          "connectionString": "<connStr>",
          "schemaName" : "Log"
          "tableName": <tableName>

        }
      },
      {
        "Name": "Email",
        "Args": {
          "restrictedToMinimumLevel": "Fatal"
        }
      }
    ]
  },

~ / Program.cs

public class Program
{
    public static IConfiguration Configuration = new ConfigurationBuilder()
                    .SetBasePath(Directory.GetCurrentDirectory())
                    .AddJsonFile(path: "appsettings.json", optional: false, reloadOnChange: true)
                    .AddJsonFile(path: $"appsettings.{Environment.GetEnvironmentVariable("ASPNETCORE_ENVIRONMENT") ?? "Production"}.json", optional: true, reloadOnChange: true)
                    .Build();
    public static void Main(string[] args)
    {
        Log.Logger = new LoggerConfiguration()
            .ReadFrom.Configuration(Configuration)
            .CreateLogger();

         CreateWebHostBuilder(args).Build().Run();
...

~ / Startup.cs

public void Configure(IApplicationBuilder app, IHostingEnvironment env, ILoggerFactory loggerFactory)
{
     loggerFactory.AddSerilog();

     //Serilog.Debugging.SelfLog.Enable(msg =>
     //{
     //    Debug.Print(msg);
     //    Debugger.Break();
     //});
...
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...