Azure OpenAI Client Library HTTP ログ出力を LoggerFactory に転送する

2024/02/25
★★

Azure OpenAI client library for .NET ログ出力の有効化

Azure OpenAI client library for .NET のログ出力を有効化する方法を以下の記事で説明しました。

この記事では、AzureEventSourceListener.CreateConsoleLogger、AzureEventSourceListener.CreateTraceLogger メソッドを使用して、ログの出力先を指定していました。また、これらのメソッドの引数で、ログレベルを設定していました。
今回は、Azure OpenAI client library for .NET のログを LoggerFactory 介して出力する方法説明します。LoggerFactory を介することで、他のログとの統合管理ができたり、appsettings.json や環境編変数でログレベルを設定することができるようになります。

AzureEventSourceLogForwarder

Microsoft.Extensions.Azure.AzureEventSourceLogForwarder を使用することで、Azure SDK のログを LoggerFactory を転送できます。Azure OpenAI client library も Azure SDK の一部として提供されているので、Azure OpenAI client library のログも LoggerFactory に転送されます。

Microsoft.Extensions.Azure を NuGet から取得し、プロジェクトに追加します。

以下のコードは、ASP.NET Core Web アプリケーションで、AzureEventSourceLogForwarder を DI で追加し、ログ転送を開始する例です。

using Microsoft.Extensions.Azure;

namespace WebApp001;

public class Program
{
    public static void Main(string[] args)
    {
        var builder = WebApplication.CreateBuilder(args);
        builder.Logging.ClearProviders();
        builder.Logging.AddSimpleConsole(options =>
        {
            options.TimestampFormat = "[HH:mm:ss.fff] ";
        });

        // Add services to the container.
        // AzureEventSourceLogForwarder を追加
        builder.Services.AddSingleton<AzureEventSourceLogForwarder>();

        builder.Services.AddControllers();
        // Learn more about configuring Swagger/OpenAPI at https://aka.ms/aspnetcore/swashbuckle
        builder.Services.AddEndpointsApiExplorer();
        builder.Services.AddSwaggerGen();

        var app = builder.Build();

        // Configure the HTTP request pipeline.
        if (app.Environment.IsDevelopment())
        {
            app.UseSwagger();
            app.UseSwaggerUI();
        }

        app.UseHttpsRedirection();

        app.UseAuthorization();


        app.MapControllers();

        // ログ転送の開始
        var azureEventSourceLogForwarder = app.Services.GetService<AzureEventSourceLogForwarder>();
        azureEventSourceLogForwarder?.Start();

        app.Run();
    }
}

AddSingleton で、AzureEventSourceLogForwarder を追加し、AzureEventSourceLogForwarder.Start でログの転送を開始しています。 AzureEventSourceLogForwarder を DI することで、インスタンス生成時に、モデルバインダーが、ILoggerFactory をバインドします。

以下は、appsettings.json によるログレベルの設定の例です。

{
  "Logging": {
    "LogLevel": {
      "Default": "Information",
      "Microsoft.AspNetCore": "Warning",
      "Azure.Core" : "Trace"
    }
  }
}

Azure OpenAI Client Library のログレベルは、Azure.Core で個別に設定できます。HTTP ペイロードのログ出力は、Azure OpenAI Client Library HTTP ログ出力の有効化 で説明したように、OpenAIClientOptions.Diagnostics.IsLoggingContentEnabled を True に設定した上で、ログレベルを Trace に設定します。

DI を使わない場合でも以下のように LoggerFactory との統合を実現できます。

// 構成情報のロード: https://blog.masudaq.com/items/c1a92a51-05a8-4472-a4f3-4eb26e88a466
var configuration = new ConfigurationBuilder()
    .AddJsonFile("appsettings.json")
    .AddJsonFile("appsettings.Development.json", optional: true)
    .Build();

// LoggerFactory の構成
var loggerFactory = LoggerFactory.Create(builder =>
    builder
        .AddConfiguration(configuration.GetSection("Logging"))
        .AddSimpleConsole(options => 
        {
            options.TimestampFormat = "[HH:mm:ss.fff] ";
        }));

_logger = loggerFactory.CreateLogger(nameof(Program));        

// AzureEventSourceLogForwarder のインスタンス化とログ転送の開始
AzureEventSourceLogForwarder azureEventSourceLogForwarder = new(loggerFactory);
azureEventSourceLogForwarder.Start();

運用を想定すると、AzureEventSourceLogForwarder により LoggerFactory とログを統合することが、現実的な選択になりますね。

以上、参考までに。

コメント (0)

コメントの投稿