Dan
Dan

Reputation: 5972

Azure Functions - Injected ILogger<T> logs aren't appearing

I'm using FunctionsStartup in an Azure Functions project to setup IoC bindings. However, any logs created from an injected ILogger<T> aren't appearing when I run it in Azure.

I've created a very cutdown version with a brand new example project to demonstrate this...

https://github.com/dracan/AzureFunctionsLoggingIssue

The output of this is...

2020-04-03T20:20:35  Welcome, you are now connected to log-streaming service. The default timeout is 2 hours. Change the timeout with the App Setting SCM_LOGSTREAM_TIMEOUT (in seconds). 
2020-04-03T20:20:54.643 [Information] Executing 'TestQueueTriggerFunction' (Reason='New queue message detected on 'myqueue'.', Id=2f13c4c7-8a35-4614-a768-1c3fecea8c31)
2020-04-03T20:20:54.654 [Information] Start of function (this log works)
2020-04-03T20:20:54.655 [Information] End of function (this log also works)
2020-04-03T20:20:54.655 [Information] Executed 'TestQueueTriggerFunction' (Succeeded, Id=2f13c4c7-8a35-4614-a768-1c3fecea8c31)

Note that the log entry "This log doesn't appear!" in MyClass.DoSomething() doesn't appear.

Upvotes: 20

Views: 10211

Answers (3)

Tod
Tod

Reputation: 2524

You just need to modify the host.json file

{
  "version": "2.0",
  "logging": {
    "logLevel": {
      "Some.Of.My.NameSpace": "Information"
    },
    "applicationInsights": {
      ...
    }
  }
}

Source: https://learn.microsoft.com/en-us/azure/azure-functions/functions-dotnet-dependency-injection#iloggert-and-iloggerfactory

Upvotes: 5

pburczyn
pburczyn

Reputation: 118

quick example below - use ILoggerFactory instead of ILogger<>

public class LoggingTests
{
    ILogger _log;
    public LoggingTests(ILoggerFactory loggerFactory)
    {
        _log = loggerFactory.CreateLogger(this.GetType());
    }

    [FunctionName("LoggingTests")]
    public async Task<IActionResult> Run([HttpTrigger(AuthorizationLevel.Function, "get", Route = null)] HttpRequest req, ILogger log)
    {
        _log.LogInformation("LogInformation");
        _log.LogWarning("LogWarning");
        _log.LogDebug("LogDebug");
        _log.LogTrace("LogTrace");
        _log.LogError("LogError");
        _log.LogCritical("LogCritical");

        return new OkResult();
    }
}

also check log level in host.json file

{
  "version": "2.0",
  "logging": {
    "logLevel": {
      "default": "Trace"
    },
    "applicationInsights": {
      "samplingExcludedTypes": "Request",
      "samplingSettings": {
        "isEnabled": true
      }
    }
  },
}

Upvotes: 2

Dan
Dan

Reputation: 5972

Looks like this is a known issue. To quote Microsoft's reply from Github:

This is another subtlety about how that console/debug log works in the portal. It only displays log messages if it knows they come from this function -- which means they match the category Function.{FunctionName}.User. The ILogger we pass in uses this category automatically but anything you log with an external logger will not use this. We do this so that you don't get flooded with background messages in this view -- and unfortunately it filters out your own custom logger as well.

I've got an issue tracking this with one potential workaround: Azure/azure-functions-host#4689 (comment).

Upvotes: 16

Related Questions