2010-09-28 7 views
9

Estoy trabajando con una aplicación heredada de Java que no tiene registro y solo imprime toda la información en la consola. La mayoría de las excepciones también se "manejan" simplemente haciendo una llamada a printStackTrace().Expresión regular para analizar un archivo de registro y encontrar stacktraces

En pocas palabras, acabo de redirigir las secuencias System.out y System.error a un archivo de registro, y ahora tengo que analizar ese archivo de registro. Hasta ahora todo está bien, pero estoy teniendo problemas para analizar el archivo de registro de los rastros de pila.

Parte del código también está obstruido, así que tengo que ejecutar la pila de pistas a través de una aplicación de utilidad para eliminar la obstrucción. Estoy tratando de automatizar todo esto.

Lo más cerca que he llegado hasta ahora es conseguir que la línea de Excepción inicial utilizando la siguiente:

.+Exception[^\n]+ 

y encontrar el "en .. (..)" líneas usando:

(\t+\Qat \E.+\s+)+ 

Pero no puedo encontrar la manera de unirlos para obtener la stacktrace completa.

Básicamente, los archivos de registro se parecen a los siguientes. No hay una estructura fija y las líneas antes y después de seguimientos de pila son completamente al azar:

Modem ERROR (AT 
Owner: CoreTalk 
) - TIMEOUT 
IN [] 
Try Open: COM3 


javax.comm.PortInUseException: Port currently owned by CoreTalk 
    at javax.comm.CommPortIdentifier.open(CommPortIdentifier.java:337) 
... 
    at UniPort.modemService.run(modemService.java:103) 
Handling file: C:\Program Files\BackBone Technologies\CoreTalk 2006\InputXML\notify 
java.io.FileNotFoundException: C:\Program Files\BackBone Technologies\CoreTalk 2006\InputXML\notify (The system cannot find the file specified) 
    at java.io.FileInputStream.open(Native Method) 
... 
    at com.gobackbone.Store.a.a.handle(Unknown Source) 
    at com.jniwrapper.win32.io.FileSystemWatcher.fireFileSystemEvent(FileSystemWatcher.java:223) 
... 
    at java.lang.Thread.run(Unknown Source) 
Load Additional Ports 
... Lots of random stuff 
IN [] 

[Fatal Error] .xml:6:114: The entity name must immediately follow the '&' in the entity reference. 
org.xml.sax.SAXParseException: The entity name must immediately follow the '&' in the entity reference. 
    at com.sun.org.apache.xerces.internal.parsers.DOMParser.parse(Unknown Source) 
... 
    at com.gobackbone.Store.a.a.run(Unknown Source) 

Respuesta

8

Parece que sólo tiene que pegarlos juntos (y el uso de una nueva línea como pegamento):

.+Exception[^\n]+\n(\t+\Qat \E.+\s+)+ 

pero me gustaría cambiar su expresión regular un poco:

^.+Exception[^\n]++(\s+at .++)+ 

Esto combina el espacio en blanco entre las líneas at... y utiliza cuantificadores posesivos para evitar el retroceso.

+0

Eso solo encontrará la primera línea "a", no todas. –

+0

¿Lo has probado? Para eso está el '' 'final. ¿O puede haber algo entre las líneas "at" (están estos '...' presentes en los archivos de registro reales)? Además, en su texto de ejemplo (al menos tal como se publicó aquí), las líneas "a" comienzan con espacios, no con pestañas. Mi segunda expresión regular debería haber manejado esto, sin embargo. –

+0

Disculpa, no vi la segunda línea por algún motivo ... Utilizando: ^. + Excepción [^ \ n] ++ (\ s + at. ++) + No obtengo ninguna coincidencia. .. ¿Qué hace el ++? Es solo una abreviatura de: (^. + Excepción [^ \ n] +) + ((\ s + at. +) +) + –

3

Hemos estado utilizando antlr para abordar el análisis de los archivos de registro (en un área de aplicación es diferente). No es trivial, pero si esta es una tarea crítica para usted, será mejor que usar expresiones regulares.

+0

No es particularmente crítico, simplemente algo que estoy haciendo en mi tiempo libre para que sea más fácil para nosotros leer los archivos de registro cuando necesitamos apoyar a un cliente. ANTLR parece excesivo. –

+0

@ peter.murray.rust tal vez tengas un ejemplo de cómo analizar stacktraces desde log wile usando ANTLR? – kuldarim

0

puedo obtener buenos resultados utilizando

perl -n -e 'm/(Exception)|(\tat)/ && print' /var/log/jboss4.2/debian/server.log 

Se vuelca todas las líneas que tienen Excepción o \ tat en ellos. Dado que el partido es en el mismo tiempo que se guarda el orden.

Cuestiones relacionadas