Add logging context to all Azure Function logs

444 Views Asked by At

By default, Azure Functions adds logging context data to all logs. Is it possible to add other context items to be logged globally? Specifically, I'd like to add global data such as the build number. I can't find any sort of hooks that don't require a third party logging framework such as Serilog, but clearly the support is there.

For clarification, I'd like this to be a general solution, not tied to any sink specifically. I'm using Seq, Stackify and Application Insights in various projects.

1

There are 1 best solutions below

4
Thomas On

You can create a custom ITelemetryInitializer that will add additional properties.

Here I've created an appsetting called BuildNumber:

{
  "IsEncrypted": false,
  "Values": {
    "AzureWebJobsStorage": "UseDevelopmentStorage=true",
    "FUNCTIONS_WORKER_RUNTIME": "dotnet",
    "APPINSIGHTS_INSTRUMENTATIONKEY": "xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxx",
    "BuildNumber": "X.X.X"
  }
}

And a TelemetryInitializer than will get additional properties from the configuration.

using Microsoft.ApplicationInsights.Channel;
using Microsoft.ApplicationInsights.DataContracts;
using Microsoft.ApplicationInsights.Extensibility;
using Microsoft.Extensions.Configuration;
using System;
...
public class AdditionalPropertyTelemetryInitializer : ITelemetryInitializer
{
    private readonly IConfiguration _configuration;

    public AdditionalPropertyTelemetryInitializer(IConfiguration configuration)
    {
        _configuration = configuration ?? throw new ArgumentNullException(nameof(configuration));
    }

    public void Initialize(ITelemetry telemetry)
    {
        var requestTelemetry = telemetry as RequestTelemetry;

        // Here we filter on request telemetry
        if (requestTelemetry == null) return;

        requestTelemetry.Properties.Add("BuildNumber", _configuration["BuildNumber"]);
    }
}

Last thing is to register the TelemetryInitializer:

using Microsoft.ApplicationInsights.Extensibility;
using Microsoft.Azure.Functions.Extensions.DependencyInjection;
using Microsoft.Extensions.DependencyInjection;

[assembly: FunctionsStartup(typeof(FunctionApp1.Startup))]
namespace FunctionApp1
{
    public class Startup : FunctionsStartup
    {
        public override void Configure(IFunctionsHostBuilder builder)
        {
            builder.Services.AddSingleton<ITelemetryInitializer, AdditionalPropertyTelemetryInitializer>();
        }
    }
}

I can now see the BuildNumber on the app insights telemetry: enter image description here