• Publicidad

Leer un log en XML, extraer un párrafo en variables

¿Apenas comienzas con Perl? En este foro podrás encontrar y hacer preguntas básicas de Perl con respuestas aptas a tu nivel.

Leer un log en XML, extraer un párrafo en variables

Notapor SJG3226X » 2016-12-07 03:42 @196

Buenos días,

Necesito leer un fichero de log en XML (soap.log). De este fichero, necesito:

1. que busque los errores 500: <codigo>-500</codigo>

2. que si encuentra lo anterior se quede con el párrafo que va desde <GBPFault> hasta </GBPFault>

3. que si se cumplen las dos premisas anteriores, que capture como variables el <level>X</level>, el <message>XXXX </message> y el <appname>XXX </appname>.

Además me surge la duda de cómo hacer algún tipo de "marca de agua" para que no saque dos errores iguales, ya que el script lo metería en el Omnibus para que cada 5 minutos leyera el log.

Estoy leyendo en este foro y en otros y la verdad es que encuentro bastantes cosas, pero me está costando mucho compilarlas todas hasta dar con cubrir todas las necesidades para generar correctamente estas alarmas.

Sintáxis: [ Descargar ] [ Ocultar ]
Using xml Syntax Highlighting
  1. <GBPFault>
  2.     <Errors>
  3.         <message>Unable to compose the document. Please check EWS folders¦javax.xml.ws.soap.SOAPFaultException: Engine execution error.  Return code:  12</message>
  4.         <appname>OnlineComposition</appname>
  5.         <appid>GBP.0609_BM.BTT_CommonEAR</appid>
  6.         <codigo>-500</codigo>
  7.         <level>ERROR</level>
  8.        <component>OnlineComposition</component>
  9.         <method>Engine execution error.  Return code:  12</method>
  10.         <rootcase>ARQ Unable to compose the document. Please check EWS folders¦javax.xml.ws.soap.SOAPFaultException: Engine execution error.  Return code:  12</rootcase>
  11.         <operation>FI00002.pub/TP0009O</operation>
  12.         <idSesion>3IJLy_aZd8bHNUEADZJ7uTR</idSesion>
  13.         <idPeticion>A91E18AC3EEB450A9F1762CAA5C6D794</idPeticion>
  14.         <usuario>PARR2002</usuario>
  15.         <idTerminalFisico></idTerminalFisico>
  16.         <timestamp>2016-10-19 14:28:02.669</timestamp>
  17.         <type>DESCONOCIDO</type>
  18.     </Errors>
  19. </GBPFault>
Coloreado en 0.001 segundos, usando GeSHi 1.0.8.4
SJG3226X
Perlero nuevo
Perlero nuevo
 
Mensajes: 4
Registrado: 2015-11-20 04:26 @226

Publicidad

Re: Leer un log en XML, extraer un párrafo en variables

Notapor explorer » 2016-12-10 16:48 @741

Lo que no sabemos es si el soap.log se compone de uno o varios registros <GBPFault> como el que nos muestras.

Para el punto 1 te vale con usar una expresión regular, pero claro, depende luego para el punto 2 saber si todo el soap.log se compone de uno o más registros <GBPFault>.

Este es un código que intenta resolver el problema cuando solo hay un registro en todo el archivo:
Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
  1. #!/usr/bin/env perl
  2. use v5.14;
  3. use File::Slurp;
  4.  
  5. my $log = read_file('soap.log');
  6.  
  7. if ($log =~ m{(<GBPFault>(.+?)<codigo>-500</codigo>(.+?)</GBPFault>)}s) {
  8.     my $seccion = $1;
  9.  
  10.     my %variables;
  11.     for my $variable (qw(level message appname)) {
  12.  
  13.         if ($seccion =~ m{<$variable>(.*?)</$variable>}) {
  14.             $variables{$variable} = $1;
  15.         }
  16.     }
  17.  
  18.     use Data::Dumper;
  19.     say Dumper \%variables;
  20. }
Coloreado en 0.002 segundos, usando GeSHi 1.0.8.4
La salida es:
Sintáxis: [ Descargar ] [ Ocultar ]
Using text Syntax Highlighting
$VAR1 = {
          'message' => 'Unable to compose the document. Please check EWS folders¦javax.xml.ws.soap.SOAPFaultException: Engine execution error.  Return code:  12',
          'appname' => 'OnlineComposition',
          'level' => 'ERROR'
        };
Coloreado en 0.000 segundos, usando GeSHi 1.0.8.4
JF^D Perl programming & Raku programming. Grupo en Telegram: https://t.me/Perl_ES
Avatar de Usuario
explorer
Administrador
Administrador
 
Mensajes: 14476
Registrado: 2005-07-24 18:12 @800
Ubicación: Valladolid, España


Volver a Básico

¿Quién está conectado?

Usuarios navegando por este Foro: No hay usuarios registrados visitando el Foro y 1 invitado