Como fazer com que o XML escape no HTMLLayout do logback?
Pergunta
Estou usando o logback (com slf4j) para fazer o registro e tenho muito conteúdo XML para ser registrado em arquivos de texto e HTML (com HTMLLayout).No entanto, o logback apenas insere o XML bruto nas tags <TD> do HTMLLayout, sem nenhum escape ou processamento <pre>.
Aqui está o trecho do meu logback.xml:
<appender name="ALL" class="ch.qos.logback.core.rolling.RollingFileAppender">
<rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
<FileNamePattern>${DIR_ALL}/%d{yyyy-MM-dd}.%i.html</FileNamePattern>
<TimeBasedFileNamingAndTriggeringPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedFNATP">
<MaxFileSize>500KB</MaxFileSize>
</TimeBasedFileNamingAndTriggeringPolicy>
</rollingPolicy>
<layout class="ch.qos.logback.classic.html.HTMLLayout">
<pattern>%d{HH:mm:ss.SSS}%logger{1}%msg</pattern>
<cssBuilder class="ch.qos.logback.classic.html.UrlCssBuilder">
<url>${CSS_HREF}</url>
</cssBuilder>
<title>Logs (ALL)</title>
</layout>
E o seguinte é o que eu consegui:
<td class="Message">(DemoCall) parsing response failed. Details:
<call><action>getmessage</action></call>
</td>
O que estou esperando:
<td class="Message">(DemoCall) parsing response failed. Details:
<call><action>getmessage</action></call>
</td>
Ou melhor, envolva a mensagem acima com uma tag <pre>.Preciso estender o HTMLLayout para arquivar isso?Ou é meu trabalho fazer um StringEscapeUtils.escapeHTML(msg) para cada instrução de log (não vou fazer isso, pois também existe um anexador de arquivo para o qual o escape não é necessário).
Obrigado!
Solução
OK.Parece que devo fazer isso sozinho:estenda o HTMLLayout do logback e lide com o escape lá.
Por favor, verifique a linha 61 do código em http://gist.github.com/284628
EDITAR
É claro que você deve usar o novo HTMLLyout estendido para substituir o original em logback.xml onde <layout class=...>