Подтвердить что ты не робот

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

У меня есть веб-API ASP.NET 5, который я размещаю в Azure как веб-приложение. Я хочу регистрировать сообщения из своего кода с помощью Azure Diagnostics. Существует несколько статей, включая Azure docs, которые предполагают, что он должен быть таким же простым, как 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 и использовать API ILogger.Log, но без каких-либо результатов:

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

Любые идеи о том, что я делаю неправильно?

4b9b3361

Ответ 1

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

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

Ответ 2

Я нашел простой трюк для приложения azure, см. https://github.com/aspnet/Logging/tree/dev/src/Microsoft.Extensions.Logging.AzureAppServices,  добавьте пакет "Microsoft.Extensions.Logging.AzureAppServices": "1.0.0-preview1-final" и обновите связанные зависимости,  добавьте лазурную диагностику в 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, и запись в блоге и файл работает хорошо. Нет необходимости в каких-либо  дополнительная конфигурация.:)

Ответ 3

Я получил вывод 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());

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