尝试使用 appsettings.json 配置 Serilog 电子邮件接收器以与 Gmail 配合使用

Tim*_*gen 7 email serilog

在 POC 中,我让 Smtp 客户端通过 Gmail 发送电子邮件,因此我知道有关连接到 Gmail 的 SMTP 服务器的信息是正确的。我现在尝试通过 appsettings.json 配置 Serilog 以通过 Gmail 发送我的日志条目。我需要能够针对不同的环境进行不同的配置。我目前将其设置为“详细”,以便我得到任何内容......以后就不会这样了。除了我的文件日志条目之外,我什么也没得到。我使用的是本地网络 SMTP 服务器,该服务器采用默认值且没有网络凭据。现在我需要设置端口、ssl 和网络凭据才能通过 Gmail 发送。

这是我的 WriteTo 部分...

 "WriteTo": [      
      {
        "Name": "RollingFile",
        "Args": {
          "pathFormat": "C:/log/log-{Date}.json",
          "formatter": "Serilog.Formatting.Json.JsonFormatter, Serilog",
          "fileSizeLimitBytes": 2147483648,
          "retainedFileCountLimit": 180,
          "restrictedToMinimumLevel": "Verbose"
        }
      },
      {
        "Name": "Email",
        "Args": {
          "connectionInfo": {
            "FromEmail": "{email address}",
            "ToEmail": "{email address}",
            "MailServer": "smtp.gmail.com",
            "EmailSubject": "Fatal Error",
            "NetworkCredentials": {
              "userName": "{gmailuser}@gmail.com",
              "password": "{gmailPassword}"
            },
            "Port": 587,
            "EnableSsl" : true
          },          
          "restrictedToMinimumLevel": "Verbose"
        }
      }
    ]
  },
Run Code Online (Sandbox Code Playgroud)

任何帮助表示赞赏。

Bru*_*tuk 5

如果您需要 NetworkCredentials,appsettings 不会\xc2\xb4t 适用于 Serilog.Synk.Email。它将引发此异常:System.InvalidOperationException: \'Cannot create instance of type \'System.Net.ICredentialsByHost\' because it is either abstract or an interface.\'。使用 @rcf113 答案来使事情正常进行。

\n

要使您的Gmail 帐户正常工作,您必须:

\n
    \n
  1. 启用S​​SL:true
  2. \n
  3. 端口:465
  4. \n
  5. 创建应用程序密码
  6. \n
\n

为了使应用程序设置正常工作,您必须想出一个自定义实现。该解决方案来自 @adriangutowski github 答案

\n

创建一个自定义静态扩展类来实例化NetworkCredentialforICredentialsByHost属性

\n
    namespace MyWebApi.Extensions\n    {\n    \n        public static class SerilogCustomEmailExtension\n        {\n            const string DefaultOutputTemplate = "{Timestamp:yyyy-MM-dd HH:mm:ss.fff zzz} [{Level}] {Message}{NewLine}{Exception}";\n    \n            public static LoggerConfiguration CustomEmail(\n                this LoggerSinkConfiguration loggerConfiguration,\n                CustomEmailConnectionInfo connectionInfo,\n                string outputTemplate = DefaultOutputTemplate,\n                LogEventLevel restrictedToMinimumLevel = LevelAlias.Minimum\n            )\n            {\n                return loggerConfiguration.Email(\n                    connectionInfo,\n                    outputTemplate,\n                    restrictedToMinimumLevel\n                );\n            }\n    \n            public class CustomEmailConnectionInfo : EmailConnectionInfo\n            {\n                public CustomEmailConnectionInfo()\n                {\n                    NetworkCredentials = new NetworkCredential();\n                }\n            }\n        }\n    }\n
Run Code Online (Sandbox Code Playgroud)\n

然后Serilog.Using使用程序集名称(而不是命名空间)配置您的应用程序设置,并添加一个新条目Serilog.WriteTo[]

\n
    \n      "Serilog": {\n        "Using": [ "Serilog.Sinks.Email", "MyWebApi" ],\n        "MinimumLevel": "Error",\n        "WriteTo": [\n          {\n            "Name": "CustomEmail",\n            "Args": {\n              "ConnectionInfo": {\n                "NetworkCredentials": {\n                  "UserName": "aaaaaaaaaaaaaa@gmail.com",\n                  "Password": "aaaaaaaaaaaaaa"\n                },\n                "FromEmail": "aaaaaaaaaaaaaa@gmail.com",\n                "MailServer": "smtp.gmail.com",\n                "EmailSubject": "[{Level}] Log Email",\n                "Port": "465",\n                "IsBodyHtml": false,\n                "EnableSsl": true,\n                "ToEmail": "aaaaaaaaaaaaaa@gmail.com"\n              },\n              "RestrictedToMinimumLevel": "Error",\n              "OutputTemplate": "{Timestamp:yyyy-MM-dd HH:mm} [{Level}] {Message}{NewLine}{Exception}"\n            }\n          }\n        ]\n      }\n
Run Code Online (Sandbox Code Playgroud)\n

这个配置使用效果很好

\n
    \n
  • 点网核心 6
  • \n
  • Serilog.Sinks.Email 版本 =“2.4.0”
  • \n
\n


小智 3

将您的端口号更改为 465,它应该适合您。以下是有关 gmail smtp 设置的一些信息:https://www.lifewire.com/what-are-the-gmail-smtp-settings-1170854

我使用的是 Core 2.0,无法让 serilog 电子邮件接收器与 appsettings.json 文件一起使用,但我确实可以通过在 program.cs 文件中设置配置来使其工作,如下所示:

var logger = new LoggerConfiguration()
.WriteTo.RollingFile(
    pathFormat: "..\\..\\log\\AppLog.Web-{Date}.txt",
    outputTemplate: "{Timestamp:yyyy-MM-dd HH:mm:ss.fff zzz} [{Level}] [{SourceContext}] [{EventId}] {Message}{NewLine}{Exception}"
)
.WriteTo.Email(new EmailConnectionInfo
    {
        FromEmail = appConfigs.Logger.EmailSettings.FromAddress,
        ToEmail = appConfigs.Logger.EmailSettings.ToAddress,
        MailServer = "smtp.gmail.com",
        NetworkCredentials = new NetworkCredential {
            UserName = appConfigs.Logger.EmailSettings.Username,
            Password = appConfigs.Logger.EmailSettings.Password
        },
        EnableSsl = true,
        Port = 465,
        EmailSubject = appConfigs.Logger.EmailSettings.EmailSubject
    },
    outputTemplate: "{Timestamp:yyyy-MM-dd HH:mm:ss.fff zzz} [{Level}] {Message}{NewLine}{Exception}",
    batchPostingLimit: 10
    , restrictedToMinimumLevel: Serilog.Events.LogEventLevel.Error
)
.CreateLogger();
Run Code Online (Sandbox Code Playgroud)