如何为Azure Functions v2正确配置NLog?本地正常云端失效求助
解决Azure Functions v2 (.NET Core 2.2)中NLog部署后失效的问题
针对你遇到的本地正常、部署到Azure后NLog失效的问题,我整理了几个关键的修复点和正确的配置步骤:
一、先排查几个常见的"坑"
手动调用
BuildServiceProvider()是大忌
你在Configure方法里调用了.BuildServiceProvider(),这会打乱Azure Functions的DI生命周期,导致日志服务没有正确注册到宿主环境中,直接去掉这个调用即可。SMTP配置遗漏关键参数
587端口通常需要启用SSL,你的邮件Target里没加EnableSsl = true,这会导致Azure环境下无法连接SMTP服务器,看起来就像日志完全失效了。NLog包版本要匹配.NET Core 2.2
确保安装的NLog.Web.AspNetCore是支持.NET Core 2.2的版本(比如4.9.x系列),5.x及以上版本不再兼容.NET Core 2.2,会导致运行时异常。
二、正确的NLog配置代码
下面是调整后的完整Startup类配置:
using Microsoft.Azure.Functions.Extensions.DependencyInjection; using Microsoft.Extensions.Logging; using NLog; using NLog.Targets; using NLog.Web; [assembly: FunctionsStartup(typeof(PmsFunctions.Startup))] namespace PmsFunctions { public class Startup : FunctionsStartup { public Startup() { // 初始化NLog配置 var nLogConfig = new LoggingConfiguration(); // 配置邮件Target(补全SSL设置) 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, EnableSsl = true // 必须添加,适配587端口的SSL要求 }; var bufferedMailTarget = new BufferingTargetWrapper("bufferedMandril", mailTarget) { SlidingTimeout = false, BufferSize = 100, FlushTimeout = 10000 }; nLogConfig.AddTarget(bufferedMailTarget); nLogConfig.LoggingRules.Add(new LoggingRule("*", NLog.LogLevel.Warn, bufferedMailTarget)); // 全局应用NLog配置 LogManager.Configuration = nLogConfig; } public override void Configure(IFunctionsHostBuilder builder) { builder.Services.AddLogging(loggingBuilder => { loggingBuilder.ClearProviders(); loggingBuilder.SetMinimumLevel(LogLevel.Trace); // 集成NLog到Functions日志系统 loggingBuilder.AddNLog(); }); // 不要手动调用BuildServiceProvider()! } } }
三、额外的验证步骤
如果调整后还是有问题,可以先添加一个文件日志Target来验证NLog是否正常工作:
// 在Startup构造函数的nLogConfig配置中添加 var fileTarget = new FileTarget("file") { FileName = "${basedir}/logs/${shortdate}.log", Layout = "${longdate} ${level} ${message} ${exception}" }; nLogConfig.AddTarget(fileTarget); nLogConfig.LoggingRules.Add(new LoggingRule("*", NLog.LogLevel.Info, fileTarget));
部署后通过Kudu工具进入site/wwwroot/logs目录查看日志文件:
- 如果日志文件正常生成,说明NLog本身没问题,问题出在SMTP配置(比如SMTP服务器是否允许Azure的IP访问)
- 如果日志文件也没有,检查Azure Portal中Function App的
Logging设置,确保日志级别没有限制住Warn及以上的输出
内容的提问来源于stack exchange,提问作者Peter
相关产品推荐
相关产品推荐

