Foros del Web » Programación para mayores de 30 ;) » Java »

Ocultar cierto texto en log4j

Estas en el tema de Ocultar cierto texto en log4j en el foro de Java en Foros del Web. Hola, alguna idea de como instruir al Log4j para que antes de escribir en el log, llame a una función que yo hice que reemplaza ...
  #1 (permalink)  
Antiguo 31/07/2015, 10:37
 
Fecha de Ingreso: julio-2015
Mensajes: 2
Antigüedad: 9 años, 3 meses
Puntos: 0
Ocultar cierto texto en log4j

Hola, alguna idea de como instruir al Log4j para que antes de escribir en el log, llame a una función que yo hice que reemplaza ciertos caracteres en el mensaje. La función recibe 2 parametros, el mensaje y la palabra que se debe reemplazar (ocultar con astriscos).

De antemano, gracias.
  #2 (permalink)  
Antiguo 31/07/2015, 11:36
Avatar de GusGarsaky  
Fecha de Ingreso: febrero-2015
Mensajes: 33
Antigüedad: 9 años, 8 meses
Puntos: 2
Respuesta: Ocultar cierto texto en log4j

Con Interceptors de CDI puedes hacerlo. Primero creas tu interceptor:

Código Java:
Ver original
  1. @InterceptorBingind
  2. @Retention(RUNTIME)
  3. @Target({FIELD, TYPE, METHOD, PARAMETER})
  4. public @interface LoggingInterceptor { }


Código Java:
Ver original
  1. @Interceptor
  2. @LoggingInterceptor
  3. public class LoggingInterceptor {
  4.    
  5.     @AroundInvoke
  6.     public Object interceptLogging(InvocationContext ic) throws Exception {
  7.         Message message = LoggerMessage.message;
  8.         // por ejemplo reemplazas letras por asteriscos
  9.         LoggerMessage.message = message.replaceAll("(?s).", "*");
  10.     }
  11. }

Esta clase es el interceptor. El método con la anotación @AroundInvoke se ejecutará automáticamente cuando se detecte una llamada al método que intercepta.

El mensaje de log, debe estar en una clase para poderse interceptar:

Código Java:
Ver original
  1. public class LoggerMessage {
  2.     public String message;
  3. }

Y aquí cómo la usuarias. Esta es una clase.

Código Java:
Ver original
  1. String password = "AxBj3xk92$//";
  2. LoggerMessage.message = password; // hasta aquí vale 'AxBj3xk92$//'
  3. this.log("La contraseña es: " + LoggerMessage);
  4.  
  5. ...
  6.  
  7. // método que hace en log y es interceptado
  8. @LoggingInterceptor
  9. public void log(String message) {
  10.     logger.log(message); // aquí ya vale '************'
  11. }

Te servirá tanto si usas un servidor de aplicaciones o no. Si es una aplicación de escritorio, debes de agregar la librería weld (implementación de CDI) para poder hacer uso de los interceptores. Esto deberías hacerlo al principio de todo.

Código Java:
Ver original
  1. // inicia el contenedor CDI
  2. Weld weld = new Weld();
  3. WeldContainer container = weld.initalize();


Además, en el web.xml (debe estar dentro de META-INF), debe ir declarado el interceptor:

Código XML:
Ver original
  1. <interceptors>
  2.     <class>ruta.a.tu.paquete.LoggingInterceptor</class>
  3. </interceptors>
  #3 (permalink)  
Antiguo 31/07/2015, 12:17
 
Fecha de Ingreso: julio-2015
Mensajes: 2
Antigüedad: 9 años, 3 meses
Puntos: 0
Respuesta: Ocultar cierto texto en log4j

Gracias por la pronta respuesta, pero veo que de esa forma debería intervenir todos los programas que usan el logger.

La idea es intervenir sólo el logger en el servidor para que así se filtren todos los mensajes provenientes de las distintas aplicaciones que son muchas. Por ejemplo se pueden usar appenders para filtrar mensajes que contengan, por ejemplo, la palabra "APLICACION1" y se escriban en un archivo de log distinto al server.log.

<appender name="AppenderParaRedirigirMensajesDeAplicacion1" class="org.jboss.logging.appender.DailyRollingFile Appender">
<errorHandler class="org.jboss.logging.util.OnlyOnceErrorHandler "/>
<param name="File" value="${jboss.server.log.dir}/aplicacion1.log"/>
<param name="Append" value="true"/>
<filter class="org.apache.log4j.varia.StringMatchFilter">
<param name="StringToMatch" value="APLICACION1" />
<param name="AcceptOnMatch" value="true" />
</filter>
<filter class="org.apache.log4j.varia.DenyAllFilter"/>
</appender>

Así de esta forma cuando llegue un mensaje que contenga la palabra APLICAION1, este se guardará en el archivo de log aplicaion1.log.

Necesito algo parecido pero que cuando llegue un mensaje primero sea invocada mi rutina para que escanee el mensaje y lo devuelva ya filtrado antes de escribir en el log.

Atento a sus comentarios.
  #4 (permalink)  
Antiguo 31/07/2015, 13:17
Avatar de GusGarsaky  
Fecha de Ingreso: febrero-2015
Mensajes: 33
Antigüedad: 9 años, 8 meses
Puntos: 2
Respuesta: Ocultar cierto texto en log4j

Y por qué no solo encapsulas el logger para que primero reemplace:

Código Java:
Ver original
  1. public class Logger {
  2.    
  3.     private String message;
  4.     private Logger logger;
  5.    
  6.     public Logger(Class c) {
  7.         logger = Logger.getLogger(c.getName())
  8.     }
  9.    
  10.     public Logger filter(String mesage, char[] digitsToReplace) {
  11.         String regex = "[";
  12.         for(char c : digitsToReplace) {
  13.             regex += c;
  14.         }
  15.         regex += "]";
  16.         this.message = message.replaceAll(message, chars);
  17.  
  18.         return this;
  19.     }
  20.     public void log() {
  21.         logger.log(message);
  22.     }
  23.    
  24. }

JSP:

Código XML:
Ver original
  1. <form action="MessageServlet" method="post">
  2.     <input type="text" name="message" placeholder="Envíe su mensaje" />
  3.     <input type="submit" value="Enviar" />
  4. </form>

Servlet:

Código Java:
Ver original
  1. Logger logger = new Logger(EsteServlet.class);
  2. // message = "E$ste es #un mens&aje de pr%ueba";
  3. String message = request.getParameter("message");
  4. logger
  5.     .filter(mesage, new char[] {'$', '#', '&', '%'})
  6.     .log(); // Imprime 'Este es un mensaje de prueba'

O puedes hacerlo de frente, yo creé el método filter para modularizar, pero puedes hacer el reemplazo en el mismo método que hace el log.

PD: En el ejemplo uso el logger por defecto xD. Adaptalo a log4j.

Última edición por GusGarsaky; 31/07/2015 a las 13:26

Etiquetas: filtros, log4j
Atención: Estás leyendo un tema que no tiene actividad desde hace más de 6 MESES, te recomendamos abrir un Nuevo tema en lugar de responder al actual.
Respuesta




La zona horaria es GMT -6. Ahora son las 12:37.