Introducción a las consultas de registro en Azure MonitorGet started with log queries in Azure Monitor

Nota

Antes de realizar este tutorial, debe completar Introducción a Log Analytics de Azure Monitor.You should complete Get started with Azure Monitor Log Analytics before completing this tutorial.

Nota

Puede trabajar en este ejercicio en su propio entorno si va a recopilar datos de al menos una máquina virtual.You can work through this exercise in your own environment if you are collecting data from at least one virtual machine. Si no es así, use nuestro entorno de demostración, que incluye gran cantidad de datos de ejemplo.If not then use our Demo environment, which includes plenty of sample data.

En este tutorial aprenderá a escribir consultas de registro en Azure Monitor.In this tutorial you will learn to write log queries in Azure Monitor. Le mostrará cómo:It will teach you how to:

  • Comprender la estructura de las consultasUnderstand query structure
  • Ordenar los resultados de la consultaSort query results
  • Filtrar los resultados de la consultaFilter query results
  • Especificar un intervalo de tiempoSpecify a time range
  • Seleccionar los campos que incluir en los resultadosSelect which fields to include in the results
  • Definir y usar campos personalizadosDefine and use custom fields
  • Agregar y agrupar los resultadosAggregate and group results

Para obtener un tutorial sobre el uso de Log Analytics en Azure Portal, consulte Introducción a Log Analytics de Azure Monitor.For a tutorial on using Log Analytics in the Azure portal, see Get started with Azure Monitor Log Analytics.
Para más información sobre las consultas de registro en Azure Monitor, consulte Introducción a las consultas de registro en Azure Monitor.For more details on log queries in Azure Monitor, see Overview of log queries in Azure Monitor.

Escribir una nueva consultaWriting a new query

Las consultas pueden comenzar por un nombre de tabla o el comando search.Queries can start with either a table name or the search command. Debe empezar por un nombre de tabla, ya que define un ámbito claro para la consulta y mejora el rendimiento de las consultas y la pertinencia de los resultados.You should start with a table name, since it defines a clear scope for the query and improves both query performance and relevance of the results.

Nota

El lenguaje de consulta de Kusto que usa Azure Monitor distingue entre mayúsculas y minúsculas.The Kusto query language used by Azure Monitor is case-sensitive. Las palabras clave del lenguaje se suelen escribir en minúsculas.Language keywords are typically written in lower-case. Al usar nombres de tablas o columnas en una consulta, asegúrese de usar las mayúsculas y minúsculas correctas, tal como se muestra en el panel de esquema.When using names of tables or columns in a query, make sure to use the correct case, as shown on the schema pane.

Consultas basadas en tablasTable-based queries

Azure Monitor organiza los datos de registro en tablas, compuestas de varias columnas.Azure Monitor organizes log data in tables, each composed of multiple columns. Todas las tablas y columnas se muestran en el panel de esquema en Log Analytics en el portal de Analytics.All tables and columns are shown on the schema pane in Log Analytics in the Analytics portal. Identifique una tabla que le interese y observe algunos datos:Identify a table that you're interested in and then take a look at a bit of data:

SecurityEvent
| take 10

La consulta anterior devuelve 10 resultados de la tabla SecurityEvent, sin orden específico.The query shown above returns 10 results from the SecurityEvent table, in no specific order. Se trata de una forma muy común para echar un vistazo a una tabla y comprender su estructura y contenido.This is a very common way to take a glance at a table and understand its structure and content. Vamos a examinar su estructura:Let's examine how it's built:

  • La consulta comienza por el nombre de la tabla, SecurityEvent; esta parte define el ámbito de la consulta.The query starts with the table name SecurityEvent - this part defines the scope of the query.
  • El carácter de barra vertical (|) separa los comandos,de manera que la salida del primero sea la entrada del siguiente.The pipe (|) character separates commands, so the output of the first one in the input of the following command. Puede agregar cualquier cantidad de elementos canalizados.You can add any number of piped elements.
  • Después de la canalización se encuentra el comando take, que devuelve un número concreto de registros arbitrarios de la tabla.Following the pipe is the take command, which returns a specific number of arbitrary records from the table.

En realidad podríamos ejecutar la consulta incluso sin agregar | take 10, seguiría siendo válida, pero podría devolver hasta 10 000 resultados.We could actually run the query even without adding | take 10 - that would still be valid, but it could return up to 10,000 results.

Consultas de búsquedaSearch queries

Las consultas de búsqueda están menos estructuradas y por lo general son más adecuadas para buscar registros con un valor específico en cualquiera de sus columnas:Search queries are less structured, and generally more suited for finding records that include a specific value in any of their columns:

search in (SecurityEvent) "Cryptographic"
| take 10

Esta consulta busca en la tabla SecurityEvent los registros que contienen la expresión "Cryptographic".This query searches the SecurityEvent table for records that contain the phrase "Cryptographic". De esos registros, se devuelven y se muestran 10.Of those records, 10 records will be returned and displayed. Si se omite la parte in (SecurityEvent) y solo se ejecuta search "Cryptographic", la búsqueda recorrerá todas las tablas, lo que podría tardar más tiempo y ser menos eficiente.If we omit the in (SecurityEvent) part and just run search "Cryptographic", the search will go over all tables, which would take longer and be less efficient.

Advertencia

Las consultas de búsqueda son normalmente más lentas que las consultas basadas en tablas porque tienen que procesar más datos.Search queries are typically slower than table-based queries because they have to process more data.

sort y topSort and top

Mientras que take resulta útil para obtener algunos registros, los resultados no se seleccionan ni se muestran en un orden concreto.While take is useful to get a few records, the results are selected and displayed in no particular order. Para obtener una vista ordenada a partir de la columna preferida, use sort:To get an ordered view, you could sort by the preferred column:

SecurityEvent   
| sort by TimeGenerated desc

No obstante, esto podría devolver demasiados resultados y tardar un tiempo.That could return too many results though and might also take some time. En la consulta anterior se ordena toda la tabla SecurityEvent a partir de la columna TimeGenerated.The above query sorts the entire SecurityEvent table by the TimeGenerated column. En el portal de Analytics se limita la presentación para mostrar solo 10 000 registros.The Analytics portal then limits the display to show only 10,000 records. Es obvio que este enfoque no es el mejor.This approach is of course not optimal.

La mejor manera de obtener solo los 10 registros más recientes es usar top, que ordena toda la tabla en el servidor y devuelve los registros principales:The best way to get only the latest 10 records is to use top, which sorts the entire table on the server side and then returns the top records:

SecurityEvent
| top 10 by TimeGenerated

El criterio de ordenación descendente es el valor predeterminado, por lo que se suele omitir el argumento desc. La salida tendrá este aspecto:Descending is the default sorting order, so we typically omit the desc argument.The output will look like this:

Los 10 principales

where: filtrado por una condiciónWhere: filtering on a condition

Los filtros, tal como indica su nombre, filtran los datos por una condición específica.Filters, as indicated by their name, filter the data by a specific condition. Se trata de la manera más común para limitar los resultados de la consulta a la información pertinente.This is the most common way to limit query results to relevant information.

Para agregar un filtro a una consulta, use el operador where seguido por una o varias condiciones.To add a filter to a query, use the where operator followed by one or more conditions. Por ejemplo, la siguiente consulta devuelve solo los registros de SecurityEvent donde Level sea igual a 8:For example, the following query returns only SecurityEvent records where Level equals 8:

SecurityEvent
| where Level == 8

Al escribir las condiciones de filtro, puede usar las siguientes expresiones:When writing filter conditions, you can use the following expressions:

ExpressionExpression DESCRIPCIÓNDescription EjemploExample
== Coincidencia con igualdadCheck equality
(distingue mayúsculas y minúsculas)(case-sensitive)
Level == 8
=~ Coincidencia con igualdadCheck equality
(no distingue mayúsculas y minúsculas)(case-insensitive)
EventSourceName =~ "microsoft-windows-security-auditing"
!=, <>!=, <> Coincidencia sin igualdadCheck inequality
(ambas expresiones son idénticas)(both expressions are identical)
Level != 4
and, orand, or Necesario entre condicionesRequired between conditions Level == 16 or CommandLine != ""

Para filtrar con varias condiciones, puede usar and:To filter by multiple conditions, you can either use and:

SecurityEvent
| where Level == 8 and EventID == 4672

o canalizar varios elementos where uno tras otro:or pipe multiple where elements one after the other:

SecurityEvent
| where Level == 8 
| where EventID == 4672

Nota

Los valores pueden ser de tipos distintos, por lo que quizá deba convertirlos para realizar la comparación en el tipo correcto.Values can have different types, so you might need to cast them to perform comparison on the correct type. Por ejemplo, la columna Level de SecurityEvent es de tipo cadena, por lo que debe convertirla a un tipo numérico, como int o long para usar operadores numéricos: SecurityEvent | where toint(Level) >= 10For example, SecurityEvent Level column is of type String, so you must cast it to a numerical type such as int or long, before you can use numerical operators on it: SecurityEvent | where toint(Level) >= 10

Especificar un intervalo de tiempoSpecify a time range

Selector de horaTime picker

El selector de hora está junto al botón Ejecutar e indica que solo consultamos registros de las últimas 24 horas.The time picker is next to the Run button and indicates we’re querying only records from the last 24 hours. Este es el intervalo de tiempo predeterminado que se aplica a todas las consultas.This is the default time range applied to all queries. Para obtener solo los registros de la última hora, seleccione Last hour (Última hora) y vuelva a ejecutar la consulta.To get only records from the last hour, select Last hour and run the query again.

Selector de hora

Filtro de tiempo en las consultasTime filter in query

También puede definir su propio intervalo de tiempo mediante la incorporación de un filtro de tiempo a la consulta.You can also define your own time range by adding a time filter to the query. Lo mejor es colocar el filtro de tiempo inmediatamente después del nombre de la tabla:It’s best to place the time filter immediately after the table name:

SecurityEvent
| where TimeGenerated > ago(30m) 
| where toint(Level) >= 10

En el filtro de tiempo anterior, ago(30m) significa "hace 30 minutos", por lo que esta consulta devuelve solo los registros de los últimos 30 minutos.In the above time filter ago(30m) means "30 minutes ago" so this query only returns records from the last 30 minutes. Otras unidades de tiempo son los días (2 d), los minutos (25 m) y los segundos (10 s).Other units of time include days (2d), minutes (25m), and seconds (10s).

project y extend: seleccionar y procesar columnasProject and Extend: select and compute columns

Use project para seleccionar columnas concretas que incluir en los resultados:Use project to select specific columns to include in the results:

SecurityEvent 
| top 10 by TimeGenerated 
| project TimeGenerated, Computer, Activity

En el ejemplo anterior se genera esta salida:The preceding example generates this output:

Resultados del proyecto de consulta

También puede usar project para cambiar el nombre de las columnas y definir otras nuevas.You can also use project to rename columns and define new ones. En el ejemplo siguiente se utiliza project para hacer lo siguiente:The following example uses project to do the following:

  • Seleccionar solo las columnas originales Computer y TimeGenerated.Select only the Computer and TimeGenerated original columns.
  • Cambiar el nombre de la columna Activity a EventDetails.Rename the Activity column to EventDetails.
  • Crear una nueva columna denominada EventCode.Create a new column named EventCode. La función substring() se utiliza para obtener solo los primeros cuatro caracteres del campo Activity.The substring() function is used to get only the first four characters from the Activity field.
SecurityEvent
| top 10 by TimeGenerated 
| project Computer, TimeGenerated, EventDetails=Activity, EventCode=substring(Activity, 0, 4)

extend mantiene todas las columnas originales en el conjunto de resultados y define otras adicionales.extend keeps all original columns in the result set and defines additional ones. La consulta siguiente usa extend para agregar la columna EventCode.The following query uses extend to add the EventCode column. Tenga en cuenta que es posible que esta columna no se muestre al final de los resultados de la tabla, en cuyo caso sería necesario expandir los detalles de un registro para verlo.Note that this column may not display at the end of the table results in which case you would need to expand the details of a record to view it.

SecurityEvent
| top 10 by TimeGenerated
| extend EventCode=substring(Activity, 0, 4)

summarize: incorporación de grupos de filasSummarize: aggregate groups of rows

Use summarize para identificar grupos de registros, según una o varias columnas, y aplicarles agregaciones.Use summarize to identify groups of records, according to one or more columns, and apply aggregations to them. El uso más habitual de summarize es con count, lo que devuelve el número de resultados de cada grupo.The most common use of summarize is count, which returns the number of results in each group.

En la consulta siguiente se revisan todos los registros Perf de la última hora, se agrupan por ObjectName y se cuentan los registros de cada grupo:The following query reviews all Perf records from the last hour, groups them by ObjectName, and counts the records in each group:

Perf
| where TimeGenerated > ago(1h)
| summarize count() by ObjectName

A veces tiene sentido definir los grupos según varias dimensiones.Sometimes it makes sense to define groups by multiple dimensions. Cada combinación única de estos valores define un grupo independiente:Each unique combination of these values defines a separate group:

Perf
| where TimeGenerated > ago(1h)
| summarize count() by ObjectName, CounterName

Otro uso común es para realizar cálculos matemáticos o estadísticos en cada grupo.Another common use is to perform mathematical or statistical calculations on each group. Por ejemplo, a continuación se calcula el promedio de CounterValue para cada equipo:For example, the following calculates the average CounterValue for each computer:

Perf
| where TimeGenerated > ago(1h)
| summarize avg(CounterValue) by Computer

Lamentablemente, los resultados de esta consulta no tienen sentido, ya que hemos mezclado diferentes contadores de rendimiento.Unfortunately, the results of this query are meaningless since we mixed together different performance counters. Para que esto tenga más sentido, debemos calcular el promedio por separado para cada combinación de CounterName y Computer:To make this more meaningful, we should calculate the average separately for each combination of CounterName and Computer:

Perf
| where TimeGenerated > ago(1h)
| summarize avg(CounterValue) by Computer, CounterName

Resumen por una columna de tiempoSummarize by a time column

La agrupación de resultados también puede basarse en una columna de tiempo o con cualquier otro valor continuo.Grouping results can also be based on a time column, or another continuous value. Sin embargo, simplemente resumir por by TimeGenerated crearía grupos para cada milisegundo del intervalo de tiempo, ya que son valores únicos.Simply summarizing by TimeGenerated though would create groups for every single millisecond over the time range, since these are unique values.

Para crear grupos basados en valores continuos es mejor dividir el intervalo en unidades manejables mediante bin.To create groups based on continuous values, it is best to break the range into manageable units using bin. En la siguiente consulta se analizan los registros Perf que miden la memoria libre (Available MBytes) en un equipo específico.The following query analyzes Perf records that measure free memory (Available MBytes) on a specific computer. Se calcula el valor promedio de cada período de 1 hora durante los últimos 7 días:It calculates the average value of each 1 hour period over the last 7 days:

Perf 
| where TimeGenerated > ago(7d)
| where Computer == "ContosoAzADDS2" 
| where CounterName == "Available MBytes" 
| summarize avg(CounterValue) by bin(TimeGenerated, 1h)

Para que la salida sea más clara, elija mostrarla como gráfico de tiempo, que muestre la memoria disponible a lo largo del tiempo:To make the output clearer, you select to display it as a time-chart, showing the available memory over time:

Consulta de memoria a lo largo del tiempo

Pasos siguientesNext steps