Analisar dados de texto nos logs do Azure Monitor

Alguns dados de log coletados pelo Azure Monitor incluirão várias informações em uma única propriedade. A análise desses dados em várias propriedades facilita seu uso em consultas. Um exemplo comum é um log personalizado que coleta uma entrada de log inteira com vários valores em uma única propriedade. Criando propriedades separadas para os diferentes valores, você pode fazer pesquisas e agregações em cada uma delas.

Este artigo descreve diferentes opções para análise de dados de log no Azure Monitor quando os dados são ingeridos e recuperados em uma consulta, comparando as vantagens relativas de cada uma.

Permissões necessárias

Métodos de análise

Você pode analisar os dados no momento da ingestão, quando os dados são coletados, ou no momento da consulta, ao analisar os dados com uma consulta. Cada estratégia tem vantagens únicas.

Analisar os dados em tempo de coleta

Use tempo de consultas transformações para analisar dados no momento da coleta e definir para quais colunas enviar os dados analisados.

Vantagens:

  • Consulta mais fácil dos dados coletados, pois você não precisa incluir comandos de análise na consulta.
  • Melhor desempenho de consulta, pois a consulta não precisa executar a análise.

Desvantagens:

  • Precisa ser definido com antecedência. Não é possível incluir dados que já foram coletados.
  • Se você alterar a lógica de análise, ela será aplicada somente aos novos dados.
  • Aumento do tempo de latência para a coleta de dados.
  • Os erros podem ser difíceis de serem tratados.

Analisar os dados no momento da consulta

Ao analisar os dados no momento da consulta, você inclui a lógica na consulta para analisar os dados em vários campos. A tabela real em si não é modificada.

Vantagens:

  • Aplica-se a todos os dados, incluindo os dados que já foram coletados.
  • As alterações na lógica podem ser imediatamente aplicadas a todos os dados.
  • Opções de análise flexíveis, incluindo lógica predefinida para estruturas de dados específicas.

Desvantagens:

  • Exige consultas mais complexas. Essa desvantagem pode ser atenuada com o uso de funções para simular uma tabela.
  • Precisa replicar a lógica de análise em várias consultas. Pode compartilhar alguma lógica por meio de funções.
  • Pode criar sobrecarga ao executar uma lógica complexa em conjuntos de registros muito grandes (bilhões de registros).

Analisar dados conforme eles são coletados

Para obter mais informações sobre a análise de dados conforme forem coletados, consulte Estrutura de transformação no Azure Monitor. Essa abordagem cria propriedades personalizadas na tabela que podem ser usadas pelas consultas como qualquer outra propriedade.

Analisar dados em uma consulta usando padrões

Quando os dados que você deseja analisar podem ser identificados por um padrão repetido nos registros, use operadores diferentes na Linguagem de Consulta Kusto para extrair os dados específicos em uma ou mais propriedades novas.

Padrões de texto simples

Use o operador parse na consulta para criar uma ou mais propriedades personalizadas que podem ser extraídas de uma expressão de cadeia de caracteres. Especifique o padrão a ser identificado e os nomes das propriedades a serem criadas. Essa abordagem é útil para dados com cadeias de caracteres de chave-valor com um formato semelhante a key=value.

Considere um log personalizado com os dados no formato a seguir:

Time=2018-03-10 01:34:36 Event Code=207 Status=Success Message=Client 05a26a97-272a-4bc9-8f64-269d154b0e39 connected
Time=2018-03-10 01:33:33 Event Code=208 Status=Warning Message=Client ec53d95c-1c88-41ae-8174-92104212de5d disconnected
Time=2018-03-10 01:35:44 Event Code=209 Status=Success Message=Transaction 10d65890-b003-48f8-9cfc-9c74b51189c8 succeeded
Time=2018-03-10 01:38:22 Event Code=302 Status=Error Message=Application could not connect to database
Time=2018-03-10 01:31:34 Event Code=303 Status=Error Message=Application lost connection to database

A consulta a seguir analisa esses dados em propriedades individuais. A linha com project é adicionada para retornar somente as propriedades calculadas e não RawData, que é a única propriedade que contém toda a entrada do log personalizado.

MyCustomLog_CL
| parse RawData with * "Time=" EventTime " Event Code=" Code " Status=" Status " Message=" Message
| project EventTime, Code, Status, Message

Esse exemplo divide o nome de usuário de um UPN na tabela AzureActivity.

AzureActivity
| parse  Caller with UPNUserPart "@" * 
| where UPNUserPart != "" //Remove non UPN callers (apps, SPNs, etc)
| distinct UPNUserPart, Caller

Expressões regulares

Se os dados podem ser identificados com uma expressão regular, você pode usar funções que usam expressões regulares para extrair valores individuais. O exemplo a seguir usa extract para dividir o campo UPN de registros AzureActivity e, em seguida, retornar usuários distintos.

AzureActivity
| extend UPNUserPart = extract("([a-z.]*)@", 1, Caller) 
| distinct UPNUserPart, Caller

Para habilitar a análise eficiente em grande escala, o Azure Monitor usa a versão re2 de Expressões Regulares, que é semelhante, mas não idêntica, a algumas das outras variantes de expressão regular. Para obter mais informações, confira a sintaxe de expressão re2.

Analisar dados delimitados em uma consulta

Os dados delimitados separam os campos com um caractere comum, como uma vírgula em um arquivo CSV. Use a função split para analisar os dados delimitados usando um delimitador especificado por você. Você pode usar essa abordagem com o operador extend para retornar todos os campos nos dados ou para especificar os campos individuais a serem incluídos no resultado.

Observação

Como a divisão retorna um objeto dinâmico, os resultados podem precisar ser explicitamente convertidos em tipos de dados como cadeia de caracteres para serem usados em operadores e filtros.

Considere um log personalizado com os dados no formato CSV a seguir:

2018-03-10 01:34:36, 207,Success,Client 05a26a97-272a-4bc9-8f64-269d154b0e39 connected
2018-03-10 01:33:33, 208,Warning,Client ec53d95c-1c88-41ae-8174-92104212de5d disconnected
2018-03-10 01:35:44, 209,Success,Transaction 10d65890-b003-48f8-9cfc-9c74b51189c8 succeeded
2018-03-10 01:38:22, 302,Error,Application could not connect to database
2018-03-10 01:31:34, 303,Error,Application lost connection to database

A consulta a seguir analisa esses dados e faz um resumo por duas das propriedades calculadas. A primeira linha divide a propriedade RawData em uma matriz de cadeia de caracteres. Cada uma das próximas linhas fornece um nome para propriedades individuais e as adiciona ao resultado usando funções para convertê-las no tipo de dados apropriado.

MyCustomCSVLog_CL
| extend CSVFields  = split(RawData, ',')
| extend EventTime  = todatetime(CSVFields[0])
| extend Code       = toint(CSVFields[1]) 
| extend Status     = tostring(CSVFields[2]) 
| extend Message    = tostring(CSVFields[3]) 
| where getyear(EventTime) == 2018
| summarize count() by Status,Code

Analisar estruturas predefinidas em uma consulta

Se os dados estiverem formatados em uma estrutura conhecida, use uma das funções na Linguagem de Consulta Kusto para a análise de estruturas predefinidas:

A consulta de exemplo a seguir analisa o campo Properties da tabela AzureActivity, que é estruturada em JSON. Ela salva os resultados em uma propriedade dinâmica chamada parsedProp, que inclui o valor nomeado individual no JSON. Esses valores são usados para filtrar e resumir os resultados da consulta.

AzureActivity
| extend parsedProp = parse_json(Properties) 
| where parsedProp.isComplianceCheck == "True" 
| summarize count() by ResourceGroup, tostring(parsedProp.tags.businessowner)

Essas funções de análise podem usar bastante os processadores. Use-as somente quando a consulta usar várias propriedades dos dados formatados. Caso contrário, a correspondência de padrões simples fica mais rápida.

O exemplo a seguir mostra o detalhamento do tipo TGT Preauth do controlador de domínio. O tipo só existe no campo EventData, que é uma cadeia de caracteres XML. Nenhum outro dado desse campo é necessário. Nesse caso, parse é usado para selecionar os dados necessários.

SecurityEvent
| where EventID == 4768
| parse EventData with * 'PreAuthType">' PreAuthType '</Data>' * 
| summarize count() by PreAuthType

Usar uma função para simular uma tabela

Você pode ter várias consultas que executam a mesma análise de uma tabela específica. Nesse caso, crie uma função que retorna os dados analisados em vez de replicar a lógica de análise em cada consulta. Em seguida, você pode usar o alias da função no lugar da tabela original em outras consultas.

Leve em consideração o exemplo de log personalizado delimitado por vírgula anterior. Para usar os dados analisados em várias consultas, crie uma função usando a consulta a seguir e salve-a com o alias MyCustomCSVLog.

MyCustomCSVLog_CL
| extend CSVFields = split(RawData, ',')
| extend DateTime  = tostring(CSVFields[0])
| extend Code      = toint(CSVFields[1]) 
| extend Status    = tostring(CSVFields[2]) 
| extend Message   = tostring(CSVFields[3]) 

Agora você pode usar o alias MyCustomCSVLog no lugar do nome da tabela real em consultas como a mostrada no exemplo a seguir:

MyCustomCSVLog
| summarize count() by Status,Code

Próximas etapas

Saiba mais sobre registrar consultas para analisar os dados coletados de fontes de dados e soluções.