Pergunta

Gostaria de eventos de log filtro provenientes de um componente específico de uma biblioteca parte 3, com base no conteúdo da mensagem de log. Eu só quero essa filtragem a ser aplicada quando o evento log é gerada por um registrador específico: "org.restlet.Component.LogService". A filtragem em si é apenas uma partida básica contra a mensagem de evento log.

Eu tenho um AsyncAppender central que os logs para vários appenders. No caso de eventos provenientes de LOGSERVICE não são filtrados, eu gostaria que eles sejam tratados da mesma forma como eles estão agora - ou seja, são enviados para o AsyncAppender. Eu não quero adicionar um filtro à AsyncAppender, porque este parece terrivelmente ineficiente (eu não preciso para filtrar todos os eventos, apenas os provenientes do logger LOGSERVICE).

Então, o que eu tentei fazer é logger LOGSERVICE associado com um Appender personalizado, que por sua vez está associado a um filtro personalizado:

    <appender name="filtered" class="mystuff.FilteredAppender">
            <filter class="mystuff.EventFilter"/>
            <appender-ref ref="ASYNC"/>
    </appender>

    <logger name="org.restlet.Component.LogService">
            <appender-ref ref="filtered"/>
    </logger>

O erro que eu atualmente recebem ...

log4j:. ERROR Nenhum conjunto layout para o appender chamado [filtrada]

... me diz que há algo de errado com meu projeto: Eu não acho que meu costume appender deve se preocupar com layout, já que realmente ele só precisa passar ou não passar o evento log junto. Além disso, esta abordagem requer duas classes personalizadas, e um deles (mystuff.FilteredAppender) adiciona nenhum valor em tudo -. É só lá para segurar o filtro personalizado

Eu adoraria fazer algo muito mais limpo como ...

    <logger name="org.restlet.Component.LogService">
            <filter class="mystuff.EventFilter"/>
    </logger>

... mas esta é, aparentemente, não é suportado pela estrutura log4j.

Existe uma boa maneira limpa para fazer filtragem de eventos do jeito que eu quero fazê-lo?

Foi útil?

Solução

Este entrada quadro de mensagens descreve uma solução que eu era capaz de conseguir trabalho. Parece uma vergonha ter que usar um AsyncAppender como o suporte do filtro, mas parece que essa é a melhor opção w / o de criar um novo costume Appender. Então eu acabar com:

    <appender name="filtered" class="org.apache.log4j.AsyncAppender">
            <filter class="mystuff.EventFilter"/>
            <appender-ref ref="ASYNC"/>
    </appender>

    <logger name="org.restlet.Component.LogService" additivity="false">
            <appender-ref ref="filtered"/>
    </logger>

Mas eu certamente estar interessado se alguém sabe de uma abordagem ainda melhor. : -)

Outras dicas

Log4J tem um Extras Library ( JavaDoc) que fornece LoggerMatchFilter, para filtrar sobre os nomes dos Logger. Você definir o nome do logger e se aceitar ou rejeitar (default é aceitar).

No método decide do filtro, ele compara o nome logger para LoggingEvent object.getLoggerName() pela igualdade. É um filtro surpreendentemente simples e óbvia e eu estou muito surpreso que ele não vem por padrão com Log4j.

Como alternativa, se você quiser apenas para bibliotecas de 3rd-party tranquilos, eu encontrei o seguinte para ser útil:

<!-- LOGGER NEUTER -->
<logger name="org.apache"><level value="WARN"/></logger>
<logger name="org.springframework"><level value="WARN"/></logger>
Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top