【发布时间】:2019-06-09 07:12:05
【问题描述】:
我真的需要一些帮助。
我想将 NLog 与 Azure Functions v2(Target Framework .NET Core 2.2)一起使用,并创建了一个
Startup : FunctionsStartup
类装饰
[assembly: FunctionsStartup(typeof(PmsFunctions.Startup))]
并创建了这个方法
public override void Configure(IFunctionsHostBuilder builder)
{
builder.Services.AddLogging(loggingBuilder =>
{
loggingBuilder.ClearProviders();
loggingBuilder.SetMinimumLevel(LogLevel.Trace);
loggingBuilder.AddNLog();
}).BuildServiceProvider();
}
在 Startup 类的构造函数中,我使用代码创建了 NLog 的配置:
var mailTarget = new MailTarget("mandrill")
{
Html = true,
AddNewLines = true,
ReplaceNewlineWithBrTagInHtml = true,
Subject = "XXXXX",
To = "john@doe.com,
From = "john@doe.com",
Body = "Message: ${message}${newline}${newline}Date: ${date}${newline}${newline}Exception: ${exception:format=tostring}${newline}${newline}",
SmtpUserName = "XXXXXXX",
SmtpPassword = "XXXXXXX",
SmtpAuthentication = SmtpAuthenticationMode.Basic,
SmtpServer = "XXXXXXXX",
SmtpPort = 587
};
var bufferedMailTarget = new BufferingTargetWrapper("bufferedMandril", mailTarget)
{
SlidingTimeout = false,
BufferSize = 100,
FlushTimeout = 10000
};
config.AddTarget(bufferedMailTarget);
var mailRule = new LoggingRule("*", NLog.LogLevel.Warn, bufferedMailTarget);
config.LoggingRules.Add(mailRule);
var logger = NLogBuilder.ConfigureNLog(config).GetCurrentClassLogger
我尝试通过使用注入的 ILogger 在函数中使用记录器。它在本地完美运行,但在使用 Azure 时完全“死机”。我想这是我配置 NLog 的方式。
我应该如何正确地做到这一点?
【问题讨论】:
-
你记得在退出前冲洗吗?好主意打电话
NLog.LogManager.Shutdown() -
@RolfKristensen:在 Azure Fuctions 中,您会在哪里调用 NLog.LogManager.Shutdown()?只是为了让我做对了。
-
好吧,使用 try-catch-finally 并将
NLog.LogManager.Shutdown()放在 finally 块中,并将错误记录放在 catch 块中。也许您想在使用超长超时(例如 60 秒)执行 Shutdown() 之前执行并显式调用NLog.LogManager.Flush()。默认情况下,超时为“仅”15 秒,这可能不足以完成 mail-smtp-call。 -
不要打电话给
ClearProviders()(这会删除一些内部日志记录——我们很快就会阻止)或BuildServiceProvider()。如果这在本地有效但在 Azure 上无效,我怀疑应用服务沙箱中的某些内容可能会影响您。我会做一些调查并尝试重现这一点。 -
您确定要等待 10 秒以上的冲洗时间吗?我能够让它工作(在下面添加了一个答案,以便您可以准确地看到我的代码)。
标签: c# azure-functions nlog