Ведение журнала из приложения ASP.NET 5, размещенного как Azure Web App

У меня есть веб-API ASP.NET 5, который я размещаю в Azure как веб-приложение. Я хочу регистрировать сообщения из своего кода с помощью диагностики Azure. Есть несколько статей, включая документы Azure, которые предполагают, что это должно быть так же просто, как System.Diagnostics.Trace.WriteLine после включения. Логи должны отображаться под LogsFiles/Application и в потоке журнала в Azure.

Я включил ведение журнала приложения для веб-приложения:

введите описание изображения здесь

Но следующие вызовы не выдают журналы:

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

Я пытался определить вручную TRACE символ, но без везения:

введите описание изображения здесь

Я также пытался использовать новый Microsoft.Extensions.Logging рамки и использование ILogger.Log API, но без каких-либо результатов снова:

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

Есть идеи, что я делаю не так?

3 ответа

Если вы посмотрите на свой web.config, это, вероятно, имеет stdoutLogEnabled="false", Если вы установите значение true, то все, что записано в стандартный вывод, будет записано в файл. И stdoutLogFile определяет, куда он идет, который по умолчанию находится под d:\home\logfiles,

Теперь вам нужно убедиться, что ваша запись действительно идет в stdout. дела Console.WriteLine определенно будет работать. Я думаю, что возможно также настроить вещи через ILoggerFactory в вашем startup.cs чтобы сделать логи перейти на стандартный вывод.

Я нашел простой трюк для приложения Azure, см. https://github.com/aspnet/Logging/tree/dev/src/Microsoft.Extensions.Logging.AzureAppServices, пожалуйста, добавьте пакет "Microsoft.Extensions.Logging.AzureAppServices". ": "1.0.0-preview1-final"и обновите связанные зависимости, добавьте диагностику Azure в startup.cs следующим образом:

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-файл и файл работают хорошо. Не нужно никаких дополнительных настроек.:)

Я получил вывод Streaming Log для веб-приложения ASP.NET 5, написав следующий класс (на примере Дэвида Эббо):

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());

Это поддерживает только ведение журналов на основе файловой системы (этого достаточно для потоковых журналов в реальном времени).

Другие вопросы по тегам