Ведение журнала Application Insight для функций Azure на C #

У нас есть функция Azure, запускаемая служебной шиной, на C #. Я хочу регистрировать информацию (например, вызываемую функцию, результат, исключение) в Application Insight. Я преобразовал TraceWriter в Ilogger для получения информации для входа в систему. То, что я хочу достичь, - это ведение журнала на консоли (на локальном уровне), а также на экземпляре Application Insight. Как лучше всего этого добиться?

    public static class AIFunction
{
    private static string key = TelemetryConfiguration.Active.InstrumentationKey = "************************";

    private static TelemetryClient telemetryClient =
        new TelemetryClient() { InstrumentationKey = key };

    [FunctionName("AIFunction")]
    public static void Run([ServiceBusTrigger("AIFunctionQueue", AccessRights.Manage, Connection = "ServiceBus")]string queueItem, ILogger log)
    {
        telemetryClient.Context.Cloud.RoleName = "AIFunction";
        log.LogInformation($"C# ServiceBus queue trigger function processed message: {queueItem}");
        log.LogInformation($"C# ServiceBus queue trigger function to test Application Insight Logging");
        telemetryClient.TrackEvent("AIFunction TrackEvent");
        telemetryClient.TrackTrace("AIFunction TrackTrace");
    }
}

person DevPerson    schedule 19.04.2018    source источник
comment
Вы обновили расширение функций Azure для VS? Думаю, после последнего обновления я получаю журналы от ILogger в консоли.   -  person bot_insane    schedule 19.04.2018
comment
в чем разница между TraceWriter и ILogger?   -  person Alex Gordon    schedule 19.11.2018


Ответы (1)


Вы можете просто ввести TraceWriter дополнительно:

private static string key = TelemetryConfiguration.Active.InstrumentationKey = "";

private static TelemetryClient telemetryClient =
    new TelemetryClient() { InstrumentationKey = key };

[FunctionName("Function1")]
public static async Task<HttpResponseMessage> Run(
    [HttpTrigger(AuthorizationLevel.Anonymous, "get", "post", Route = null)] HttpRequestMessage req,
    ILogger log,
    TraceWriter writer)
{
    telemetryClient.Context.Cloud.RoleName = "AIFunction";
    log.LogInformation($"C# ServiceBus queue trigger function processed message: ");
    log.LogInformation($"C# ServiceBus queue trigger function to test Application Insight Logging");
    writer.Info("C# ServiceBus queue trigger function processed message: ");
    writer.Info("C# ServiceBus queue trigger function to test Application Insight Logging");
    telemetryClient.TrackEvent("AIFunction TrackEvent");
    telemetryClient.TrackTrace("AIFunction TrackTrace");

    return req.CreateResponse(HttpStatusCode.OK, "Hello!");
}

Выход:

[19.04.2018 06:41:06] Executing HTTP request: {
[19.04.2018 06:41:06]   "requestId": "d193e55d-305f-4a0c-9f17-40c0a062500a",
[19.04.2018 06:41:06]   "method": "GET",
[19.04.2018 06:41:06]   "uri": "/api/Function1"
[19.04.2018 06:41:06] }
[19.04.2018 06:41:06] Function started (Id=568798ce-f15f-4d8c-ac2b-c92aa47047a5)
[19.04.2018 06:41:06] Executing 'Function1' (Reason='This function was programmatically called via the host APIs.', Id=568798ce-f15f-4d8c-ac2b-c92aa47047a5)
[19.04.2018 06:41:06] C# ServiceBus queue trigger function processed message:
[19.04.2018 06:41:06] C# ServiceBus queue trigger function to test Application Insight Logging
[19.04.2018 06:41:07] Function completed (Success, Id=568798ce-f15f-4d8c-ac2b-c92aa47047a5, Duration=197ms)
[19.04.2018 06:41:07] Executed 'Function1' (Succeeded, Id=568798ce-f15f-4d8c-ac2b-c92aa47047a5)
[19.04.2018 06:41:07] Executed HTTP request: {
[19.04.2018 06:41:07]   "requestId": "d193e55d-305f-4a0c-9f17-40c0a062500a",
[19.04.2018 06:41:07]   "method": "GET",
[19.04.2018 06:41:07]   "uri": "/api/Function1",
[19.04.2018 06:41:07]   "authorizationLevel": "Anonymous",
[19.04.2018 06:41:07]   "status": "OK"
[19.04.2018 06:41:07] }

Если вы хотите вести журнал только локально, вы можете изменить метод Info, например, Verbose:

writer.Verbose("C# ServiceBus queue trigger function processed message: ");
writer.Verbose("C# ServiceBus queue trigger function to test Application Insight Logging");

А затем обновите свой локальный host.json файл:

{
  "tracing": {
    "consoleLevel": "verbose"
  }
}

Но лично я не считаю это полезным после того, как вы внедрили Application Insights.

person kamil-mrzyglod    schedule 19.04.2018
comment
Для локальной отладки пригодится .. Или я что-то упустил - person DevPerson; 19.04.2018
comment
Не могли бы вы уточнить? - person kamil-mrzyglod; 19.04.2018
comment
@Kcsss Круто, дайте мне знать, если вы обнаружите какие-либо проблемы, и не забудьте принять этот ответ, если он решит вашу проблему :) - person kamil-mrzyglod; 19.04.2018
comment
Конечно. Немногое: 1] После того, как мы настроим приложение-функцию с помощью InstrumentationKey, тогда, когда мы запустим функцию локально, эти журналы также будут записаны в Application Insight? Или только те журналы, которые зарегистрированы для развернутой функции? - person DevPerson; 19.04.2018
comment
@Kcsss После того, как вы введете InstrumentationKey, журналы будут отправлены в экземпляр AI в облаке, так что да, при использовании ILogger локально данные будут регистрироваться в Application Insights. - person kamil-mrzyglod; 19.04.2018
comment
TelemetryClient устарело. У вас есть ответ с помощью DI? - person Quality Catalyst; 11.11.2019