(+351) 21 24 10006  ·  info@bconcepts.pt
Carnaxide, Lisboa

Como usar o operador parse em KQL: passo a passo

João Barros 15 de July de 2026 4 min de leitura

O operador parse em KQL transforma texto não estruturado — como linhas de log ou mensagens de diagnóstico — em colunas organizadas e prontas a analisar. Em vez de escrever expressões regulares complicadas, basta descrever o texto tal como ele aparece e o KQL extrai cada campo automaticamente. É uma das formas mais rápidas de separar valores como utilizador, ação, IP ou duração a partir de uma única coluna em bruto.

Pré-requisitos

  • Acesso a um ambiente que corra KQL: um KQL Queryset no Microsoft Fabric (Real-Time Intelligence), Azure Data Explorer, Azure Monitor ou Microsoft Sentinel.
  • Noções básicas de consultas KQL, em especial o pipe | e o operador project.
  • Não precisa de carregar dados: vamos gerar exemplos com o operador datatable.

Passo 1: Criar dados de exemplo

Para praticar sem depender de uma tabela real, criamos algumas linhas de log com o operador datatable. Cada linha é uma mensagem de texto no formato chave=valor, o cenário típico onde o parse brilha.

datatable(RawLog: string)
[
    "User=joao action=login ip=10.0.0.5 durationMs=250",
    "User=maria action=logout ip=10.0.0.9 durationMs=87",
    "User=rui action=login ip=10.0.0.7 durationMs=143"
]

Execute a consulta. Deve ver uma única coluna chamada RawLog com três linhas de texto. É exatamente esse texto que vamos partir em colunas.

Passo 2: Extrair campos com o operador parse

Agora aplicamos o parse para dividir cada mensagem nas suas partes. A ideia é simples: entre cada valor que queremos capturar escrevemos o literal fixo que aparece no texto (por exemplo "User=") e, a seguir, o nome da coluna a criar.

datatable(RawLog: string)
[
    "User=joao action=login ip=10.0.0.5 durationMs=250",
    "User=maria action=logout ip=10.0.0.9 durationMs=87",
    "User=rui action=login ip=10.0.0.7 durationMs=143"
]
| parse RawLog with "User=" User " action=" Action " ip=" Ip " durationMs=" DurationMs: long
| project User, Action, Ip, DurationMs

Repare no padrão: os literais "User=", " action=", " ip=" e " durationMs=" servem de âncora e o KQL guarda o que está entre eles. No fim indicamos DurationMs: long para que a duração seja lida como número inteiro, e não como texto. Este é o modo simple, o comportamento por omissão do parse.

Passo 3: Ignorar o que não interessa com *

Muitas vezes o campo útil vem depois de um prefixo que não queremos, como um carimbo de data e hora. O caractere * funciona como "salta tudo até ao próximo literal". No exemplo seguinte descartamos a data no início de cada linha:

datatable(RawLog: string)
[
    "2026-07-15 09:12:03 User=joao durationMs=250",
    "2026-07-15 09:12:04 User=maria durationMs=87"
]
| parse RawLog with * "User=" User " durationMs=" DurationMs: long
| project User, DurationMs

O * colocado no início diz ao parse para ignorar tudo — a data e a hora — até encontrar "User=". Assim o padrão fica curto e legível. Nota: o * não pode ser usado logo a seguir a uma coluna de texto, apenas antes de um literal.

Passo 4: Filtrar e agregar os campos extraídos

Depois de extraídos, os novos campos são colunas normais e podem ser combinados com where, summarize ou extend. Por exemplo, para contar quantos logins existem por utilizador:

datatable(RawLog: string)
[
    "User=joao action=login ip=10.0.0.5 durationMs=250",
    "User=maria action=logout ip=10.0.0.9 durationMs=87",
    "User=joao action=login ip=10.0.0.5 durationMs=98"
]
| parse RawLog with "User=" User " action=" Action " ip=" Ip " durationMs=" DurationMs: long
| where Action == "login"
| summarize Total = count() by User

O resultado mostra cada utilizador com o número de logins — informação que estava "presa" dentro do texto e que agora é fácil de medir.

Verificar o resultado

Corra cada consulta e confirme que aparecem as colunas esperadas com os valores certos. Se uma coluna vier vazia (null), quase sempre significa que um literal do padrão não corresponde exatamente ao texto: verifique espaços a mais, maiúsculas/minúsculas e o nome das chaves. Quando o formato do texto varia entre linhas, experimente parse kind=relaxed, que preenche com null apenas os campos que não encaixam, em vez de falhar a linha toda.

Conclusão

Em poucos minutos transformou texto em bruto em colunas prontas a analisar — um passo essencial para tratar logs e telemetria em KQL. A partir daqui, combine o parse com summarize para criar métricas ou com render para gerar gráficos. Uma dica final: para padrões mais irregulares, use parse kind=regex e descreva o texto com expressões regulares. Que campos gostaria de extrair dos seus próprios logs?