Share via


Exportar dados do workspace do Log Analytics para uma conta de armazenamento usando os Aplicativos Lógicos

Este artigo descreve um método para usar os Aplicativos Lógicos do Azure para consultar dados de um workspace do Log Analytics no Azure Monitor e enviá-los para o Armazenamento do Azure. Use esse processo quando precisar exportar os dados de log do Azure Monitor em cenários de auditoria e conformidade ou para permitir que outro serviço recupere esses dados.

Outros métodos de exportação

O método descrito neste artigo descreve uma exportação agendada de uma consulta de log usando um aplicativo lógico. Há outras opções para exportar dados em cenários específicos:

Visão geral

Esse procedimento usa o Conector de Logs do Azure Monitor que permite executar uma consulta de log de um aplicativo lógico e usar a saída em outras ações no fluxo de trabalho. O conector do Armazenamento de Blobs do Azure é usado neste procedimento para enviar a saída da consulta ao armazenamento.

Screenshot that shows a Logic Apps overview.

Ao exportar dados de um workspace do Log Analytics, limite a quantidade de dados processados pelo fluxo de trabalho dos Aplicativos Lógicos. Filtre e uos dados de log na consulta para reduzir os dados necessários. Por exemplo, se você precisar exportar eventos de entrada, filtre os eventos necessários e projete apenas os campos obrigatórios. Por exemplo:

SecurityEvent
| where EventID == 4624 or EventID == 4625
| project TimeGenerated , Account , AccountType , Computer

Ao exportar os dados mediante um agendamento, use a função ingestion_time() na consulta para não perder dados atrasados. Se os dados se atrasarem devido a problemas de rede ou de plataforma, o uso do tempo de ingestão garantirá que eles sejam incluídos na próxima execução dos Aplicativos Lógicos. Para obter um exemplo, confira a etapa "Adicionar ação de Logs do Azure Monitor" na seção Procedimento dos Aplicativos Lógicos.

Pré-requisitos

Os seguintes pré-requisitos precisam ser concluídos antes do início deste procedimento:

  • Workspace do Log Analytics: o usuário que cria o aplicativo lógico precisa ter pelo menos permissão de leitura no workspace.
  • Conta de armazenamento: a conta de armazenamento não precisa estar na mesma assinatura que o workspace do Log Analytics. O usuário que cria o aplicativo lógico deve ter permissão de gravação para a conta de armazenamento.

Limites do conector

O workspace do Log Analytics e as consultas de log no Azure Monitor são serviços multilocação que incluem limites que protegem e isolam clientes e mantêm a qualidade do serviço. Ao consultar uma grande quantidade de dados, considere os seguintes limites, que podem afetar a maneira de configurar a recorrência dos Aplicativos Lógicos e a consulta de log:

  • As consultas de log não podem retornar mais de 500 mil linhas.
  • As consultas de log não podem retornar mais de 64 milhões de bytes.
  • As consultas de logs não podem ser executadas por mais de 10 minutos.
  • O conector do Log Analytics é limitado a 100 chamadas por minuto.

Procedimento dos Aplicativos Lógicos

As seções a seguir orientam você no procedimento.

Criar um contêiner na conta de armazenamento

Use o procedimento em Criar um contêiner para adicionar um contêiner à sua conta de armazenamento para armazenar os dados exportados. O nome usado para o contêiner neste artigo é loganalytics-data, mas você pode usar qualquer nome.

Criar um fluxo de trabalho de aplicativo lógico

  1. Vá para Aplicativos Lógicos no portal do Azure e selecione Adicionar. Selecione uma Assinatura, Grupo de recursos e Região para armazenar o novo aplicativo lógico. Depois, dê a ele um nome exclusivo. Você pode ativar a configuração do Log Analytics para coletar informações sobre eventos e dados de runtime, conforme a descrição em Configurar logs do Azure Monitor e coletar dados de diagnóstico para Aplicativos Lógicos do Azure. Essa configuração não é necessária para usar o conector de Logs do Azure Monitor.

    Screenshot that shows creating a logic app.

  2. Selecione Examinar + criar e Criar. Quando a implantação estiver concluída, selecione Acessar recurso para abrir o Designer de Aplicativos Lógicos.

Criar um gatilho para o fluxo de trabalho

Em Iniciar com um gatilho comum, selecione Recorrência. Essa configuração cria um fluxo de trabalho de aplicativo lógico que é executado automaticamente em um intervalo regular. Na caixa Frequência da ação, selecione Dia. Na caixa Intervalo, insira 1 para executar o fluxo de trabalho uma vez ao dia.

Screenshot that shows a Recurrence action.

Adicionar uma ação de logs do Azure Monitor

A ação Logs do Azure Monitor permite que você especifique a consulta a ser executada. A consulta de log usada neste exemplo é otimizada para recorrência por hora. Ele coleta os dados ingeridos durante o tempo de execução específico. Por exemplo, se o fluxo de trabalho for executado às 4:35, o intervalo de tempo será das 3:00 às 4:00. Se você alterar o aplicativo lógico para execução em uma frequência diferente, também será necessário alterar a consulta. Por exemplo, se você configurar a recorrência para execução diária, defina startTime na consulta como startofday(make_datetime(year,month,day,0,0)).

Será solicitado que você selecione um locatário e permita acesso ao workspace do Log Analytics com a conta que o fluxo de trabalho usará para executar a consulta.

  1. Selecione + Nova etapa para adicionar uma ação executado após a ação de recorrência. Em Escolher uma ação, insira azure monitor. Depois, selecione Logs do Azure Monitor.

    Screenshot that shows an Azure Monitor Logs action.

  2. Clique em Azure Log Analytics – Executar consulta e listar resultados.

    Screenshot that shows Azure Monitor Logs is highlighted under Choose an action.

  3. Selecione a Assinatura e o Grupo de Recursos para seu workspace do Log Analytics. Selecione Workspace do Log Analytics em Tipo de Recurso. Depois, selecione o nome do workspace em Nome do Recurso.

  4. Adicione a seguinte consulta de logs à janela Consultar:

    let dt = now();
    let year = datetime_part('year', dt);
    let month = datetime_part('month', dt);
    let day = datetime_part('day', dt);
     let hour = datetime_part('hour', dt);
    let startTime = make_datetime(year,month,day,hour,0)-1h;
    let endTime = startTime + 1h - 1tick;
    AzureActivity
    | where ingestion_time() between(startTime .. endTime)
    | project 
        TimeGenerated,
        BlobTime = startTime, 
        OperationName ,
        OperationNameValue ,
        Level ,
        ActivityStatus ,
        ResourceGroup ,
        SubscriptionId ,
        Category ,
        EventSubmissionTimestamp ,
        ClientIpAddress = parse_json(HTTPRequest).clientIpAddress ,
        ResourceId = _ResourceId 
    
  5. O intervalo de tempo especifica os registros que serão incluídos na consulta com base na coluna TimeGenerated. O valor deve ser maior que o intervalo de tempo selecionado na consulta. Como essa consulta não está usando a coluna TimeGenerated, a opção Definir na consulta não está disponível. Para obter mais informações sobre o intervalo de tempo, confira Escopo da consulta. Selecione Últimas 4 horas para o Intervalo de tempo. Essa configuração garante que todos os registros com um tempo de ingestão maior que TimeGenerated sejam incluídos nos resultados.

    Screenshot that shows the settings for the new Azure Monitor Logs action named Run query and visualize results.

Adicionar uma ação Analisar JSON (opcional)

A saída da ação Executar consulta e listar os resultados é formatada em JSON. Você pode analisar esses dados e processá-los como parte da preparação para a ação Compor.

Você pode fornecer um esquema JSON que descreve a payload que você espera receber. O designer analisa o conteúdo JSON usando esse esquema e gera tokens amigáveis que representam as propriedades no conteúdo JSON. É possível então facilmente referenciar e usar essas propriedades em todo o fluxo de trabalho do aplicativo lógico.

Você pode usar uma saída de exemplo da etapa Executar consulta e listar resultados.

  1. Selecione Executar Gatilho na faixa de opções Aplicativos Lógicos. Depois, selecione Executar, baixar e salvar um registro de saída. Para a consulta de exemplo no tronco anterior, você pode usar a seguinte saída de exemplo:

    {
        "TimeGenerated": "2020-09-29T23:11:02.578Z",
        "BlobTime": "2020-09-29T23:00:00Z",
        "OperationName": "Returns Storage Account SAS Token",
        "OperationNameValue": "MICROSOFT.RESOURCES/DEPLOYMENTS/WRITE",
        "Level": "Informational",
        "ActivityStatus": "Started",
        "ResourceGroup": "monitoring",
        "SubscriptionId": "00000000-0000-0000-0000-000000000000",
        "Category": "Administrative",
        "EventSubmissionTimestamp": "2020-09-29T23:11:02Z",
        "ClientIpAddress": "192.168.1.100",
        "ResourceId": "/subscriptions/00000000-0000-0000-0000-000000000000/resourcegroups/monitoring/providers/microsoft.storage/storageaccounts/my-storage-account"
    }
    
  2. Clique em + Nova etapa e, depois, selecione + Adicionar uma ação. Em Escolher uma operação, insira json e selecione Analisar JSON.

    Screenshot that shows selecting a Parse JSON operator.

  3. Clique na caixa Conteúdo para ver uma lista de valores de atividades anteriores. Selecione Corpo na ação Executar consulta e listar resultados. Essa saída é da consulta de log.

    Screenshot that shows selecting a Body.

  4. Copie o registro de exemplo salvo anteriormente. Selecione Usar conteúdo de exemplo para gerar o esquema e cole-o.

    Screenshot that shows parsing a JSON payload.

Adicionar a ação Compor

A ação Compor pega a saída JSON analisada e cria o objeto que você precisa armazenar no blob.

  1. Clique em + Nova etapa e, depois, selecione + Adicionar uma ação. Em Escolher uma operação, insira redigir. Depois, selecione a ação Redigir.

    Screenshot that shows selecting a Compose action.

  2. Clique na caixa Entradas para ver uma lista de valores de atividades anteriores. Selecione Corpo na ação Analisar JSON. Essa saída analisada é da consulta de log.

    Screenshot that shows selecting a body for a Compose action.

Adicionar a ação Criar blob

A ação Criar blob grava o JSON redigido no armazenamento.

  1. Clique em + Nova etapa e, depois, selecione + Adicionar uma ação. Em Escolher uma operação, insira blob. Depois, selecione a ação Criar blob.

    Screenshot that shows selecting the Create Blob action.

  2. Insira um nome para a conexão com a conta de armazenamento em Nome da Conexão. Depois, selecione o ícone de pasta na caixa Caminho da pasta para selecionar o contêiner na conta de armazenamento. Clique em Nome do blob para ver uma lista de valores de atividades anteriores. Clique em Expressão e insira uma expressão que corresponda ao intervalo de tempo. Para esta consulta que é executada por hora, a seguinte expressão define o nome do blob por hora anterior:

    subtractFromTime(formatDateTime(utcNow(),'yyyy-MM-ddTHH:00:00'), 1,'Hour')
    

    Screenshot that shows a blob expression.

  3. Clique na caixa Conteúdo do blob para ver uma lista de valores de atividades anteriores. Depois, selecione Saídas na seção Redigir.

    Screenshot that shows creating a blob expression.

Testar o fluxo de trabalho

Para testar o fluxo de trabalho, selecione Executar. Se o fluxo de trabalho tiver erros, isso será indicado na etapa com o problema. Você pode ver as execuções e analisar cada etapa para ver a entrada e a saída para investigar falhas. Confira Solucionar problemas e diagnosticar falhas de fluxo de trabalho em Aplicativos Lógicos do Azure, se necessário.

Screenshot that shows Runs history.

Exibir logs no armazenamento

Vá para o menu Contas de armazenamento no portal do Azure e selecione sua conta de armazenamento. Selecione o bloco Blobs. Depois, selecione o contêiner que você especificou na ação Criar blob. Selecione um dos blobs e depois clique em Editar blob.

Screenshot that shows blob data.

Modelo de aplicativo lógico

A etapa opcional JSON de Análise não está incluída no modelo

{
    "definition": {
        "$schema": "https://schema.management.azure.com/providers/Microsoft.Logic/schemas/2016-06-01/workflowdefinition.json#",
        "actions": {
            "Compose": {
                "inputs": "@body('Run_query_and_list_results')",
                "runAfter": {
                    "Run_query_and_list_results": [
                        "Succeeded"
                    ]
                },
                "type": "Compose"
            },
            "Create_blob_(V2)": {
                "inputs": {
                    "body": "@outputs('Compose')",
                    "headers": {
                        "ReadFileMetadataFromServer": true
                    },
                    "host": {
                        "connection": {
                            "name": "@parameters('$connections')['azureblob']['connectionId']"
                        }
                    },
                    "method": "post",
                    "path": "/v2/datasets/@{encodeURIComponent(encodeURIComponent('AccountNameFromSettings'))}/files",
                    "queries": {
                        "folderPath": "/logicappexport",
                        "name": "@{utcNow()}",
                        "queryParametersSingleEncoded": true
                    }
                },
                "runAfter": {
                    "Compose": [
                        "Succeeded"
                    ]
                },
                "runtimeConfiguration": {
                    "contentTransfer": {
                        "transferMode": "Chunked"
                    }
                },
                "type": "ApiConnection"
            },
            "Run_query_and_list_results": {
                "inputs": {
                    "body": "let dt = now();\nlet year = datetime_part('year', dt);\nlet month = datetime_part('month', dt);\nlet day = datetime_part('day', dt);\n let hour = datetime_part('hour', dt);\nlet startTime = make_datetime(year,month,day,hour,0)-1h;\nlet endTime = startTime + 1h - 1tick;\nAzureActivity\n| where ingestion_time() between(startTime .. endTime)\n| project \n    TimeGenerated,\n    BlobTime = startTime, \n    OperationName ,\n    OperationNameValue ,\n    Level ,\n    ActivityStatus ,\n    ResourceGroup ,\n    SubscriptionId ,\n    Category ,\n    EventSubmissionTimestamp ,\n    ClientIpAddress = parse_json(HTTPRequest).clientIpAddress ,\n    ResourceId = _ResourceId ",
                    "host": {
                        "connection": {
                            "name": "@parameters('$connections')['azuremonitorlogs']['connectionId']"
                        }
                    },
                    "method": "post",
                    "path": "/queryData",
                    "queries": {
                        "resourcegroups": "resource-group-name",
                        "resourcename": "workspace-name",
                        "resourcetype": "Log Analytics Workspace",
                        "subscriptions": "workspace-subscription-id",
                        "timerange": "Set in query"
                    }
                },
                "runAfter": {},
                "type": "ApiConnection"
            }
        },
        "contentVersion": "1.0.0.0",
        "outputs": {},
        "parameters": {
            "$connections": {
                "defaultValue": {},
                "type": "Object"
            }
        },
        "triggers": {
            "Recurrence": {
                "evaluatedRecurrence": {
                    "frequency": "Day",
                    "interval": 1
                },
                "recurrence": {
                    "frequency": "Day",
                    "interval": 1
                },
                "type": "Recurrence"
            }
        }
    },
    "parameters": {
        "$connections": {
            "value": {
                "azureblob": {
                    "connectionId": "/subscriptions/logic-app-subscription-id/resourceGroups/logic-app-resource-group-name/providers/Microsoft.Web/connections/blob-connection-name",
                    "connectionName": "blob-connection-name",
                    "id": "/subscriptions/logic-app-subscription-id/providers/Microsoft.Web/locations/canadacentral/managedApis/azureblob"
                },
                "azuremonitorlogs": {
                    "connectionId": "/subscriptions/blob-connection-name/resourceGroups/logic-app-resource-group-name/providers/Microsoft.Web/connections/azure-monitor-logs-connection-name",
                    "connectionName": "azure-monitor-logs-connection-name",
                    "id": "/subscriptions/blob-connection-name/providers/Microsoft.Web/locations/canadacentral/managedApis/azuremonitorlogs"
                }
            }
        }
    }
}

Próximas etapas