Pergunta
Eu tenho um Appender que só quero os primeiros X caracteres (para este exemplo, diremos 5) da mensagem para exibir.
Estou usando um PatternLayout, mas não consigo obter a mensagem para truncar a mensagem corretamente.
Por exemplo, se minha mensagem de log for
A rápida Raposa marrom
Eu só quero ver :
O q
Quando eu uso isso no padrão
%.5m
eu recebo
N Fox
Como esses são os últimos 5 caracteres.
Eu olhei Pattenlayout Javadoc, mas não conseguiu encontrar nada. Sei que isso é um pouco estranho não querer ver a mensagem inteira, mas para esse appender específico faz sentido. Eu registro a mensagem inteira em um Appender diferente. Eu gostaria de evitar escrever uma aula personalizada, se possível.
Solução
O truncamento é feito desde o início de uma mensagem por padrão (difere do Printf em C, que o faz desde o final).
O padrão adequado deve ser:
%.-5m
EDITAR:
Eu apenas tentei isso, e o LOG4J não gosta desse padrão. No entanto, o padrão fornecido funcionará bem no logback, se você puder fazer o interruptor. Se você não puder alternar seu provedor de log, poderá fazer uma modificação única para o LOG4J. O bit interessante de código aparece nas linhas 75-76 de org.apache.log4j.helpers.patternconverter:
if(len > max)
sbuf.append(s.substring(len-max));
Isso deve ler:
if(len > max)
sbuf.append(s.substring(0,max));
Você pode simplesmente fazer a modificação e recompilar o frasco para seu uso, ou pode subclasse o PatternConverter para executar o truncamento adequado. Isso também exigirá uma nova versão do PatternLayout, que contém o método CreatePatternParser, que você precisará substituir na sua subclasse para instanciar sua nova versão do PatternConverter.
Como nota lateral, esteja ciente das ramificações de licenciamento da modificação do código -fonte aberto em seu projeto específico.