Azure Function - ILogger 不记录日志?

标签 azure asp.net-core logging azure-functions ilogger

我有一个 azure 功能,它可以毫无问题地记录信息。

namespace aspnetcore_azurefun_blob
{
    [StorageAccount("AzureWebJobsStorage")]
    public class FileTrigger
    {
        #region Property
        private readonly IFileProcessor fileProcessor;
        #endregion

        #region Constructor
        public FileTrigger(IFileProcessor fileProcessor)
        {
            this.fileProcessor = fileProcessor;
        }
        #endregion

        [FunctionName("FileTrigger")]
        public void ProcessFilesFromSamplesContainer([BlobTrigger("samples-workitems/{name}")]Stream myBlob, string name, ILogger log, ExecutionContext context)
        {
            log.LogInformation("Function: ProcessFilesFromSamplesContainer is called");
            log.LogInformation($"C# Blob trigger function Processed blob\n Name:{name} \n Size: {myBlob.Length} Bytes");

            var result = fileProcessor.ProcessAsync(myBlob, name);

            log.LogInformation($"Function Completed Successfully on {DateTime.Now.ToLongDateString()} @ {DateTime.Now.ToShortTimeString()}.\n.");
        }

enter image description here

但是,我也使用 DI 实现了业务逻辑,下面是实现的摘录。

ServiceBase.cs

namespace BusinessService.Services.Common
{
    public abstract class ServiceBase<T>
    {
        public static AppDbContext AppDbContext;
        public static ILogger<T> Logger { get; set; }
        public static AppConfigurator Configurator { get; set; }

        public ServiceBase(AppDbContext appDbContext, ILogger<T> logger, IOptions<AppConfigurator> configurator)
        {
            AppDbContext = appDbContext ?? throw new ArgumentNullException(nameof(appDbContext));
            Logger = logger ?? throw new ArgumentNullException(nameof(logger));
            Configurator = configurator.Value ?? throw new ArgumentNullException(nameof(configurator));
        }
    }
}

FileProcessingService.cs

namespace BusinessService.Services
{
    public interface IFileProcessingService
    {
        void Process(Stream myBlob, string name);
    }

    public class FileProcessingService : ServiceBase<FileProcessingService>,  IFileProcessingService
    {
        #region Constructor
        public FileProcessingService(AppDbContext appDbContext, ILogger<FileProcessingService> logger, IOptions<AppConfigurator> configurator) 
            : base(appDbContext, logger, configurator) { }
        #endregion

        #region Public Methods
        public void Process(Stream myBlob, string name)
        {
            AppDbContext.FileRecords.Add(new FileRecords
            {
                FileName = name,
                IsCompleted = DefaultValues.IsCompleted
            });
            AppDbContext.SaveChanges();

            Logger.LogInformation("Reading configuration from the configuration settings file: {Configurator.AzureSQLServerConfigurator.ConnnectionString}");
            Logger.LogInformation("Database is updated..!");
        }
        #endregion

    }
}

第 34 行和第 35 行没有记录任何内容

            Logger.LogInformation("Reading configuration from the configuration settings file: {Configurator.AzureSQLServerConfigurator.ConnnectionString}");
            Logger.LogInformation("Database is updated..!");

DependencyRegistrar.cs

namespace CrossCutting.DependencyInjection
{
    public static class DependencyRegistrar
    {
        public static void Intialize(this IServiceCollection services)
        {
            // Initialize App Settings from Configurator Settings Json file
            services.AddOptions<AppConfigurator>()
                .Configure<IConfiguration>((settings, configuration) =>
                {
                    configuration.GetSection("AppConfigurator").Bind(settings);
                })
                .Validate((c) =>
                {
                    return !new[] { c.AzureSQLServerConfigurator.ConnnectionString }.Any(s => String.IsNullOrWhiteSpace(s));
                });
        }
    }
}

我缺少什么才能让 FileProcessingService.cs 记录信息?

最佳答案

我检查了你的代码,最后我可以获得日志信息。在您的代码中,我注意到您正在使用 Logger 而不是 logger

因为在您的区域构造函数中您正在使用 ILogger<FileProcessingService> logger 从这里,您必须调用记录器,将日志信息推送到 Application Insights/函数执行面板(输出控制台窗口)


 #region Constructor
        public FileProcessingService(AppDbContext appDbContext, ILogger<FileProcessingService> logger, IOptions<AppConfigurator> configurator) 
            : base(appDbContext, logger, configurator) { }
        #endregion


 #region Public Methods
        public void Process(Stream myBlob, string name)
        {
            AppDbContext.FileRecords.Add(new FileRecords
            {
                FileName = name,
                IsCompleted = DefaultValues.IsCompleted
            });
            AppDbContext.SaveChanges();

# changed Logger into logger          
logger.LogInformation("Reading configuration from the configuration settings file: {Configurator.AzureSQLServerConfigurator.ConnnectionString}");
            
logger.LogInformation("Database is updated..!");
        }
        #endregion

如果无法推送日志,您可以在 host.json 文件中添加您的命名空间,以避免丢失日志记录

{
  "version": "2.0",
  "logging": {
    "logLevel": {
        // Here you can use your Project namespace like BusinessService.Services
      "<namespace>": "Information" 
    }
  }
}

关于Azure Function - ILogger 不记录日志?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/72418351/

相关文章:

javascript - 如何将 Azure B2C 与 React 集成

asp.net-core - 使用 docker 链接时拒绝连接到 RabbitMQ

java - Logback - 如何通过在日志语句上指定来写入任何日志级别?

使用 HTTP POST 上传 PDF 文件的 VBA

azure - 将 ASP.NET Core RC2 应用程序部署到 Azure

java - 整个程序的记录器打印消息两次,有时甚至打印更多次

tomcat - 如何让 Solr 在 Tomcat 中使用 root 以外的记录器?

azure - 如何通过 Windows Azure 使用远程桌面来调试辅助角色?

c# - 使用自定义字体的 RDLC 报告 - 调用 COM 组件已返回错误 HRESULT E_FAIL

azure - 将AD用户组与后端服务同步