Pergunta

Temos um aplicativo em lote weblogic que processa várias solicitações de consumidores ao mesmo tempo.Usamos log4j para fins de registro.No momento, fazemos login em um único arquivo de log para várias solicitações.Torna-se tedioso depurar um problema para uma determinada solicitação, pois para todas as solicitações os logs estão em um único arquivo.

Portanto, o plano é ter um arquivo de log por solicitação.O consumidor envia um ID de solicitação para o qual o processamento deve ser realizado.Agora, na realidade, pode haver vários consumidores enviando os IDs de solicitação para a nossa aplicação.Então a questão é como segregar os arquivos de log com base na solicitação.

Não podemos iniciar e parar o servidor de produção todas as vezes, portanto, o uso de um anexador de arquivo substituído com carimbo de data e hora ou ID de solicitação é descartado.Isso é o que é explicado no artigo abaixo:http://veerasundar.com/blog/2009/08/how-to-create-a-new-log-file-for-each-time-the-application-runs/

Também tentei brincar com estas alternativas:

http://cognitivecache.blogspot.com/2008/08/log4j-writing-to-dynamic-log-file-for.html

http://www.mail-archive.com/log4j-user@logging.apache.org/msg05099.html

Esta abordagem fornece os resultados desejados, mas não funciona corretamente se várias solicitações forem enviadas ao mesmo tempo.Devido a alguns problemas de simultaneidade, os logs vão aqui e ali.

Antecipo alguma ajuda de vocês.Desde já, obrigado....

Foi útil?

Solução

Aqui está minha pergunta sobre o mesmo tópico:Criando e destruindo dinamicamente os apêndeiros de madeira

Eu sigo isso em um tópico em que discuto fazer algo exatamente assim, na lista de discussão Log4J:http://www.qos.ch/pipermail/logback-user/2009-august/001220.html

O CECI Gulcu (inventor do LOG4J) não achou que era uma boa ideia ... sugeriu o uso de logback.

Fomos em frente e fizemos isso de qualquer maneira, usando um Appender de arquivo personalizado. Veja minhas discussões acima para obter mais detalhes.

Outras dicas

Olhar SiftingAppender envio com logback (log4j sucessor), ele é projetado para lidar com a criação de appenders no tempo de execução de critérios.

Se o aplicativo precisa criar apenas um arquivo de log por sessão, basta criar um discriminador, com base no id de sessão.Escrever um discriminador envolve 3 ou 4 linhas de código e, portanto, deve ser bastante fácil.Gritar no logback lista de mail do utilizador, se precisar de ajuda.

Este problema é muito bem tratado por Logback.Sugiro optar por isso se você tiver liberdade.

Supondo que você possa, o que você precisará usar é Peneirar Appender.Ele permite separar arquivos de log de acordo com algum valor de tempo de execução.O que significa que você tem uma ampla gama de opções sobre como dividir arquivos de log.

Para dividir seus arquivos em requestId, você poderia fazer algo assim:

logback.xml

<configuration>

  <appender name="SIFT" class="ch.qos.logback.classic.sift.SiftingAppender">
    <discriminator>
      <key>requestId</key>
      <defaultValue>unknown</defaultValue>
    </discriminator>
    <sift>
      <appender name="FILE-${requestId}" class="ch.qos.logback.core.FileAppender">
        <file>${requestId}.log</file>
        <append>false</append>
        <layout class="ch.qos.logback.classic.PatternLayout">
          <pattern>%d [%thread] %level %mdc %logger{35} - %msg%n</pattern>
        </layout>
      </appender>
    </sift>
  </appender>

  <root level="DEBUG">
    <appender-ref ref="SIFT" />
  </root>

</configuration>

Como você pode ver (dentro discriminator elemento), você irá discriminar os arquivos usados ​​para gravar logs em requestId.Isso significa que cada solicitação irá para um arquivo que possui uma correspondência requestId.Portanto, se você tivesse duas solicitações em que requestId=1 e um pedido onde requestId=2, você teria 2 arquivos de log: 1.log (2 entradas) e 2.log (1 entrada).

Neste ponto você pode estar se perguntando como definir o key.Isso é feito colocando pares de valores-chave em CDM (observe que a chave corresponde àquela definida em logback.xml arquivo):

RequestProcessor.java

public class RequestProcessor {

    private static final Logger log = LoggerFactory.getLogger(RequestProcessor.java);

    public void process(Request request) {
        MDC.put("requestId", request.getId());
        log.debug("Request received: {}", request);
    }
}

E é basicamente isso para um caso de uso simples.Agora, cada vez que uma solicitação com um ID diferente (ainda não encontrado) chegar, um novo arquivo será criado para ela.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top