Azure Functionsの各メソッドには、ロギングのために_Microsoft.Extensions.Logging.ILogger
_を挿入できます。スタートアップクラスでWebJobsStartup
を使用すると、次の構文を使用してSerilogを使用するようにロギングを変更できます。
_[Assembly: WebJobsStartup(typeof(Startup))]
namespace MyFuncApp {
public class Startup : IWebJobsStartup
{
public void Configure(IWebJobsBuilder builder)
{
builder.Services.AddLogging(
lb => lb.ClearProviders()
.AddSerilog(
new LoggerConfiguration()
.Enrich.FromLogContext()
.WriteTo.Console()
.WriteTo.File(@"C:\Temp\MyFuncApp.log")
.CreateLogger(),
true));
}
}
}
_
他のオブジェクトをDIに追加して、メソッドまたはbuilder.Services.AddSingleton<IMyInterface, MyImplementation>();
を使用してメソッドを含むクラスのコンストラクターに注入することもできます
ただし、同じ方法で_Microsoft.Extensions.Logging.ILogger
_を挿入できるようにしたいのですが、コンストラクタでILogger
を使用しようとすると、メソッドの呼び出し中に次のエラーが発生します(クラスが作成されたとき):
Microsoft.Extensions.DependencyInjection.Abstractions: 'MyFuncApp.MyFunctions'をアクティブ化しようとしているときに、タイプ 'Microsoft.Extensions.Logging.ILogger'のサービスを解決できません。
では、ILogger
をこのようなクラスコンストラクターに注入する方法はありますか?
_public class MyFunctions
{
private IMyInterface _myImpl;
private ILogger _log;
public MyFunctions(
IMyInterface myImplememtation, // This works
ILogger log) // This does not
{
_myImpl = myImplementation;
_log = log;
_log.LogInformation("Class constructed");
}
public async Task<IActionResult> Function1([HttpTrigger() ... ) {
_log.LogInformation("Function1 invoked");
}
}
_
パッケージ Anotar.Serilog.Fody を使用することで、必要な設定をさらに簡略化することができます(さらに、他の Anotar パッケージも同様です)。
Startup
クラスでSerilogをすべて同じように設定する必要があります。
ただし、Fody
パッケージを使用すると、注入されたロガーを完全に取り除くことができます
using Anotar.Serilog;
public class Functions
{
[FunctionName("Token")]
public async Task<IActionResult> Function1(
[HttpTrigger()]...)
{
// static calls to the LogTo class
// get translated into proper Serilog code during build
LogTo.Information("Function1 invoked");
}
}