C# 无法使用通过DI提供的ILogger实例

C# 无法使用通过DI提供的ILogger实例,c#,dependency-injection,.net-core,azure-functions,C#,Dependency Injection,.net Core,Azure Functions,本质上,有两种不同的方式获取ILogger实例。一个很好用,另一个不行 我有一个Azure函数,如下所示: class AzureFunctionClass { private readonly ISomeClass _someclass; public AzureFunctionClass(ISomeClass someClass){ _someclass = someClass; } public Task<IActio

本质上,有两种不同的方式获取ILogger实例。一个很好用,另一个不行

我有一个Azure函数,如下所示:

class AzureFunctionClass {

     private readonly ISomeClass _someclass;

     public AzureFunctionClass(ISomeClass someClass){
          _someclass = someClass;
     }

     public Task<IActionResult> AzureFunction(ILogger log){
             log.LogInformation("This works, I see this message when run");
             _someclass.ExecuteMethod();
     }
}
class SomeClass : ISomeClass {

     private readonly ILogger<SomeClass> _log;

     public SomeClass(ILogger log){
           _log = log;
     }

     public void ExecuteMethod(){
           _log.LogInformation("This doesn't crash so _log isn't null, but it 
                                doesn't write anything");
     }
}
class AzureFunctionClass{
私有只读类_someclass;
公共AzureFunctionClass(类someClass){
_someclass=someclass;
}
公共任务AzureFunction(ILogger日志){
log.LogInformation(“这很有效,我在运行时看到这条消息”);
_someclass.ExecuteMethod();
}
}
另一个类,不包含Azure函数,如下所示:

class AzureFunctionClass {

     private readonly ISomeClass _someclass;

     public AzureFunctionClass(ISomeClass someClass){
          _someclass = someClass;
     }

     public Task<IActionResult> AzureFunction(ILogger log){
             log.LogInformation("This works, I see this message when run");
             _someclass.ExecuteMethod();
     }
}
class SomeClass : ISomeClass {

     private readonly ILogger<SomeClass> _log;

     public SomeClass(ILogger log){
           _log = log;
     }

     public void ExecuteMethod(){
           _log.LogInformation("This doesn't crash so _log isn't null, but it 
                                doesn't write anything");
     }
}
class-SomeClass:isomoclass{
私有只读ILogger_日志;
公共类(ILogger日志){
_log=log;
}
public void ExecuteMethod(){
_log.LogInformation(“这不会崩溃,所以日志不是空的,但是
不写任何东西);
}
}
Startup.cs:

class Startup : IWebJobsStartup {

     public void Configure(IWebJobsBuilder builder){
          builder.Services.AddScoped<ISomeClass, SomeClass>();
          builder.Services.AddTransient(typeof(ILogger<>), typeof(Logger<>));
          builder.Services.AddScoped<ILogger<SomeClass>, Logger<SomeClass>>();
     }
}
类启动:IWebJobsStartup{
公共void配置(IWebJobsBuilder生成器){
builder.Services.addScope();
builder.Services.AddTransient(typeof(ILogger)、typeof(Logger));
builder.Services.addScope();
}
}
不,恐怕AzureFunctionClass不能将其ILogger实例作为参数传递给ISomeClass。
我还到处寻找日志文件,比如在Azure存储资源管理器中,看看它是否可能只是没有写入Azure门户控制台。我找到的每个日志文件都有上述工作案例的日志,而没有一个有其他案例的日志。

显示的当前语法与此注入的依赖项有关

class SomeClass : ISomeClass {
    private readonly ILogger _log;

    public SomeClass(ILogger<SomeClass> log) {
        _log = log;
    }

    public void ExecuteMethod() {
        _log.LogInformation("This doesn't crash so _log isn't null, but it doesn't write anything");
    }
}
class-SomeClass:isomoclass{
私有只读ILogger_日志;
公共类(ILogger日志){
_log=log;
}
public void ExecuteMethod(){
_LogInformation(“这不会崩溃,所以日志不是空的,但它不会写任何东西”);
}
}
第二个问题是默认情况下会添加日志记录,而手动添加的设置会覆盖默认设置

class Startup : FunctionsStartup {

    public override void Configure(IFunctionsHostBuilder builder) {
        builder.Services.AddScoped<AzureFunctionClass>();
        builder.Services.AddScoped<ISomeClass, SomeClass>();

        //...
     }
}
类启动:函数启动{
公共覆盖无效配置(IFunctionsHostBuilder){

builder.Services.AddScoped

显示的当前语法与此注入的依赖项存在一些问题

class SomeClass : ISomeClass {
    private readonly ILogger _log;

    public SomeClass(ILogger<SomeClass> log) {
        _log = log;
    }

    public void ExecuteMethod() {
        _log.LogInformation("This doesn't crash so _log isn't null, but it doesn't write anything");
    }
}
class-SomeClass:isomoclass{
私有只读ILogger_日志;
公共类(ILogger日志){
_log=log;
}
public void ExecuteMethod(){
_LogInformation(“这不会崩溃,所以日志不是空的,但它不会写任何东西”);
}
}
第二个问题是默认情况下会添加日志记录,而手动添加的设置会覆盖默认设置

class Startup : FunctionsStartup {

    public override void Configure(IFunctionsHostBuilder builder) {
        builder.Services.AddScoped<AzureFunctionClass>();
        builder.Services.AddScoped<ISomeClass, SomeClass>();

        //...
     }
}
类启动:函数启动{
公共覆盖无效配置(IFunctionsHostBuilder){

builder.Services.AddScoped目前,函数运行时有一个bug,由于该bug,它会过滤掉所有创建的日志,这些日志的类别不是以字符串
函数开头的。

请参阅以下GitHub问题:

函数方法中注入的记录器由函数运行时完成,该运行时创建的记录器的类别设置为
function..User
。因此,这将正确记录。但注入构造函数的记录器由asp.net core DI framework完成,该框架将记录器的类别名称设置为
Type.FullName
(在您的示例中键入的是
SomeClass
)。因为它的全名不是以
Function
开头,所以使用该类别记录的行将被过滤掉

有两种方法可以解决这个问题

选项1:将host.json更改为不从命名空间中筛选日志

{
  "version": "2.0",
  "logging": {
    "logLevel": {
      "<YourNameSpace>": "Information"
    }
  }
}

请注意,ILogger已经由函数运行时注册到DI框架中(如NKosi的回答中所述),因此可以删除这些行。

目前,函数运行时有一个bug,由于该bug,它过滤掉了创建的任何日志,该日志的类别不是以字符串
函数开头。

请参阅以下GitHub问题:

函数方法中注入的记录器由函数运行时完成,该运行时创建的记录器的类别设置为
function..User
。因此,这将正确记录。但注入构造函数的记录器由asp.net core DI framework完成,该框架将记录器的类别名称设置为
Type.FullName
(在您的示例中键入的是
SomeClass
)。因为它的全名不是以
Function
开头,所以使用该类别记录的行将被过滤掉

有两种方法可以解决这个问题

选项1:将host.json更改为不从命名空间中筛选日志

{
  "version": "2.0",
  "logging": {
    "logLevel": {
      "<YourNameSpace>": "Information"
    }
  }
}

请注意,ILogger已经由函数运行时注册到DI框架中(如NKosi的回答中所述),因此可以删除这些行。

Hmm,进行了这些更改,但我担心仍然没有登录到某个类。Hmm,进行了这些更改,我担心仍然没有登录到某个类。