Como usar o operador parse em KQL: passo a passo
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 operadorproject. - 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?