繁体   English   中英

.net Core 和 Serilog 电子邮件接收器 - json 配置

[英].net Core and Serilog Email sink - json config

我正在使用 .net Core 2.0 和 Serilog 电子邮件接收器。 我在使用appsettings.json配置电子邮件接收器时appsettings.json 来自program.cs的相同配置正在工作,而来自appsetting.json则没有。

这是来自 appsettings.json 的代码

这是来自 program.cs 的代码

设置系统 ( ReadFrom.Configuration() ) 实际上只是尝试调用它可以发现和传递配置文件提供的参数的方法和扩展方法

不幸的是,它暂时只支持基本类型(可转换为/从string和一些更具体的情况),因此,无法提供EmailConnectionInfo类型的参数。

但是,作为一种解决方法,如果您只需要传入几个参数,您可以创建自己的扩展方法,该方法接受您需要的参数并从配置系统调用它。

在您的情况下,您需要执行以下操作:

首先,定义一个扩展方法EmailCustom(...) ,该方法可以插入WriteTo (类型为Serilog.Configuration.LoggerSinkConfiguration )并返回LoggerConfiguration

这看起来像(未经测试,没有使用等:P):

namespace Serilog{
    public static class MyCustomExtensions
    {
        public static LoggerConfiguration EmailCustom(this LoggerSinkConfiguration sinkConfiguration, string param1, int param2, LogEventLevel restrictedToMinimumLevel){
            // the actual call to configure the Email sink, passing in complex parameters
            return sinkConfiguration.Email(... ... , restrictedToMinimumLevel , EmailConnectionInfo(){
            Foo = "bar",
            Baz = param1,
            Qux = param2,
            }
            );
        }
    }
}

从那时起,您应该能够编写 C# 代码,例如:

new LoggerConfiguration()
    .WriteTo.EmailCustom(param1: "my param1", param2: 42)
   // ...
    .CreateLogger();

一旦你开始工作,你实际上可以在json 中定义该方法调用,这要归功于Serilog.Settings.Configuration在这种情况下,看起来像

{
"Serilog": {
    "Using" : ["TheNameOfTheAssemblyThatContainsEmailCustom"],
    "MinimumLevel": "Debug",
    "WriteTo": [
      {
        "Name": "EmailCustom",
        "Args": {
          "param1": "my param1",
          "param2": 42,
          "restrictedToMinimumLevel": "Verbose"
        }
      }]
    }
}

此策略也可以应用于 Serilog 的其他接收器和其他配置部分。


您可以在此处找到有关配置系统的更多信息:

对于像我这样难以在两行之间拼凑事物的其他人,这是使用 tsimbalar 提供的框架的完整答案,该框架用于使用 SendGrid 发送电子邮件的解决方案。

我将以下类添加到我的项目(“MyApp”)的根目录中。 这会从 ReadFrom.Configuration(configuration).CreateLogger(); 自动调用。 由于应用设置中的 WriteTo EmailCustom。

using System;
using System.Net;
using Serilog;
using Serilog.Configuration;
using Serilog.Events;
using Serilog.Sinks.Email;

namespace TrackumApi
{
    public static class SerilogEmailExtension
    {
        public static LoggerConfiguration EmailCustom(this LoggerSinkConfiguration sinkConfiguration,
            string fromEmail,
            string toEmail,
            string enableSsl,
            string mailSubject,
            string isBodyHtml,
            string mailServer,
            string networkCredentialuserName,
            string networkCredentialpassword,
            string smtpPort,
            string outputTemplate,
            string batchPostingLimit,
            string periodMinutes,
            string restrictedToMinimumLevel)
        {
            return sinkConfiguration.Email(new EmailConnectionInfo
            {
                FromEmail = fromEmail,
                ToEmail = toEmail,
                EnableSsl = GetBoolean(enableSsl),
                EmailSubject = mailSubject,
                IsBodyHtml = GetBoolean(isBodyHtml),
                MailServer = mailServer,
                NetworkCredentials = new NetworkCredential(networkCredentialuserName, networkCredentialpassword),
                Port = GetInt(smtpPort)
            }, outputTemplate, GetLevel(restrictedToMinimumLevel), 
                GetInt(batchPostingLimit), TimeSpan.FromMinutes(GetInt(periodMinutes))
            );
        }

      //The system hated converting the string inputs inline so I added the conversion methods:

        private static int GetInt(string instring)
        {
            return int.TryParse(instring, out var result) ? result : 0;
        }

        private static bool GetBoolean(string instring)
        {
            return bool.TryParse(instring, out var result) && result;
        }

        private static LogEventLevel GetLevel(string restrictedtominimumlevel)
        {
            return Enum.TryParse(restrictedtominimumlevel, true,
                out LogEventLevel level) ? level : LogEventLevel.Warning;
        }
    }
}

在我的原始帖子中,我修改了 Program.cs,但事实证明不需要。 然而,在任何其他代码之前添加 Serilog.Debugging.SelfLog 仍然是无价的:

        Serilog.Debugging.SelfLog.Enable(Console.Out);
        var configuration = new ConfigurationBuilder()
            .AddJsonFile("appsettings.json", true, true)
            .Build();

        Log.Logger = new LoggerConfiguration()
            .ReadFrom.Configuration(configuration)
            .CreateLogger();

最后我修改了 appsettings.json 如下(原谅额外的,但我认为这也可能对某人有所帮助):

{
  "Logging": {
    "LogLevel": {
      "Default": "Information",
      "Microsoft": "Warning",
      "Microsoft.Hosting.Lifetime": "Information"
    }
  },
  "AllowedHosts": "*",

  "Serilog": {
    "Using": [ "Serilog", "Serilog.Sinks.Console", "Serilog.Sinks.File", "MyApp" ],
    "MinimumLevel": {
      "Default": "Verbose",
      "Override": {
        "Microsoft": "Warning",
        "System": "Warning",
        "Microsoft.AspNetCore.Authentication": "Information"
      }
    },
    "WriteTo": [
      {
        "Name": "Console",
        "Args": {
          "outputTemplate": "[{Timestamp:HH:mm:ss.fff} [{Level}] {SourceContext} {Message}{NewLine}{Exception}",
          "theme": "Serilog.Sinks.SystemConsole.Themes.AnsiConsoleTheme::Code, Serilog.Sinks.Console"
        }
      },
      {
        "Name": "File",
        "Args": {
          "path": "C:\\Temp\\Logs\\MyApp.log",
          "fileSizeLimitBytes": 1000000,
          "rollOnFileSizeLimit": "true",
          "shared": "true",
          "flushToDiskInterval": 3,
          "outputTemplate": "[{Timestamp:MM/dd/yy HH:mm:ss} [{Level}] {SourceContext} {Message}{NewLine}{Exception}",
          "restrictedToMinimumLevel": "Verbose"
        }
      },
      {
        "Name": "EmailCustom",
        "Args": {
          "fromEmail": "no-reply@mydomain.com",
          "toEmail": "me@mydomain.com",
          "enableSsl": false,
          "mailSubject": "MyApp Message",
          "isBodyHtml": true,
          "mailServer": "smtp.sendgrid.net",
          "networkCredentialuserName": "mysendgridusername",
          "networkCredentialpassword": "mysendgridpassword",
          "smtpPort": 587,
          "outputTemplate": "[{Timestamp:HH:mm:ss.fff} {Level:u3}] {Message:lj} <s:{SourceContext}>{NewLine}{Exception}",
          "batchPostingLimit": 10,
          "periodMinutes": 5,
          "restrictedToMinimumLevel": "Verbose"
        }
      }
    ],
    "Enrich": [ "FromLogContext" ],
    "Properties": {
      "Application": "MyApp"
    }
  }

}

哼!

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM