C# 无法使用通过DI提供的ILogger实例
本质上,有两种不同的方式获取ILogger实例。一个很好用,另一个不行 我有一个Azure函数,如下所示: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
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,进行了这些更改,我担心仍然没有登录到某个类。