web-dev-qa-db-ja.com

Azure FunctionsのSerilog

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");
    }
}
_
6
GTHvidsten

パッケージ 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");
    }
}
1