У меня есть приложение-функция, которое я пытаюсь использовать DI в классе для регистратора, чтобы мне не приходилось передавать ILogger каждой функции. Я провел некоторое исследование и нашел, где я должен использовать ILogger в конструкторе класса. Я сделал все изменения, которые считаю правильными, но он по-прежнему ничего не регистрирует в этом классе.
Я добавил ведение журнала в свой класс Startup, обновил файл hosts.json и использовал ILogger в конструкторе. Ошибок нет, но ничего не логируется. Кто-нибудь видит что-то, что я упускаю?
Startup.cs
public override void Configure(IFunctionsHostBuilder builder)
{
builder.Services.AddLogging();
builder.Services.AddTransient<IDataManager, DataManager>();
}
Хост.json
{
"version": "2.0",
"logging": {
"fileLoggingMode": "always",
"logLevel": {
"default": "Debug"
},
"applicationInsights": {
"samplingSettings": {
"isEnabled": false,
"excludedTypes": "Request"
}
}
}
}
DataManager.cs
public class DataManager : IDataManager
{
private DataContext _db;
private readonly ILogger<DataManager> _log;
public DataManager(ILogger<DataManager> log, DataContext dataContext)
{
_db = dataContext;
_log = log;
}
}
Я воспроизвел в своей среде и получил ожидаемые результаты, как показано ниже, и код, взятый из репозитория @nareshnagpal06 GitHub:
Запуск.cs:
using Microsoft.Azure.Functions.Extensions.DependencyInjection; // install nuget - "Microsoft.Azure.Functions.Extensions"
using Microsoft.Extensions.DependencyInjection;
using Microsoft.Extensions.Logging;
using System;
using System.Collections.Generic;
using System.Text;
[assembly: FunctionsStartup(typeof(FunctionApp50.Startup))]
namespace FunctionApp50
{
public class Startup : FunctionsStartup
{
public override void Configure(IFunctionsHostBuilder builder)
{
builder.Services.AddSingleton<IHelperClass, HelperClass>();
}
}
}
HelperClass.cs:
using Microsoft.Extensions.Logging;
using System;
using System.Collections.Generic;
using System.Text;
namespace FunctionApp50
{
public class HelperClass : IHelperClass
{
private static ILogger<IHelperClass> _logger;
public HelperClass(ILogger<IHelperClass> logger)
{
_logger = logger;
}
public void Dowork()
{
_logger.LogInformation("Dowork: Execution Started");
/* rest of the functionality below
.....
.....
*/
_logger.LogInformation("Dowork: Execution Completed");
}
}
}
IHelperClass.cs:
using System;
using System.Collections.Generic;
using System.Text;
namespace FunctionApp50
{
public interface IHelperClass
{
void Dowork();
}
}
Функция1.cs:
using System;
using Microsoft.Azure.WebJobs;
using Microsoft.Azure.WebJobs.Host;
using Microsoft.Extensions.Logging;
namespace FunctionApp50
{
public class Function1 // Ensure class is not static (which comes by default)
{
private IHelperClass _helper;
public Function1(IHelperClass helper)
{
_helper = helper;
}
[FunctionName("Function1")]
public void Run([TimerTrigger("0 */1 * * * *")] TimerInfo myTimer, ILogger log)
{
log.LogInformation($"C# Timer trigger function executed at: {DateTime.Now}");
// call helper
_helper.Dowork();
}
}
}
хост.json:
{
"version": "2.0",
"logging": {
"fileLoggingMode": "always",
"applicationInsights": {
"samplingExcludedTypes": "Request",
"samplingSettings": {
"isEnabled": true
}
},
"logLevel": {
"Function": "Information"
}
}
}
Выход терминала:
Вывод файла:
Сначала запустите, затем вставьте %temp%\LogFiles\Application\Functions.
, затем нажмите файл хоста в нужном месте, затем нажмите файл журнала, и результат будет таким:
Я не понял, где искать File Output. Просматриваете это на своем локальном компьютере или на портале Azure? Я работаю в Azure и просматриваю Azure App Insights.
В разделе «Журналы» Application Insights я получил журналы как i.imgur.com/t4jWcHD.png Вы можете проверить, используя трассировки запросов.
Вы получите журналы, как я получил
Я все еще не показываюсь в App Insights. У меня есть все, что у вас есть, за исключением того, что я называю свой DataManger вместо HelperClass. «Журнал ILogger» в моей функции регистрируется, но как только я перехожу к своему классу DataManager, ничего не регистрируется. Единственное, что я действительно видел для изменения, это то, что я использовал частный статический ILogger<DataManager> _log и изменил его, чтобы использовать интерфейс, как у вас. частный статический ILogger<IDataManager> _log. Я также специально добавил «Namespace.DataManager»: «Debug» вместо «Namespace»: «Debug» в файле hosts. Я вижу журналы в терминале, но не вижу App Insights.