No tienes acceso a esta clase

¡Continúa aprendiendo! Únete y comienza a potenciar tu carrera

Logs

13/29
Recursos

Las expresiones regulares son muy útiles para encontrar líneas específicas que nos dicen algo muy puntual dentro de los archivos de logs que pueden llegar a tener millones de líneas.

Aportes 70

Preguntas 7

Ordenar por:

Los aportes, preguntas y respuestas son vitales para aprender en comunidad. Regístrate o inicia sesión para participar.

Es gracioso ver como el instructor tiene tanta información en la cabeza por decir y trata de ser o hablar de la manera mas simplificada posible sin dejar de un lado todo su conocimiento o su afán de ser literal y muy correcto con sus palabras. 😅👨‍💻🤷‍♂️

Un increíble esfuerzo por dar un excelente curso ya no es una información tan simple de transmitir efectivamente.

[LOG ENTRY] [ERROR] The system is unstable
[LOG ENTRY] [WARN] The system may be down
[LOG ENTRY] [WARN] Microsoft just bought Github
[LOG DATA] [LOG] Everything is OK
[LOG ENTRY] [LOG] [user:@beco] Logged in
[LOG ENTRY] [LOG] [user:@beco] Clicked here
[LOG DATA] [LOG] [user:@celismx] Did something
[LOG ENTRY] [LOG] [user:@beco] Rated the app
[LOG ENTRY] [LOG] [user:@beco] Logged out
[LOG LINE] [LOG] [user:@celismx] Logged in

Mis expresiones regulares útiles en logs:

Para buscar direcciones IP:

(\d{1,3}\.){3,3}(\d{1,3})

Para buscar líneas sobre métodos HTTP:

^.*((GET)|(POST)|(PUT)|(DELETE)).*$

Para buscar líneas con fechas en el formato día(numero)/mes(nombre)/año(numero):

^.*(\d{1,2}\/\w+\/\d{4,4}).*$

En este enlace pueden generar su data, por si no tienen a la mano.

https://www.generatedata.com

Probé usando grep en la terminal desde la carpeta de logs de npm:

[LOG ENTRY] [ERROR] The system is unstable
[LOG ENTRY] [WARN] The system may be down
[LOG ENTRY] [LOG] Everything is OK
[LOG ENTRY] [LOG] [user:@beco] Logged in
[LOG ENTRY] [LOG] [user:@beco] Clicked here
[LOG ENTRY] [LOG] [user:@oscar] Rated the app
[LOG ENTRY] [LOG] [user:@beco] Logged out
[LOG ENTRY] [LOG] [user:@Lis] Logged out
Si quiero encongrar en el log la advertencia utilizaré:

\[LOG.*\[WARN.*

-> Primero se escapa el corchete ya que es un carácter reservado, luego se escribe lo que se desea encontrar, con el simple [log.* se selecciona toda la línea, ahora se vuelve a escapar el corchete y se termina de seleccionar el warn y el resto de la línea con el “.*”.
Si de los logs anteriores quiero encontrar solo los usuarios utilizaré:

^\[log.*\[user.*$

Si quiero encontrar la información de 1 usuario utilizaré:

\[log.*\[user:@oscar.*$

Lo que dice Alberto es muy cierto, quizás el control + F de toda la vida te pueda sacar de un apuro rápido. Sin embargo, para buscar de verdad en logs gigantes (como he tenido que hacer) las expresiones regulares ayudan bastante. Antes de este curso las buscaba en internet, ahora ya puedo hacerlas yo mismo y eso me da muchas ventajas. ¡A seguir aprendiendo amigos!

Descripción de la clase por Beco:

Las expresiones regulares son muy útiles para encontrar líneas específicas que nos dicen algo muy puntual dentro de los archivos de logs que pueden llegar a tener millones de líneas.

En este ejemplo: https://www.acunetix.com/blog/articles/using-logs-to-investigate-a-web-application-attack/

Buscar líneas con el comando POST y que contengan la palabra admin

"POST.*admin.*

Colección de logs del diferentes sistemas:

https://github.com/logpai/loghub

Buenas [email protected],
si estáis usando Linux podéis abrir el archivo /var/log/auth.log donde os mostrará diversas operaciones y así podéis buscar información relevante, en mi caso busque los últimos comandos que hice usando sudo.

Les comparto una lista de los caracteres reservados en expresiones regulares.

Símbolo Descripción
[ ] Especificación de rango. (p.e. [a-z] representa una letra en el rango de la a a la z
\w Letra o dígito o guión bajo; es lo mismo que [0-9A-Za-z_]
\W negación de \w
\s Espacio, es lo mismo que [ \t\n\r\f]
\S Negación de \s
\d Dígito; es lo mismo que [0-9]
\D Negación de \d
\b Backspace (0x08) (sólo si aparece en una especificación de rango)
\b Límite de palabra (sólo si no aparece en una especificación de rango)
\B No límite de palabra
* Cero o más repeticiones de lo que precede
+ Una o más repeticiones de lo que precede
[m,n] Al menos m y como máximo n de lo que precede
? Al menos una repetición o ninguna de lo que precede; es lo mismo que [0,1]
| Puede coincidir con lo que precede o con lo que sigue
( ) Agrupamiento

tan “sencillo” y a la vez tan útil y poderoso.

Qué hermoso es porder Seleccionar solo lo que quiero

__

interesante y util

Parece complejo pero no lo es, hay que prestar mucha atención y ser cuidadoso al elegir lo que filtrará.

import re

fh = open(r"C:\Users\Alfonso Zapata\jupyter\Cursos\Junio 2022\Curso de expresiones regulares - platzi\REGEX-master\liners.txt", "r").read()

fh

line = re.findall('\[LOG.*\[ERROR\].*', fh) 
print(line)
/\[LOG.*\[WARN\].*/g
/\[LOG.*\[LOG\].*/g
/\[LOG.*\[LOG\].*user:@celismx] .*/g

[LOG ENTRY] [ERROR] The system is unstable
[LOG ENTRY] [WARN] The system may be down
[LOG ENTRY] [WARN] Microsoft just bought Github
[LOG DATA] [LOG] Everything is OK
[LOG ENTRY] [LOG] [user:@beco] Logged in
[LOG ENTRY] [LOG] [user:@beco] Clicked here
[LOG DATA] [LOG] [user:@celismx] Did something
[LOG ENTRY] [LOG] [user:@beco] Rated the app
[LOG ENTRY] [LOG] [user:@beco] Logged out
[LOG LINE] [LOG] [user:@celismx] Logged in

Obtenemos todos los corchetes con algún contenido interno.

[.+?]

Con esta también pude encontrar las fechas de los logs en formato dias/mes/anio

\d{2,2}\/\w{3}\/\d{4,4}

Use esta Regex para encontrar direcciones IP en un archivo de logs

((\d{2,3}\.+\d{2,3}\.?))

Ejemplo

Tomando un archivo log de Apache que contiene la estampa de tiempo en el inicio de cada línea, es posible buscar los errores y filtrar aún más por los estados:

^.*\[error\].*state 7$

Para encontrar una fecha en forma dd-mm-aaaa

^(?:3[01]|[12][0-9]|0?[1-9])([\-/.])(0?[1-9]|1[1-2])\1\d{4}$

Esta solo encuentra la fecha

si lo que necesitamos es la linea donde esta la fecha

agregamos al inicio y fin .*

^.*(?:3[01]|[12][0-9]|0?[1-9])([\-/.])(0?[1-9]|1[1-2])\1\d{4}.*$

Ejemplos:
31.12.3013
01/01/2013
5-3-2013
15.03.2013

para encontrar la etiqueta [error]

^.*\[error\].*$

Y de esta otra forma todas las lineas que contengas direcciones IP

^.*[0-9]+(?:\.[0-9]+){3}.*$

De esta forma encontramos solo las direcciones IP

[0-9]+(?:\.[0-9]+){3}

[LOG ENTRY] [WARN] Microsoft just bought Github
😆

revisión de un fichero de apache
https://regexr.com/6ahj6

obtener

  • ip o url
  • fecha hora y puerto
  • texto (verbo + url + protocolo)
  • codigo de salida 200, 404, …
  • total de bytes

expression

(([\d.]{7,16})|([\w\.]+)) - - (\[.+?\]) "(.+?)" (\d{3}) (\d+)

extracto de Traza

64.242.88.10 - - [07/Mar/2004:16:05:49 -0800] "GET /twiki/bin/edit/Main/Double_bounce_sender?topicparent=Main.ConfigurationVariables HTTP/1.1" 401 12846
lj1036.inktomisearch.com - - [07/Mar/2004:17:18:36 -0800] "GET /robots.txt HTTP/1.0" 200 68
64.242.88.10 - - [07/Mar/2004:16:10:02 -0800] "GET /mailman/listinfo/hsdivision HTTP/1.1" 200 6291
64.242.88.10 - - [07/Mar/2004:16:11:58 -0800] "GET /twiki/bin/view/TWiki/WikiSyntax HTTP/1.1" 200 7352
64.242.88.10 - - [07/Mar/2004:16:20:55 -0800] "GET /twiki/bin/view/Main/DCCAndPostFix HTTP/1.1" 200 5253

Detalle linea 1

64.242.88.10 - - [07/Mar/2004:16:05:49 -0800] "GET /twiki/bin/edit/Main/Double_bounce_sender?topicparent=Main.ConfigurationVariables HTTP/1.1" 401 12846
64.242.88.10
64.242.88.10
<empty>
[07/Mar/2004:16:05:49 -0800]
GET /twiki/bin/edit/Main/Double_bounce_sender?topicparent=Main.ConfigurationVariables HTTP/1.1
401
12846

Detalle linea 2

lj1036.inktomisearch.com - - [07/Mar/2004:17:18:36 -0800] "GET /robots.txt HTTP/1.0" 200 68
lj1036.inktomisearch.com
<empty>
lj1036.inktomisearch.com
[07/Mar/2004:17:18:36 -0800]
GET /robots.txt HTTP/1.0
200
68

regexr.com/6ahib

expression

^(\d{2}:?){3}\.\d{3} \[(.+)\] (DEBUG|WARN) (\w+\.?){5} - (.*)$

Texto

16:59:22.057 [main] DEBUG com.chuidiang.ejemplos.logback.LogBackBasicExample - Hello world.
16:59:22.062 [main] WARN com.chuidiang.ejemplos.logback.LogBackBasicExample - Hello world.!!

Descomposición en 5 grupos

  • minutos
  • contenido del corcherte [ ]
  • tipo de mensaje si es DEBUG o WARN
  • nombre de la clase
  • texto

Detalle linea 1

16:59:22.057 [main] DEBUG com.chuidiang.ejemplos.logback.LogBackBasicExample - Hello world.
22
main
DEBUG
LogBackBasicExample
Hello world.

Detalle linea 2

16:59:22.062 [main] WARN com.chuidiang.ejemplos.logback.LogBackBasicExample - Hello world.!!
22
main
WARN
LogBackBasicExample
Hello world.!!

Una muy sencilla, todas las peticiones GET que envien el parametro REV 1.N

^.*"GET.*rev=1.[1-9]+

Ciertamente trabajar con Logs es uno de los ejemplos más utilizados, por ejemplo, lo utilizo para parsear orígenes de Logs que no tengan integración nativa en el SIEM (IBM QRadar) para poder extraer los campos que queremos tener de ese origen de datos.

Probe unsando grep en los logs de pacman para ver todos los paquetes que se han instalado:

 grep -E installed' '\w+ pacman.log

![](

Usé esta expresión regular para buscar direcciones IP

(\d{1,3}\.){3,3}(\d{2,2}){1,1}
\]\s?\"GET

------------------------------------------------------------
64.242.88.10 - - [07/Mar/2004:16:10:02 -0800] "GET /mailman/listinfo/hsdivision HTTP/1.1" 200 6291
64.242.88.10 - - [07/Mar/2004:16:11:58 -0800] "GET /twiki/bin/view/TWiki/WikiSyntax HTTP/1.1" 200 7352
64.242.88.10 - - [07/Mar/2004:16:20:55 -0800] "GET 

11. Mis apuntes sobre: “Logs”

  • 1. Ejemplo regex: Aplicando negación para buscar logs exactos
^\[LOG.*\[WARN.*\].*$

-Explicación 1: Encuentra y selecciona [match] que sea exactamente una línea que inicie con
[LOG luego tenga 0 o más caracteres, luego [WARN luego 0 o más caracteres, luego ], luego
0 o más caracteres.
’
’

  • 2. Ejemplo regex: Aplicando negación para buscar logs exactos
^\[LOG.*\[LOG\].*user:@celismx\].*$

-Explicación 2: Encuentra y selecciona [match] que sea exactamente una línea que inicie con
[LOG luego tenga 0 o más caracteres, luego [LOG] luego 0 o más caracteres, luego user:@celismx],
luego 0 o más caracteres.
’
’

  • 3. Ejemplo regex: Aplicando negación para buscar logs exactos
^\[LOG.*\[LOG\].*user:@\w+?\] .*$

-Explicación 3: Encuentra y selecciona [match] que sea exactamente una línea que inicie con
[LOG luego tenga 0 o más caracteres, luego [LOG] luego 0 o más caracteres, luego user:@,
luego 0 o más palabras (words), luego ]. luego un espacio en blanco, luego 0 o más caracteres.
’
’

El filtrado de logs para encontrar puntualmente la información de determinados eventos.

Cada vez me gusta mas este curso

.*WARN.*
.*LOG.*celismx.*
.*LOG.*user.*

Muy interesante!

excelente clase

Buscar los registros de LOG:

^\[LOG.*(.*LOG.*).*$

^\d{2,3}.\d{2,3}.\d{2,3}.\d{2,3}."POST.$

mi código

^\[LOG.*\[LOG\].*user:@\w+?\] .*$

Logs

[LOG ENTRY] [ERROR] The system is unstable
[LOG ENTRY] [ERROR] The system is unstable
[LOG ENTRY] [ERROR] The system is unstable
[LOG ENTRY] [ERROR] The system is unstable
[LOG ENTRY] [ERROR] The system is unstable
[LOG ENTRY] [ERROR] The system is unstable
[LOG ENTRY] [ERROR] The system is unstable
[LOG ENTRY] [WARN] The system may be down
[LOG ENTRY] [LOG] Everything is OK
[LOG ENTRY] [LOG] [user:@beco] Logged in
[LOG ENTRY] [LOG] [user:@beco] Clicked here
[LOG ENTRY] [LOG] [user:@celismx] Rated the app
[LOG ENTRY] [LOG] [user:@beco] Logged out
[LOG ENTRY] [LOG] [user:@celismx] Rated the app
[LOG ENTRY] [LOG] [user:@celismx] Logged out

mi expresion para traer ip con xxx.xxx.x.xxx

^(\d{1,3}[.\d]){4,4}$

^[LOG.ERROR].$

[LOG ENTRY] [ERROR] The system is unstable
[LOG ENTRY] [WARN] The system may be down
[LOG ENTRY] [WARN] Microsoft just bought Github

Corriendo como demonios… ja ja ja…

Excelente.

muy buena clase excelente conocer toda la potencia que puede llegar a tener una expresión regular a comparacion de un simple ctrl + f XD

Sublime tiene esa función así que es otra opción 😉

Buenas noches

En esta expression no tengo claro que funcion tienen los backslash antes de los corchetes:
^[LOG.*[WARN*].user:@celismx**] .*$
Alguien puede darme un manito con la ecplicacion ?

excelente!

super

//buscamos todo lo que inicie con log y le siga un log con cualquier usuario

[LOG ENTRY] [ERROR] The system is unstable //no hace match
[LOG ENTRY] [WARN] The system may be down //no hace match
[LOG ENTRY] [LOG] Everything is
[LOG ENTRY] [LOG] [user:@beco] Logged in
[LOG ENTRY] [LOG] [user:@beco] Clicked here
[LOG ENTRY] [LOG] [user:@beco] Rated the app
[LOG ENTRY] [LOG] [user:@beco] Logged out

^\[LOG.*\[LOG\].*user:@\w+?\] .*$

^[LOG.*[LOG.beco.$

No encontré archivos log pero sí encontré el log del repositorio del curso de Git.

Muchas gracias por la explicación de esta utilidad instructor Alberto. Respecto al reto esta fue la última línea de uno de los proyectos que tenía:

sourceId=datosOrganismos:msgp[severity=(ERROR 2), summary=(No se pudo realizar conexión con el GeoCodificador, verifique...), detail=(No se pudo realizar conexión con el GeoCodificador, verifique...)]

Esta fue la expresión regular que use para filtrarla de todas las demas:

^\w*.+\[.+\(ERROR.*\).*

Como podría hacer para buscar con regex un archivo de log con la fecha mas actual y la hora ? el sistema de donde descargo archivos los guarda por días y por horas ?

Recuerdo que una vez vi que la particion del disco duro en la que estaba la carpeta raiz de linux, estaba al tope , solo le habia dado como 35GB y de alguna forma llegué que en la carpeta que contiene los Logs habían dos archivos con 8GB de peso cada una, cuando quise abrirlos con un editor, este se quedó colgado. Luego pude leerlo con tail en la consola, aun soy novato en linux, pero descubrí leyendo esas ultimas lineas del log que la particion donde estaba linux estaba llena justamente por esos dos logs y me generaba un problema ya que no podia pasar de la ventana del login a pesar de pasar bien mis credenciales.

Warning!: Microsoft just bought Github

jajajaj

Basta de editores de texto, lo cool es usar la consola en Linux

El código en grep (consola en linux) para buscar todos los Logged In/Out

grep -E -nio '^.+\[LOG.+\].+Log.+' logs.txt

El contenido del archivo que uso el profe esta en los links en las primeras clases, pero de cualquier manera les dejo un poco de material para que practiquen:

1:[LOG ENTRY] [ERROR] The system is unstable
2:[LOG ENTRY] [WARN] The system may be down
3:[LOG ENTRY] [WARN] Microsoft just bought Github
4:[LOG DATA] [LOG] Everything is OK
5:[LOG ENTRY] [LOG] [user:@irving] Logged in
6:[LOG ENTRY]  [LOG] [user:@irving] Clicked here
7:[LOG DATA]  [LOG] [user:@celismx] Did something
8:[LOG ENTRY]  [LOG] [user:@irving] Rated the app
9:[LOG ENTRY]  [LOG] [user:@irving] Logged out
10:[LOG LINE]  [LOG] [user:@celismx] Logged in

Excelente clase!!!

Para los que no saben que es log básicamente y resumidamente es un archivo que registra eventos e información que ocurren en un sistema operativo o otro tipo de software similar.

¿Qué hicimos?

  • ^ Recuerda que este símbolo es para indicar una nueva línea
  • [ Recuerda que el corchete se puede usar para crear clases por lo que se debe de indicar va a ser parte de nuestra búsqueda y no para crear una clase por lo que se usa el carácter “”
  • .* Aquí decimos que encuentre lo que sea
  • $ fin de línea
     
    ^[LOG.[WARNING].$
    ^[LOG.[ERROR].$
    Por lo que le decimos a nuestro buscador mis indicaciones deben de hacer match en una sola línea deben de empezar con [LOG después puede haber cualquier cosas pero debe de seguirle un [WARNING] o [ERROR] (dependiendo el caso) y puede haber o no más cosas después
     
    ^[LOG.*[ERROR].user:@celismx] .$

^[LOG.*[ERROR].user:@\w+] .$\

Mis instrucciones debe de hacer match en una línea, debe empezar con un [LOG puede seguir lo que sea pero debe de haber un [ERROR] después puede haber más cosas pero debe de aparecer un user:@ cualquier cosas ] y puede haber o no más cosas

Mi expresión para encontrar todos los logs de Mon Mar 8 en el transcurso de las 3 de la tarde

^\[Mon Mar 8 03:..*$```