我希望能够使用Ilogger以不同的方法为我的Azure函数记录不同的事情。作为一种标准,在方法参数中使用了Ilogger。但这不会为我工作,因为我需要能够调用我的方法没有参数。
的例子:
public async Task Run([TimerTrigger("0 0 10 * * *")] Ilogger logger)
{
await Method2()
}
public static async Task<String> Method2()
{
Method3()
//Here I need to also log using Ilogger.
}
public static async Task<String> Method3()
{
//Here I need to also log using Ilogger.
}
在我的脑海中,解决方案是将Ilogger记录器用作Method2的参数。但这将导致一个问题,因为我需要在我的Run方法中拥有它。
所以我不知道我如何能够登录不同的方法。
我总共有5种方法,它将需要登录。
我对Ilogger做了一些研究,但是我找不到任何与我的直接问题有关的东西。
我想用Ilogger创建一个构造函数,像这样:
public class Function1
{
private static ILogger<Function1> logger;
public Function1(ILogger<Function1> logger)
{
Function1.logger = logger;
}
public async Task Run([TimerTrigger("0 0 10 * * *")])
{
await Method2()
logger.Loginformation("Log stuff");
}
public static async Task<String> Method2()
{
//Here I need to also log using Ilogger.
logger.Loginformation("Log stuff");
}
...
}
我读过这个可以工作。我已经做了一些调试,并改变了一点,但没有运气。
如果有人对如何解决这个问题有什么想法或解决方案,请告诉我:)
编辑:
我已经使它不再是静态的,并将其更改为以下内容:
public class Function1
{
private ILogger<Function1> logger;
public Function1(ILogger<Function1> logger)
{
this.logger = logger;
}
public async Task Run([TimerTrigger("0 0 10 * * *")])
{
await Method2()
this.logger.Loginformation("Log stuff");
}
public async Task<String> Method2()
{
this.logger.Loginformation("Log stuff");
}
...
}
我没有异常,我试着调试这个,但不幸的是没有运气找到问题的原因。
不要为记录器使用静态属性:
public class Function1
{
private readonly ILogger<Function1> logger;
public Function1(ILogger<Function1> logger)
{
this.logger = logger;
}
public async Task Run([TimerTrigger("0 0 10 * * *")])
{
await Method2()
this.logger.Loginformation("Log stuff");
}
public async Task<String> Method2()
{
//Here I need to also log using Ilogger.
this.logger.Loginformation("Log stuff");
}
...
}
使用非静态属性,您将能够从类中的任何地方访问记录器。因此不需要将其作为方法参数添加。
使你的方法非静态将允许你使用this
访问你的实例相关的属性。
您绝对不应该为日志记录器使用静态属性!
-
您可以将记录器实例作为参数传递给静态方法。
-
或者您可以将静态方法设置为非静态,并通过非静态属性访问记录器。