Pregunta
Tengo un apéndice que solo quiero que aparezcan los primeros X caracteres (para este ejemplo, diremos 5) del mensaje.
Estoy usando un PatternLayout pero no puedo obtener el mensaje para truncar el mensaje correctamente.
Por ejemplo, si mi mensaje de registro es
El zorro marrón rápido
Solo quiero ver:
La q
Cuando uso esto en el Patrón
% .5m
me sale
n fox
ya que esos son los últimos 5 caracteres.
He buscado el PattenLayout javadoc, pero no pude encontrar nada. Sé que es un poco extraño no querer ver el mensaje completo, pero para este apéndice específico tiene sentido. Registro el mensaje completo en un apéndice diferente. Me gustaría evitar escribir una clase personalizada si es posible.
Solución
El truncamiento se realiza desde el principio de un mensaje de forma predeterminada (difiere de printf en C, que lo hace desde el final).
El patrón apropiado debería ser:
%.-5m
EDITAR:
Acabo de probar esto, y a log4j no le gusta ese patrón. Sin embargo, el patrón suministrado funcionará bien en LOGBack, si puede hacer el cambio. Si no puede cambiar su proveedor de registro, puede realizar una modificación única a log4j. El interesante fragmento de código aparece en las líneas 75-76 de org.apache.log4j.helpers.PatternConverter:
if(len > max)
sbuf.append(s.substring(len-max));
Esto debería leer:
if(len > max)
sbuf.append(s.substring(0,max));
Simplemente puede hacer la modificación y recompilar el jar para su uso, o puede subclasificar PatternConverter para realizar el truncamiento adecuado. Esto también requerirá una nueva versión de PatternLayout, que contiene el método createPatternParser, que deberá anular en su subclase para crear una instancia de su nueva versión de PatternConverter.
Como nota al margen, tenga en cuenta las ramificaciones de licencia de modificar el código fuente abierto en su proyecto específico.