在 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)
任何帮助表示赞赏。
如果您需要 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 答案来使事情正常进行。
要使您的Gmail 帐户正常工作,您必须:
\n为了使应用程序设置正常工作,您必须想出一个自定义实现。该解决方案来自 @adriangutowski github 答案
\n创建一个自定义静态扩展类来实例化NetworkCredentialforICredentialsByHost属性
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 }\nRun Code Online (Sandbox Code Playgroud)\n然后Serilog.Using使用程序集名称(而不是命名空间)配置您的应用程序设置,并添加一个新条目Serilog.WriteTo[]
\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 }\nRun Code Online (Sandbox Code Playgroud)\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)
| 归档时间: |
|
| 查看次数: |
14674 次 |
| 最近记录: |