Analizzare i dati di testo in log di Monitoraggio di Azure

Alcuni dati di log raccolti da Monitoraggio di Azure includeranno più informazioni in una singola proprietà. L'analisi di questi dati in più proprietà ne semplifica l'uso nelle query. Un esempio comune è un log personalizzato che raccoglie un'intera voce di registro con più valori in una singola proprietà. Creando proprietà separate per i diversi valori, è possibile eseguire ricerche e aggregare in ciascuna di esse.

Questo articolo descrive diverse opzioni per l'analisi dei dati di log in Monitoraggio di Azure quando i dati vengono inseriti e quando vengono recuperati in una query, confrontando i rispettivi vantaggi.

Autorizzazioni obbligatorie

Metodi di analisi

È possibile analizzare i dati in fase di inserimento quando i dati vengono raccolti o al momento della query durante l'analisi dei dati con una query. Ogni strategia presenta vantaggi univoci.

Analizzare i dati in fase di raccolta

Usare le trasformazioni per analizzare i dati in fase di raccolta e definire le colonne a cui inviare i dati analizzati.

Vantaggi:

  • È più semplice eseguire una query sui dati raccolti perché non è necessario includere i comandi di analisi nella query.
  • Le prestazioni della query migliorano perché non è necessario eseguire l'analisi.

Svantaggi:

  • Deve essere definito in anticipo. Non può includere dati già raccolti.
  • Se si modifica la logica di analisi, verrà applicata solo ai nuovi dati.
  • Aumenta il tempo di latenza per la raccolta dei dati.
  • Gli errori possono essere difficili da gestire.

Analizzare i dati in fase di query

Quando si analizzano i dati in fase di query, si include la logica nella query per analizzare i dati in più campi. La tabella effettiva non viene modificata.

Vantaggi:

  • Si applica a tutti i dati, compresi i dati già raccolti.
  • È possibile applicare modifiche della logica immediatamente a tutti i dati.
  • Opzioni di analisi flessibili, tra cui la logica predefinita per strutture di dati specifiche.

Svantaggi:

  • Richiede query più complesse. Questo problema può essere contenuto usando funzioni che simulano una tabella.
  • È necessario replicare la logica di analisi in più query. Può condividere la logica tra le funzioni.
  • Può creare un overhead quando esegue una logica complessa in set di record di dimensioni molto grandi (miliardi di record).

Analizzare i dati durante la raccolta

Per altre informazioni sull'analisi dei dati raccolti, vedere Struttura della trasformazione in Monitoraggio di Azure. Questo approccio crea proprietà personalizzate nella tabella che è possibile usare nelle query proprio come qualsiasi altra proprietà.

Analizzare i dati in una query usando i modelli

Quando i dati da analizzare possono essere identificati in base a un criterio ripetuto nei record, è possibile usare diversi operatori nel Linguaggio di query Kusto per estrarre i dati specifici in una o più nuove proprietà.

Semplici criteri di testo

Usare l'operatore parse nella query per creare una o più proprietà personalizzate che è possibile estrarre da un'espressione di stringa. Specificare il criterio che deve essere identificato e i nomi delle proprietà da creare. Questo approccio è utile per i dati con stringhe chiave-valore con un formato simile a key=value.

Prendere in considerazione un log personalizzato con i dati nel formato seguente:

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

La query seguente analizzerebbe questi dati in singole proprietà. La riga con project viene aggiunta per restituire solo le proprietà calcolate e non RawData, cioè la singola proprietà che contiene l'intera voce del log personalizzato.

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

In questo esempio viene interrotto il nome utente di un UPN nella tabella AzureActivity.

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

Espressioni regolari

Se i dati possono essere identificati con un'espressione regolare, è possibile usare le funzioni che usano espressioni regolari per estrarre i singoli valori. L'esempio seguente usa estrarre per estrarre il campo UPN dai record AzureActivity e restituire utenti distinti.

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

Per abilitare l'analisi efficiente su vasta scala, Monitoraggio di Azure usa la versione re2 delle espressioni regolari, che è simile ma non identica ad alcune delle altre varianti di espressione regolare. Per altre informazioni, vedere la sintassi dell'espressione re2.

Analizzare i dati delimitati in una query

I dati delimitati separano i campi con un carattere comune, ad esempio una virgola in un file CSV. Usare la funzione split per analizzare dati delimitati usando un delimitatore specificato. È possibile usare questo approccio con l'operatore extend per restituire tutti i campi nei dati o per specificare i singoli campi da includere nell'output.

Nota

Dal momento che split restituisce un oggetto dinamico, potrebbe essere necessario eseguire esplicitamente il cast dei risultati nei tipi di dati, ad esempio una stringa da usare in operatori e filtri.

Prendere in considerazione un log personalizzato con i dati nel formato CSV seguente:

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

La query seguente analizzerebbe questi dati riepilogandoli in base a due delle proprietà calcolate. La prima riga suddivide la proprietà RawData in una matrice di stringa. Ognuna delle righe successive assegna un nome alle singole proprietà e le aggiunge all'output usando funzioni per convertirle nel tipo di dati appropriato.

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

Analizzare le strutture predefinite in una query

Se i dati vengono formattati in una struttura nota, si potrebbe essere in grado di usare una delle funzioni nel Linguaggio di query Kusto per l'analisi di strutture predefinite:

La query di esempio seguente analizza il campo Properties della tabella AzureActivity, strutturato in JSON. Salva i risultati in una proprietà dinamica denominata parsedProp, che include il singolo valore denominato nel file JSON. Questi valori vengono usati per filtrare e riepilogare i risultati della query.

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

Queste funzioni di analisi possono essere a elevato utilizzo del processore. Usarli solo quando la query usa più proprietà dai dati formattati. In caso contrario, la semplice elaborazione della corrispondenza dei criteri è più rapida.

L'esempio seguente mostra il dettaglio del tipo TGT Preauth del controller di dominio. Il tipo esiste solo nel campo EventData, ovvero una stringa XML. Non sono necessari altri dati da questo campo. In questo caso parse viene usato per selezionare la porzione di dati richiesta.

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

Usare una funzione per simulare una tabella

Potrebbero essere disponibili più query che eseguono la stessa analisi di una tabella specifica. In questo caso creare una funzione che restituisca i dati analizzati invece di replicare la logica di analisi in ogni query. È quindi possibile usare l'alias di funzione al posto della tabella originale in altre query.

Si consideri l'esempio precedente di log personalizzato delimitato da virgole riportato. Per usare i dati analizzati in più query, creare una funzione usando la query seguente e salvarla con l'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]) 

È ora possibile usare l'alias MyCustomCSVLog al posto del nome della tabella effettiva nelle query simili all'esempio seguente:

MyCustomCSVLog
| summarize count() by Status,Code

Passaggi successivi

Altre informazioni sulle query di log per analizzare i dati raccolti dalle origini dati e dalle soluzioni.