Domanda

Abbiamo un'applicazione batch weblogic che elabora più richieste da parte dei consumatori, allo stesso tempo. Usiamo log4j per puposes di registrazione. In questo momento abbiamo registriamo in un singolo file di registro per richieste multiple. Essa diventa noiosa per eseguire il debug un problema per una determinata richiesta, come per tutte le richieste i registri si trovano in un unico file.

Così piano è di avere un file di log per ogni richiesta. Il consumatore invia un ID di richiesta per la quale deve essere eseguita l'elaborazione. Ora, in realtà, ci potrebbe essere di più i consumatori che inviano gli ID di richiesta alla nostra applicazione. Così domanda è come seggregate i file di registro in base alla richiesta.

Non possiamo avviare e arrestare il server di produzione ogni volta in modo che il punto utilizzando un appender di file sovrascritto con il timestamp data o richiesta di ID è escluso. Questo è ciò che è spiegato nell'articolo di seguito: http://veerasundar.com/blog/2009/08/how-to-create-a-new-log-file-for-each-time-the-application-runs/

Ho provato anche a giocare con queste alternative:

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

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

Questo approccio dà i risultati desiderati, ma non funziona correttamente se richiesta multipla vengono inviati allo stesso tempo. A causa di alcuni problemi di concorrenza i registri vanno qua e là.

Mi aspetto un po 'di aiuto da voi ragazzi. Grazie in anticipo ....

È stato utile?

Soluzione

Ecco la mia domanda sullo stesso argomento: dinamicamente la creazione e la distruzione di registrazione appenders

seguo questo su un thread in cui discuto fare qualcosa esattamente come questo, sulla mailing list Log4J: http://www.qos.ch/pipermail/logback- user / 2009-agosto / 001220.html

Ceci Gülcü (inventore del log4j) non pensava che fosse una buona idea ... ha suggerito di utilizzare Logback invece.

Siamo andati avanti e abbiamo fatto questo comunque, utilizzando un file personalizzato appender. Vedi le mie discussioni sopra per maggiori dettagli.

Altri suggerimenti

SiftingAppender spedizione con logback (successore di log4j), è progettato per gestire la creazione di appenders su criteri di esecuzione.

Se l'applicazione ha bisogno di creare un unico file di log per sessione, è sufficiente creare un discriminatore sulla base l'id di sessione. Crei una discriminatore coinvolge 3 o 4 linee di codice e pertanto dovrebbe essere abbastanza facile. Shout sulla mailing list logback-utente se hai bisogno di aiuto.

Questo problema è gestito molto bene da Logback . Suggerisco di optare per esso, se si ha la libertà.

supponendo che si può, ciò che sarà necessario utilizzare sia si SiftingAppender . Esso consente di separare i file di log in base a un valore runtime. Il che significa che si dispone di una vasta gamma di opzioni su come dividere i file di log.

Per dividere i file su requestId, si potrebbe fare qualcosa di simile:

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>

Come si può vedere (all'interno dell'elemento discriminator), che si sta per discriminare i file utilizzati per la scrittura log su requestId. Ciò significa che ogni richiesta andrà a un file che ha un requestId corrispondenza. Quindi, se tu avessi due richieste dove requestId=1 e una richiesta in cui requestId=2, si dovrebbe avere i file di log 2: 1.log (2 ingressi) e 2.log (1 ingresso).

A questo punto ci si potrebbe chiedere come impostare la key. Questo viene fatto mettendo coppie valore-chiave MDC (si noti che chiave corrisponde a quello definito nel file di logback.xml):

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 questo è fondamentalmente per un semplice caso d'uso. Ora ogni volta che una richiesta con un diverso (non ancora incontrato) id entra, un nuovo file verrà creato per questo.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top