web-dev-qa-db-ja.com

Azureアプリサービスでコンソールまたはトレース出力を表示するにはどうすればよいですか? Console.WriteLineまたはTrace.TraceError

これは簡単だと思いましたが、数時間後には簡単ではないことに気付きました。 C#.Net Coreである「App Service」をAzureにデプロイしました。

Console.WriteLine( "my message")またはTrace.TraceError( "my message")を使用してアプリによる粗雑な監視を追加しようとしていますが、その出力をAzureのどこにも見つけることができません。

Application Insightsを有効にしてみましたが、そこにも出力が見つかりませんでした。

私のアプリのコード行がヒットしているという小さなアイデアを得る最も簡単な方法が欲しいだけです。その最も簡単な方法は何ですか?

私が試したこと:1)Azureのコンソールにアクセスして、この種の出力があるかもしれないが見つからなかったすべてのファイルを参照しました。確かに、LogFilesの下のファイルやフォルダには何もありません。 2)I DID「App Service Logs」に移動して「Application Logging(Filesystem)」を有効にしました3)「App Service Logs」で「Detailed error messages」も有効にしました4)「診断設定(プレビュー)」を試しましたが、そこに出力が見つかりませんでした。 5)アプリケーションログの「ログストリーム」を見るが何も表示されない6)「ログ」の下に次のメッセージが表示される:「ログが見つかりませんでした」7)「メトリック」にも「アラート」にもないログ出力

これはAzureではサポートされていないのではないかと疑い始めています。 「You hit line 20」のようなアプリにステートメントを一度追加するだけで、serilogのようなロギングフレームワークを追加する必要がありますか?私は本当に速くて汚いものが欲しいだけですが、これに数時間を費やした後、それの「速い」部分は起こりません。

2
Rob Kraft

ようやく自分で理解しました。 AzureFileLoggerOptionsの構成を追加する必要がありました。これらのオプションがないと、Azureの出力には何も表示されませんでした。

.ConfigureLogging(logging => logging.AddAzureWebAppDiagnostics())
.ConfigureServices(serviceCollection => serviceCollection
    .Configure<AzureFileLoggerOptions>(options =>
    {
        options.FileName = "Azure-diagnostics-";
        options.FileSizeLimit = 50 * 1024;
        options.RetainedFileCountLimit = 5;
    }).Configure<AzureBlobLoggerOptions>(options =>
    {
        options.BlobName = "log.txt";
    })
)

要約すると、.Net Core 3.1の場合、メッセージを「ログストリーム」に表示するには、Azureの「App Service Logs」セクションで「Application Logging」を有効にする必要があります。あなたのコードでは参照する必要があります:

microsoft.Extensions.DependencyInjectionを使用します。

microsoft.Extensions.Logging.AzureAppServicesを使用します。

また、私の場合、Blazor/SignalRを使用しており、MVCコントローラーがないため、クラスでLoggingフレームワークにアクセスする方法を理解できませんでした。より良い方法があると確信していますが、以下のコードのようにILoggerを公開することで、コードベース内のどこからでもそれを参照できました。

ログに書き込むために呼び出す静的メソッドがあります(PCでアクティブにデバッグしているときはコンソール、Azureで実行しているときはAzure "ログストリーム":

public static void WriteToLog(string message)
{
    Program.Logger.LogError(message);
}

私のProgram.csのコードは次のようになります。

public class Program
    {
        public static ILogger Logger;
        public static void Main(string[] args)
        {
            //CreateHostBuilder(args).Build().Run();

            var Host = CreateHostBuilder(args).Build();

            var LoggerF = LoggerFactory.Create(builder =>
            {
                builder.AddFilter("BlazorDiceRoller", LogLevel.Warning)
                .AddConsole().AddAzureWebAppDiagnostics()
                .AddFilter("Microsoft", LogLevel.Warning)
                .AddFilter("System", LogLevel.Warning);
            });
            Logger = LoggerF.CreateLogger<Program>();
            Host.Run();
        }

        public static IHostBuilder CreateHostBuilder(string[] args) =>
            Host.CreateDefaultBuilder(args)
            .ConfigureLogging(logging => logging.AddAzureWebAppDiagnostics())
            .ConfigureServices(serviceCollection => serviceCollection
                .Configure<AzureFileLoggerOptions>(options =>
                {
                    options.FileName = "Azure-diagnostics-";
                    options.FileSizeLimit = 50 * 1024;
                    options.RetainedFileCountLimit = 5;
                }).Configure<AzureBlobLoggerOptions>(options =>
                {
                    options.BlobName = "log.txt";
                })
            )
            .ConfigureWebHostDefaults(webBuilder =>
            {
                webBuilder.UseStartup<Startup>();
            });
    }
0
Rob Kraft

はい、これ(コンソールまたはトレース出力)は.NETコアでのみサポートされていません。以下の手順に従ってILoggerを使用する必要があります。

Startup.cs-> Configureメソッド、Configureメソッドを以下のように書き換えます。

    public void Configure(IApplicationBuilder app, IHostingEnvironment env, ILoggerFactory loggerFactory)
    {
       //your other code

        //add the following 2 lines of code.
        loggerFactory.AddConsole();
        loggerFactory.AddDebug();


        app.UseStaticFiles();

        //your other code
    }

次にHomeController.cs(例)、次のコードを追加します。

 public class HomeController : Controller
 {
    private readonly ILogger _logger; 

    public HomeController(ILoggerFactory loggerFactory)
    {
        _logger = loggerFactory.CreateLogger<HomeController>();
    }

    public IActionResult Index()
    {
        _logger.LogInformation("this is a information from ILogger...");

        return View();
    }

    //other code

  }

それでも問題が解決しない場合はお知らせください。

0
Ivan Yang