Compartir a través de


Introducción a las consultas de registro en Azure Monitor Logs

En este artículo se explican los aspectos básicos de la escritura de consultas de registro en Azure Monitor Logs, incluido cómo:

Si procede, el artículo proporciona ejemplos de consultas de datos mediante el lenguaje de consulta Kusto (KQL) y el modo sencillo de Log Analytics.

Nota:

Si va a recopilar datos de al menos una máquina virtual, puede realizar este ejercicio en su propio entorno. En otros casos, use nuestro entorno de demostración, que incluye gran cantidad de datos de ejemplo.

Vídeo tutorial

Nota:

En este vídeo se muestra una versión anterior de la interfaz de usuario, pero las capturas de pantalla de este artículo están actualizadas y reflejan la interfaz de usuario actual.


Permisos necesarios

Debe tener los permisos de Microsoft.OperationalInsights/workspaces/query/*/read para las áreas de trabajo de Log Analytics que consulte, tal y como los proporciona el Rol integrado de lector de Log Analytics, por ejemplo.

Estructurar una consulta

Las consultas pueden comenzar por un nombre de tabla o el comando search. Le recomendamos que empiece por un nombre de tabla, ya que define un ámbito claro para la consulta. Además, esto mejora el rendimiento de las consultas y la pertinencia de los resultados.

Nota

KQL, que usa Azure Monitor, distingue mayúsculas de minúsculas. Las palabras clave del lenguaje normalmente se escriben en minúsculas. 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.

Consultas basadas en tablas

Azure Monitor organiza los datos de registro en tablas, compuestas de varias columnas. Todas las tablas y columnas se muestran en el panel de esquema en Log Analytics en Azure Portal.

Identifique una tabla que le interese y observe algunos datos:

SecurityEvent
| take 10

La consulta anterior devuelve 10 resultados de la tabla SecurityEvent, sin ningún orden específico. Esta forma habitual de echar un vistazo a una tabla ayuda a comprender su estructura y contenido. Vamos a examinar su estructura:

  • La consulta comienza por el nombre de la tabla, SecurityEvent, que define el ámbito de la consulta.
  • El carácter de barra vertical (|) separa los comandos, de manera que la salida del primero es la entrada del siguiente. Puede agregar cualquier cantidad de elementos canalizados.
  • Después de la barra vertical se encuentra el operador take. Se podría ejecutar la consulta incluso sin agregar | take 10. El comando seguiría siendo válido, pero podría devolver hasta 30 000 resultados.

Consultas de búsqueda

Las consultas de búsqueda están menos estructuradas. Son más adecuadas para buscar registros con un valor específico en cualquiera de las columnas de una tabla determinada.

Esta consulta busca en la tabla SecurityEvent registros que contengan la frase "Criptográfico". De esos registros, se devuelven y muestran 10 registros:

search in (SecurityEvent) "Cryptographic"
| take 10

Si omite la parte in (SecurityEvent) y ejecuta solo search "Cryptographic", la búsqueda recorre todas las tablas. Por ello, el proceso podría tardar más tiempo y ser menos eficiente.

Importante

Normalmente, las consultas de búsqueda son más lentas que las consultas basadas en tablas porque tienen que procesar más datos.

Limitar los resultados

Use el operador take para ver una pequeña muestra de registros devolviendo hasta el número especificado de registros. Por ejemplo:

SecurityEvent
| take 10

Los resultados seleccionados son arbitrarios y no se muestran en ningún orden determinado. Si necesita devolver los resultados en un orden concreto, use los operadores sort y top.

Ordenar resultados

En esta sección se describen los operadores sort y top, y sus argumentos desc y asc. Aunque take resulta útil para obtener algunos registros, no permite seleccionar ni ordenar los resultados en ningún orden determinado. Para obtener una vista ordenada, use sort y top.

Sort

Puede usar el operador sort para ordenar los resultados de la consulta por la columna que especifique. Sin embargo, sort no limita el número de registros que devuelve la consulta.

Por ejemplo, la siguiente consulta devuelve todos los registros disponibles para la tabla SecurityEvent, un máximo de 30 000 registros, y los ordena por la columna TimeGenerated.

SecurityEvent	
| sort by TimeGenerated

Existe la posibilidad de que la consulta anterior devolviera demasiados resultados. Además, también puede tardar algún tiempo en hacerlo. La consulta ordena la tabla SecurityEvent a partir de la columna TimeGenerated. En dicho caso, el portal de Analytics limita la visualización a solo 30 000 registros. Este enfoque no es óptimo. La mejor manera de obtener solo los registros más recientes es usar el operador top.

Desc y asc

Use el argumento desc para ordenar los registros de forma descendente. El criterio de ordenación descendente es el valor predeterminado de sort y top, por lo que es habitual que se omita el argumento desc.

Por ejemplo, los datos que devuelven las dos consultas siguientes se ordenan por la columna TimeGenerated de la Z a la A:

  • SecurityEvent	
    | sort by TimeGenerated desc
    
  • SecurityEvent	
    | sort by TimeGenerated
    

Para ordenar de la A a la Z; especifique asc.

Superior

Use el operador top para ordenar toda la tabla en el servidor y que solo se devuelvan los registros principales.

Por ejemplo, la consulta siguiente devuelve los diez registros más recientes:

SecurityEvent
| top 10 by TimeGenerated

El resultado tendrá un aspecto similar al de este ejemplo:

Captura de pantalla en la que se muestran los 10 registros principales en orden descendente.

Filtrar los resultados

Esta manera de filtrar es la forma más común de limitar los resultados de la consulta a la información pertinente.

Para agregar un filtro a una consulta, use el operador where, seguido de una o varias condiciones. Por ejemplo, la siguiente consulta solo devuelve registros SecurityEvent, donde Level equals _8:

SecurityEvent
| where Level == 8

Al escribir las condiciones de filtro, puede usar las siguientes expresiones:

Expression Descripción Ejemplo
== Coincidencia con igualdad
(distingue mayúsculas y minúsculas)
Level == 8
=~ Coincidencia con igualdad
(no distingue mayúsculas y minúsculas)
EventSourceName =~ "microsoft-windows-security-auditing"
!=, <> Coincidencia sin igualdad
(ambas expresiones son idénticas)
Level != 4
and, or Necesario entre condiciones Level == 16 or CommandLine != ""

Filtrar por varias condiciones

Para aplicar el filtro con varias condiciones, puede usar cualquiera de los enfoques siguientes:

Use and, tal y como se muestra aquí:

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

Canalice varios elementos where uno tras otro, tal y como se muestra aquí:

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

Nota

Los valores pueden ser de tipos distintos, por lo que quizá deba convertirlos para realizar las comparaciones con el tipo correcto. Por ejemplo, la columna SecurityEvent Level es de tipo cadena, por lo que debe convertirla a un tipo numérico, como int o long, para usar operadores numéricos, tal y como se muestra aquí: SecurityEvent | where toint(Level) >= 10.


Especificar un intervalo de tiempo

Puede especificar un intervalo de tiempo mediante el selector de hora o un filtro de hora.

Nota:

Si incluye un intervalo de tiempo en la consulta, el selector de hora cambia automáticamente a Establecer en la consulta. Si cambia manualmente el selector de hora a un valor diferente, Log Analytics aplica el menor de los dos intervalos de tiempo.

Uso del selector de hora

El selector de hora se muestra junto al botón Ejecutar e indica que solo consulta registros de las últimas 24 horas. Este intervalo de tiempo predeterminado se aplica a todas las consultas. Para obtener solo los registros de la última hora, seleccione Última hora y vuelva a ejecutar la consulta.

Captura de pantalla que muestra el selector de hora y su lista de comandos de intervalo de tiempo en modo KQL.

Adición de un filtro de tiempo a la consulta

También puede definir su propio intervalo de tiempo mediante la incorporación de un filtro de tiempo a la consulta.

Lo mejor es colocar el filtro de hora inmediatamente después del nombre de la tabla:

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

En el filtro de hora anterior, ago(30m) significa "hace 30 minutos". Esta consulta devuelve registros de solo los últimos 30 minutos (expresados como 30m, por ejemplo). Otras unidades de tiempo incluyen días (por ejemplo, 2d) y segundos (por ejemplo, 10 segundos).

Incluir o excluir columnas en los resultados de la consulta

Use project para seleccionar columnas concretas que incluir en los resultados:

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

El ejemplo anterior genera la siguiente salida:

Captura de pantalla en la que se muestra la lista de resultados de

También puede usar project para cambiar el nombre de las columnas y definir otras nuevas. En el ejemplo siguiente se utiliza project para hacer lo siguiente:

  • Seleccionar solo las columnas originales Computer y TimeGenerated.
  • Mostrar la columna Activity como EventDetails.
  • Crear una nueva columna denominada EventCode. La función substring() se usa para obtener solo los primeros cuatro caracteres del campo Activity.
SecurityEvent
| top 10 by TimeGenerated 
| project Computer, TimeGenerated, EventDetails=Activity, EventCode=substring(Activity, 0, 4)

Definir y usar campos personalizados

Puede usar extend para mantener todas las columnas originales en el conjunto de resultados y definir otras. La consulta siguiente usa extend para agregar la columna EventCode. Es posible que esta columna no se muestre al final de los resultados de la tabla. Sería necesario expandir los detalles de un registro para verla.

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

Nota:

Use el operador extend para cálculos ad hoc en consultas. Use transformaciones en tiempo de ingesta o reglas de resumen para transformar o agregar datos en tiempo de ingesta para consultas más eficaces.

Agregar y agrupar los resultados

Agregar grupos de filas

Use summarize para identificar grupos de registros, según una o varias columnas, y aplicarles agregaciones. El uso más habitual de summarize es con count, lo que devuelve el número de resultados de cada grupo.

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:

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

Agrupar combinaciones únicas de valores en varias columnas

A veces tiene sentido definir los grupos según varias dimensiones. Cada combinación única de estos valores define un grupo independiente:

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

Realizar cálculos matemáticos o estadísticos

Otro uso común es para realizar cálculos matemáticos o estadísticos en cada grupo. En el ejemplo siguiente se calcula la media de CounterValue para cada equipo:

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. Para que los resultados tengan más sentido, calcule la media por separado para cada combinación de CounterName y Computer:

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

Resumen por una columna de tiempo

La agrupación de resultados también puede basarse en una columna de tiempo o en cualquier otro valor continuo. Si solo se resume by TimeGenerated, se crearían grupos para cada milisegundo del intervalo de tiempo, ya que estos valores son únicos.

Para crear grupos basados en valores continuos, es mejor dividir el intervalo en unidades manejables mediante bin. En la siguiente consulta se analizan los registros Perf que miden la memoria libre (Available MBytes) en un equipo específico. Se calcula el valor medio de cada período de 1 hora durante los últimos 7 días:

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

Para que la salida sea más clara, puede elegir representarla como un gráfico de tiempo que muestre la memoria disponible a lo largo del tiempo. Para ello, cambie a vista Gráfico, abra la barra lateral Formato de gráfico a la derecha y seleccione Línea para Tipo de gráfico:

Captura de pantalla que muestra los valores de una memoria de consulta a lo largo del tiempo en modo KQL.

Preguntas más frecuentes

Esta sección proporciona respuestas a preguntas comunes.

¿Por qué veo registros duplicados en los registros de Azure Monitor?

Ocasionalmente, podría observar registros duplicados en los registros de Azure Monitor. Normalmente, esta duplicación se debe a una de las dos condiciones siguientes:

  • Los componentes de la canalización hacen reintentos para garantizar una entrega confiable en el destino. A veces, esta capacidad podría dar lugar a duplicados en un pequeño porcentaje de los elementos de telemetría.
  • Si los registros duplicados proceden de una máquina virtual, puede que tenga instalados tanto el agente de Log Analytics como el agente de Azure Monitor. Si necesita que el agente de Log Analytics esté instalado, configure el área de trabajo de Log Analytics para que deje de recopilar los datos que también recopila la regla utilizada por el agente de Azure Monitor.

Pasos siguientes