web-dev-qa-db-ja.com

AzureWebアプリとしてホストされているASP.NET5アプリケーションからのログ

AzureでWebアプリとしてホストするASP.NET5 WebAPIがあります。 AzureDiagnosticsを使用してコードからメッセージをログに記録したい。 Azure docs を含む複数の記事があり、一度有効にするとSystem.Diagnostics.Trace.WriteLineと同じくらい簡単になるはずだと示唆しています。ログは、LogsFiles/Applicationの下およびAzureのログストリームに表示されます。

Webアプリのアプリケーションロギングを有効にしました:

enter image description here

ただし、次の呼び出しではログは生成されません。

System.Diagnostics.Trace.TraceError("TEST");
System.Diagnostics.Trace.TraceInformation("TEST");
System.Diagnostics.Trace.TraceWarning("TEST");
System.Diagnostics.Trace.WriteLine("TEST");

TRACEシンボルを手動で定義しようとしましたが、うまくいきませんでした。

enter image description here

また、新しいMicrosoft.Extensions.LoggingフレームワークとILogger.Log AP​​Iを使用しようとしましたが、結果はありませんでした。

public void Configure(IApplicationBuilder app, 
                      IHostingEnvironment env, 
                      ILoggerFactory loggerFactory)
{
    loggerFactory.MinimumLevel = LogLevel.Debug;

    var sourceSwitch = new SourceSwitch("Sandbox.AspNet5.ApiApp-Demo");
    sourceSwitch.Level = SourceLevels.All;
    loggerFactory.AddTraceSource(sourceSwitch, 
                                 new ConsoleTraceListener(false));
    loggerFactory.AddTraceSource(sourceSwitch, 
                                 new EventLogTraceListener("Application"));
}

私が間違っていることについて何か考えはありますか?

21

Azureアプリの簡単なトリックを見つけました。 https://github.com/aspnet/Logging/tree/dev/src/Microsoft.Extensions.Logging.AzureAppServices を参照してください。パッケージを追加してください " Microsoft.Extensions.Logging.AzureAppServices ":" 1.0.0-preview1-final "および関連する依存関係を更新し、次のようにstartup.csにAzure診断を追加します。

loggerFactory.AddConsole(Configuration.GetSection("Logging"));
loggerFactory.AddDebug();
loggerFactory.AddAzureWebAppDiagnostics(); // for default setting.

またはカスタム設定の場合:

loggerFactory.AddAzureWebAppDiagnostics(new AzureAppServicesDiagnosticsSettings( ...)); // add custom setting.
// see here for detailed member properties: https://github.com/aspnet/Logging/blob/dev/src/Microsoft.Extensions.Logging.AzureAppServices/AzureAppServicesDiagnosticsSettings.cs

また、Azureで診断ログを有効にすると、blobとファイルの両方のログオンが正常に機能します。追加の構成は必要ありません。 :)

9
Sharpeli

web.configを見ると、おそらくstdoutLogEnabled="false"があります。これをtrueに設定すると、標準出力に書き込まれるものはすべてファイルに書き込まれます。そして、stdoutLogFileはそれがどこに行くかを決定し、デフォルトではd:\home\logfilesの下にあります。

次に、ログが実際にstdoutに送られることを確認する必要があります。 Console.WriteLineを実行すると間違いなく機能します。 startup.csILoggerFactoryを介して設定し、ログをstdoutに送ることもおそらく可能だと思います。

9
David Ebbo

次のクラスを作成することで、ASP.NET 5 Webアプリでストリーミングログ出力が機能するようになりました( David Ebboの例 に基づく):

public class AzureApplicationLogTraceListener : TraceListener
{
    private readonly string _logPath;
    private readonly object _lock = new object();

    public AzureApplicationLogTraceListener()
    {
        string instanceId = Environment.GetEnvironmentVariable("WEBSITE_INSTANCE_ID");
        if (instanceId != null)
        {
            string logFolder = Environment.ExpandEnvironmentVariables(@"%HOME%\LogFiles\application");
            Directory.CreateDirectory(logFolder);
            instanceId = instanceId.Substring(0, 6);
            _logPath = Path.Combine(logFolder, $"logs_{instanceId}.txt");

        }
    }

    public override void Write(string message)
    {
        if (_logPath != null)
        {
            lock (this)
            {
                File.AppendAllText(_logPath, message);
            }
        }
    }

    public override void WriteLine(string message)
    {
        Write(message + Environment.NewLine);
    }
}

そしてこれを私のStartup.Configureに入れます:

Trace.Listeners.Add(new AzureApplicationLogTraceListener());

これは、ファイルシステムベースのロギングのみをサポートします(ライブログストリームには十分です)。

5
Ian Griffiths