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 o uso em consultas. Um exemplo comum é um log personalizado que coleta uma entrada de log inteira com vários valores em uma única propriedade. Ao criar propriedades separadas para os diferentes valores, você pode pesquisar e agregar em cada um deles.
Este artigo descreve diferentes opções para analisar dados de log no Azure Monitor quando os dados são ingeridos e quando são recuperados em uma consulta, comparando as vantagens relativas para cada um.
Permissões necessárias
- Para analisar dados no momento da coleta, você precisa de
Microsoft.Insights/dataCollectionRuleAssociations/*
permissões, conforme fornecido pela função interna Colaborador do Log Analytics, por exemplo. - Para analisar dados no momento da consulta, você precisa de
Microsoft.OperationalInsights/workspaces/query/*/read
permissões, conforme fornecido pela função interna Log Analytics Reader, por exemplo.
Métodos de análise
Você pode analisar dados no momento da ingestão, quando os dados são coletados, ou no momento da consulta, quando você analisa os dados com uma consulta. Cada estratégia tem vantagens únicas.
Analisar dados no momento da recolha
Use transformações para analisar dados no momento da coleta e definir para quais colunas enviar os dados analisados.
Vantagens:
- Mais fácil consultar os dados coletados porque você não precisa incluir comandos de análise na consulta.
- Melhor desempenho da consulta porque a consulta não precisa executar a análise.
Desvantagens:
- Deve ser definido previamente. Não é possível incluir dados que já foram coletados.
- Se você alterar a lógica de análise, ela só se aplicará a novos dados.
- Aumenta o tempo de latência para a coleta de dados.
- Os erros podem ser difíceis de lidar.
Analisar dados no momento da consulta
Ao analisar dados no momento da consulta, você inclui lógica na consulta para analisar dados em vários campos. A tabela em si não é modificada.
Vantagens:
- Aplica-se a quaisquer dados, incluindo dados que já tenham sido recolhidos.
- As alterações na lógica podem ser aplicadas imediatamente a todos os dados.
- Opções de análise flexíveis, incluindo lógica predefinida para estruturas de dados específicas.
Desvantagens:
- Requer consultas mais complexas. Essa desvantagem pode ser atenuada usando funções para simular uma tabela.
- Deve replicar a lógica de análise em várias consultas. Pode compartilhar alguma lógica através de funções.
- Pode criar sobrecarga quando você executa lógica complexa em conjuntos de registros muito grandes (bilhões de registros).
Analisar dados à medida que são recolhidos
Para obter mais informações sobre como analisar dados à medida que são coletados, consulte Estrutura de transformação no Azure Monitor. Essa abordagem cria propriedades personalizadas na tabela que podem ser usadas por 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 entre registros, você pode usar operadores diferentes na Linguagem de Consulta Kusto para extrair a parte específica de dados em uma ou mais novas propriedades.
Padrões de texto simples
Use o operador de análise em sua consulta para criar uma ou mais propriedades personalizadas que podem ser extraídas de uma expressão de cadeia de caracteres. Você especifica o padrão a ser identificado e os nomes das propriedades a serem criadas. Essa abordagem é útil para dados com cadeias de caracteres chave-valor com um formulário semelhante ao key=value
.
Considere um log personalizado com dados no seguinte formato:
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 analisaria esses dados em propriedades individuais. A linha com project
é adicionada para retornar apenas 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
Este exemplo divide o nome de usuário de um UPN na AzureActivity
tabela.
AzureActivity
| parse Caller with UPNUserPart "@" *
| where UPNUserPart != "" //Remove non UPN callers (apps, SPNs, etc)
| distinct UPNUserPart, Caller
Expressões regulares
Se seus dados puderem ser identificados com uma expressão regular, você poderá usar funções que usam expressões regulares para extrair valores individuais. O exemplo a seguir usa extract para separar o UPN
campo de AzureActivity
registros 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 das Expressões Regulares, que é semelhante, mas não idêntica a algumas das outras variantes de expressão regular. Para obter mais informações, consulte a sintaxe da expressão re2.
Analisar dados delimitados em uma consulta
Dados delimitados separam campos com um caractere comum, como uma vírgula em um arquivo CSV. Use a função de divisão para analisar dados delimitados usando um delimitador que você especificar. Você pode usar essa abordagem com o operador extend para retornar todos os campos nos dados ou para especificar campos individuais a serem incluídos na saída.
Nota
Como a divisão retorna um objeto dinâmico, os resultados talvez precisem ser explicitamente convertidos em tipos de dados, como cadeia de caracteres a ser usada em operadores e filtros.
Considere um log personalizado com dados no seguinte formato CSV:
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 analisaria esses dados e resumiria por duas das propriedades calculadas. A primeira linha divide a RawData
propriedade em uma matriz de cadeia de caracteres. Cada uma das próximas linhas dá um nome a propriedades individuais e as adiciona à saída usando funções para convertê-las para o 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 seus dados estiverem formatados em uma estrutura conhecida, você poderá usar uma das funções na Linguagem de Consulta Kusto para analisar estruturas predefinidas:
- JSON
- XML
- IPv4
- URL
- Consulta de URL
- Caminho do ficheiro
- Agente de usuário
- Cadeia de caracteres de versão
A consulta de exemplo a seguir analisa o Properties
campo da tabela, que é estruturado AzureActivity
em JSON. Ele 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 ser intensivas do processador. Use-os apenas quando sua consulta usar várias propriedades dos dados formatados. Caso contrário, o processamento simples de correspondência de padrões é mais rápido.
O exemplo a seguir mostra o detalhamento do tipo de controlador TGT Preauth
de domínio. O tipo existe apenas no EventData
campo, que é uma cadeia de caracteres XML. Não são necessários outros dados deste campo. Nesse caso, a análise é usada para selecionar a parte de dados necessária.
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 retorne os dados analisados em vez de replicar a lógica de análise em cada consulta. Em seguida, você pode usar o alias de função no lugar da tabela original em outras consultas.
Considere o exemplo de log personalizado delimitado por vírgulas 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 real da tabela em consultas como o exemplo a seguir:
MyCustomCSVLog
| summarize count() by Status,Code
Próximos passos
Saiba mais sobre consultas de log para analisar os dados coletados de fontes de dados e soluções.