Fusionando y ordenando archivos de registro en Python

Soy completamente nuevo en Python y tengo un problema grave que no puedo resolver.

Tengo algunos archivos de registro con estructura idéntica:

[timestamp] [level] [source] message 

Por ejemplo:

 [Wed Oct 11 14:32:52 2000] [error] [client 127.0.0.1] error message 

Necesito escribir un progtwig en Python puro que combine estos archivos de registro en un archivo y luego ordene el archivo combinado por marca de tiempo. Después de esta operación, deseo imprimir este resultado (el contenido del archivo combinado) en STDOUT (consola).

No entiendo cómo hacer esto, me gustaría ayuda. es posible?

Puedes hacerlo

 import fileinput import re from time import strptime f_names = ['1.log', '2.log'] # names of log files lines = list(fileinput.input(f_names)) t_fmt = '%a %b %d %H:%M:%S %Y' # format of time stamps t_pat = re.compile(r'\[(.+?)\]') # pattern to extract timestamp for l in sorted(lines, key=lambda l: strptime(t_pat.search(l).group(1), t_fmt)): print l, 

En primer lugar, querrá usar el módulo de entrada de fileinput para obtener datos de varios archivos, como:

 data = fileinput.FileInput() for line in data.readlines(): print line 

Que luego imprimirá todas las líneas juntas. También desea ordenar, lo que puede hacer con la palabra clave ordenada.

Suponiendo que sus líneas hubieran comenzado con [2011-07-20 19:20:12] , está de oro, ya que ese formato no necesita ninguna clasificación por encima y más allá del alfanum, por lo tanto:

 data = fileinput.FileInput() for line in sorted(data.readlines()): print line 

Como, sin embargo, tienes que hacer algo más complejo:

 def compareDates(line1, line2): # parse the date here into datetime objects NotImplemented # Then use those for the sorting return cmp(parseddate1, parseddate2) data = fileinput.FileInput() for line in sorted(data.readlines(), cmp=compareDates): print line 

Para obtener puntos de bonificación, incluso puede hacer

 data = fileinput.FileInput(openhook=fileinput.hook_compressed) 

lo que le permitirá leer en archivos de registro gzipped.

El uso sería entonces:

 $ python yourscript.py access.log.1 access.log.*.gz 

o similar.

En cuanto a la función de clasificación crítica:

 def sort_key(line): return datetime.strptime(line.split(']')[0], '[%a %b %d %H:%M:%S %Y') 

Esto debe usarse como el argumento key para sort o sorted , no como cmp . Es más rápido de esta manera.

Oh, y deberías tener

 from datetime import datetime 

en su código para hacer este trabajo.

Lea las líneas de ambos archivos en una lista (ahora se fusionarán), proporcione una función de comparación definida por el usuario que convierta la marca de tiempo en segundos desde la época, ordene las llamadas con la comparación definida por el usuario, escriba líneas en el archivo combinado …

 def compare_func(): # comparison code pass lst = [] for line in open("file_1.log", "r"): lst.append(line) for line in open("file_2.log", "r"): lst.append(line) # create compare function from timestamp to epoch called compare_func lst.sort(cmp=compare_func) # this could be a lambda if it is simple enough 

Algo así debería hacerlo.