You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何为Azure Functions v2正确配置NLog?本地正常云端失效求助

解决Azure Functions v2 (.NET Core 2.2)中NLog部署后失效的问题

针对你遇到的本地正常、部署到Azure后NLog失效的问题,我整理了几个关键的修复点和正确的配置步骤:

一、先排查几个常见的"坑"

  1. 手动调用BuildServiceProvider()是大忌
    你在Configure方法里调用了.BuildServiceProvider(),这会打乱Azure Functions的DI生命周期,导致日志服务没有正确注册到宿主环境中,直接去掉这个调用即可。

  2. SMTP配置遗漏关键参数
    587端口通常需要启用SSL,你的邮件Target里没加EnableSsl = true,这会导致Azure环境下无法连接SMTP服务器,看起来就像日志完全失效了。

  3. 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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.13 08:09:43