Estos días he trabajado en un script (python) que me permite parsear mi archivo de syslog y subirlo parseado a un DB postgreql, ésta es la primera prueba en la cual pude insertar 3'789.433 líneas en 29 minutos en un equipo modesto, si alguien tiene sugerencias para mejorar el script agradeceré la colaboración
El script normaliza las líneas del syslog quitando espacios innecesarios y separando cada campo en una nueva variable, también parsea el mensaje enviado por el servicio slapd (motivo del análisis), por el momento inserta los datos en una sola tabla, el objetivo es armar algo así como un data warehouse de logs, y otros datos más que nos sirvan.
Aquí les va el script
import re
import datetime
import pg
import sys
import os
import mmap
def abrir_archivo(archivo):
archivo_log = open(archivo,"r")
return archivo_log
def cerrar_archivo(archivo_abierto):
archivo_abierto.close()
def lee_log_file(archivo):
a=abrir_archivo(archivo)
lista=a.readlines();
cerrar_archivo(a)
return lista
def normaliza_linea(linea):
linea = re.sub("\n","",re.sub("\s\s+"," ",linea))
return linea
def parsea_msg_ldap(linea):
if re.search('^conn=(.*)op=',linea):
ldap=linea.split(None,2)
ldap_msg=['op',re.sub("\D","",ldap[0]),re.sub("\D","",ldap[1]),ldap[2].lower()]
elif re.search('^conn=(.*)fd=',linea):
ldap=linea.split(None,2)
ldap_msg=['fd',re.sub("\D","",ldap[0]),re.sub("\D","",ldap[1]),ldap[2].lower()]
else:
ldap_msg=[linea,'-1','-1','-1']
return ldap_msg
def parsear_linea(linea):
mes=carga_meses()
valores=linea.split(None,5)
parseado=[None]*5
parseado[0]=str(datetime.date.today().year)+"-"+mes[valores[0]]+"-"+valores[1]
parseado[1]=valores[2]
parseado[2]=valores[3]
parseado[3]=re.sub("[\d,\[,\],\:]","",valores[4]).lower()
if parseado[3]=='slapd':
parseado[4]=re.sub("[\D]","",valores[4])
parseado+=parsea_msg_ldap(valores[5])
else:
parseado[4]='-1'
parseado.append(valores[5])
parseado.append('-1')
parseado.append('-1')
parseado.append('-1')
return parseado
def carga_meses():
meses={'Jan':'01','Feb':'02','Mar':'03','Apr':'04','May':'05','Jun':'06','Jul':'07','Aug':'08','Sep':'09','Oct':'10','Nov':'11','Dic':'12'}
return meses
def abre_db():
conex=pg.connect(dbname='loguno',user='mike')
accion0=conex.query('BEGIN WORK')
return conex
def cierra_db(conex):
accion0=conex.query('COMMIT')
conex.close()
def insertar_log(linea,tabla,conex):
insertar='INSERT INTO '+tabla+' VALUES (nextval(\'seq_bruta\'),\''+linea[0]+'\',\''+linea[1]+'\',\''+linea[2]+'\',\''+linea[3]+'\','+linea[4]+',\''+linea[5]+'\','+linea[6]+','+linea[7]+',E\''+linea[8]+'\')'
accion=conex.query(insertar)
# Flujo del Script
log_archivo = "/prueba/mi_syslog_de_prueba"
log_tam = os.path.getsize(log_archivo)
tam_arch_map = 524288
pos1 = 0
if (log_tam > tam_arch_map):
pos2 = pos1+tam_arch_map
else:
pos2 = pos1+log_tam
todo = abrir_archivo(log_archivo)
todo.seek(0)
mapped = mmap.mmap(todo.fileno(),0,access=mmap.ACCESS_READ)
while (pos1 < log_tam):
con=abre_db()
mapped.seek(pos1)
pos2 = mapped.rfind('\n',pos1,pos2)
mapped.seek(pos1)
texto = mapped.read(pos2-pos1)
lineas = texto.split('\n')
for logs in lineas:
logs=normaliza_linea(logs)
campos = parsear_linea(logs)
insertar_log(campos,'syslog',con)
cierra_db(con)
pos1 = pos2 + 1
pos2 = pos2+tam_arch_map
if (pos2 >= log_tam):
pos2 = log_tam
mapped.close()
cerrar_archivo(todo)
miércoles, 23 de septiembre de 2009
jueves, 17 de septiembre de 2009
Los primeros pasos, recolectando información
Mi primer objetivo es armar un DataWarehouse con logs de ldap y otros más que me puedan ser de utilidad, es decir aquellos logs donde pueda encontrar algo que hizo que ldap falle.
Pero centrémonos en el problema.
Hoy tengo un archivo de prueba el cual contiene cerca de 4'000.000 de líneas con actividad de ldap y quiero subirlo en una base de datos en un formato que sea útil, o humanamente leíble (cat logs > /dev/humano) y además que no ocupe tanto espacio, todos por el momento voy a tratar cada problema por separado.
Mi primer intento fallido fue al realizar un script (bash) para separar los campos y luego subirloa a la base de datos o al menos testear como va esto.
Por que intento fallido.....
Dejé corriendo el script y al volver un día después no había procesado ni el 3% del archivo, cuestión por la cual había que modificar la idea.
Continué con un par de intentos modificando el script pero no fue lo que necesitaba.
Hoy me encuentro aprendiendo python (por recomendaciones) y voy en mi nuevo test con pocos datos, al parecer el tiempo puede bajar en relación a mi prueba anterior exponencialmente, pero aún no la concluyo.
Proximamente publicaré el script para comentarios y/o/u sugerencias, al momento hice una prueba inicial con tiempos alentadores
Pero centrémonos en el problema.
Hoy tengo un archivo de prueba el cual contiene cerca de 4'000.000 de líneas con actividad de ldap y quiero subirlo en una base de datos en un formato que sea útil, o humanamente leíble (cat logs > /dev/humano) y además que no ocupe tanto espacio, todos por el momento voy a tratar cada problema por separado.
Mi primer intento fallido fue al realizar un script (bash) para separar los campos y luego subirloa a la base de datos o al menos testear como va esto.
Por que intento fallido.....
Dejé corriendo el script y al volver un día después no había procesado ni el 3% del archivo, cuestión por la cual había que modificar la idea.
Continué con un par de intentos modificando el script pero no fue lo que necesitaba.
Hoy me encuentro aprendiendo python (por recomendaciones) y voy en mi nuevo test con pocos datos, al parecer el tiempo puede bajar en relación a mi prueba anterior exponencialmente, pero aún no la concluyo.
Proximamente publicaré el script para comentarios y/o/u sugerencias, al momento hice una prueba inicial con tiempos alentadores
Etiquetas:
bash,
Data Mining,
ldap,
log,
postgresql,
python
Análisis de logs
Me había planteado realizar un análisis de logs, y he comenzado con armar un dataset que me sirva para detectar alguna anomalía.
Les cuento el back-stage de esto:
Tengo servidores ldap que interactuan con samba, eventualmente estos también lo hacen con otras aplicaciones (que son la minoría).
El log donde ldap (openLdap en mi caso) guarda sus actividades es syslog, en ocasiones me he encontrado con que este llega a tener 7'000.000 (aprox) diarias de líneas, identificar algo raro de entre lleva su tiempo, entonces he decidido usar Data Mining para identificar anomalías.
Les cuento el back-stage de esto:
Tengo servidores ldap que interactuan con samba, eventualmente estos también lo hacen con otras aplicaciones (que son la minoría).
El log donde ldap (openLdap en mi caso) guarda sus actividades es syslog, en ocasiones me he encontrado con que este llega a tener 7'000.000 (aprox) diarias de líneas, identificar algo raro de entre lleva su tiempo, entonces he decidido usar Data Mining para identificar anomalías.
Etiquetas:
Data Mining,
ldap,
log,
openLdap,
syslog
lunes, 20 de abril de 2009
Data Mining en tiempos de crisis
Bueno al igual que el resto del mundo a mis oídos también han llegado noticias de la crisis mundial, he escuchado a muchos y he puesto atención a pocos, y de igual manera que muchos yo también tengo que decir que las crisis son creadoras de oportunidades, oportunidades que no existirían de no ser por nuestros gurus modernos.
En si hoy escribo acá para dar mi punto de vista de por que Data Mining puede ser una oportunidad en esta crisis.
Grandes empresas (multinacionales sobre todo) han recortado muchos gastos para poder sobrevivir a la crisis y muchas consultoras están a la espera de que estas se recuperen para tener a quien brindar sus servicios, por otro lado empresas pequeñas las cuales por su localismo y pequeño tamaño no han visto aun la diferencia de una crisis en pleno, esto nos pone sobre el tapete 2 escenarios muy marcados.
En el caso de las grandes empresas utilizar Data Mining para optimizar sus procesos y reducir gastos puede ser significativo, lo que les llevaría a un mejor desempeño pero posiblemente no sea lo suficiente, grandes proyectos de les pueden ahorra unos cuantos millones de dolares mas puede llegar a ser un porcentaje muy bajo para sus expectativas, en este escenario todo dependerá de quien tenga que tomar la decisión de invertir o no en un proyecto de este tipo.
En el segundo caso, se nos presenta el reto de crecer junto a empresas con recursos limitados, los cuales pueden significar un reto al momento de tomar decisiones, si un reto, el reto de hacer las cosas justas con lo justo, que quiero decir, supongamos que una empresa necesita hacer una campaña de marketing pero su presupuesto es de x monedas (x es pequeño), las opciones son pocas por lo general y si quien encabeza el departamento que tomara una decisión no tiene visión puede ser que termine por invertir el recortado presupuesto en una campana no adecuada, pero el Data Mining podría ayudar en este caso a puntualizar y elegir de una manera optima a donde apuntar, nos puede ayudar a seleccionar los clientes mejor rankeados en un análisis que nos diga quien esta interesado en nuestro producto, o nos puede ayudar a elegir que campaña seria la mejor aceptada, y si a todo esto le ponemos los costos que implica cada cosa podemos tener resultados muy exitosos con presupuestos bajos.
Que métodos de Data Minig a utilizar? los que resulten mejores acorde al análisis, en ese punto sigo investigando.
En si hoy escribo acá para dar mi punto de vista de por que Data Mining puede ser una oportunidad en esta crisis.
Grandes empresas (multinacionales sobre todo) han recortado muchos gastos para poder sobrevivir a la crisis y muchas consultoras están a la espera de que estas se recuperen para tener a quien brindar sus servicios, por otro lado empresas pequeñas las cuales por su localismo y pequeño tamaño no han visto aun la diferencia de una crisis en pleno, esto nos pone sobre el tapete 2 escenarios muy marcados.
En el caso de las grandes empresas utilizar Data Mining para optimizar sus procesos y reducir gastos puede ser significativo, lo que les llevaría a un mejor desempeño pero posiblemente no sea lo suficiente, grandes proyectos de les pueden ahorra unos cuantos millones de dolares mas puede llegar a ser un porcentaje muy bajo para sus expectativas, en este escenario todo dependerá de quien tenga que tomar la decisión de invertir o no en un proyecto de este tipo.
En el segundo caso, se nos presenta el reto de crecer junto a empresas con recursos limitados, los cuales pueden significar un reto al momento de tomar decisiones, si un reto, el reto de hacer las cosas justas con lo justo, que quiero decir, supongamos que una empresa necesita hacer una campaña de marketing pero su presupuesto es de x monedas (x es pequeño), las opciones son pocas por lo general y si quien encabeza el departamento que tomara una decisión no tiene visión puede ser que termine por invertir el recortado presupuesto en una campana no adecuada, pero el Data Mining podría ayudar en este caso a puntualizar y elegir de una manera optima a donde apuntar, nos puede ayudar a seleccionar los clientes mejor rankeados en un análisis que nos diga quien esta interesado en nuestro producto, o nos puede ayudar a elegir que campaña seria la mejor aceptada, y si a todo esto le ponemos los costos que implica cada cosa podemos tener resultados muy exitosos con presupuestos bajos.
Que métodos de Data Minig a utilizar? los que resulten mejores acorde al análisis, en ese punto sigo investigando.
Suscribirse a:
Entradas (Atom)