Domanda

Ho un'applicazione a più livelli in Java che ha un livello di accesso ai dati multi thread che viene richiamato da diversi punti.È probabile che una singola chiamata a questo livello generi diversi thread per parallelizzare le richieste al DB.

Quello che sto cercando è uno strumento di registrazione che mi permetta di definire "attività" composte da vari thread.Pertanto, lo stesso metodo nel livello di accesso ai dati dovrebbe registrare output diversi a seconda del chiamante.È importante anche la capacità di raggruppare diversi output per riassumere il costo totale di un’operazione.

Sebbene l'applicazione sia in Java, la lingua non è una restrizione;ciò di cui ho bisogno sono le linee guida di progettazione per poterlo eventualmente implementare.Attualmente stiamo utilizzando log4j, ma non riusciamo a ottenere questo comportamento.

È stato utile?

Soluzione

Dovresti anche dare un'occhiata a contesto diagnostico nidificato funzionalità di log4j.L'invio di contesti diversi al logger per chiamanti diversi potrebbe fare al caso tuo.

Altri suggerimenti

Dovresti essere in grado di passare un logger in giro, quindi crei un logger basato su alcuni dati "comuni" per i dati dell'attività, ad es.nome utente, ecc.Quindi, passa questo logger come parametro a tutti i metodi necessari.In questo modo, sarai in grado di impostare diversi filtri e/o regole nel tuo file di configurazione log4j.Oppure per raschiare il file di output in base al nome del logger.

MODIFICARE:Controlla anche le classi MDC e NDC in log4j.Puoi aggiungere lì dati contestuali.

In log4j puoi registrare il nome del thread con il modello "%t".Vedere Log4j Disposizione modello.

In una delle mie applicazioni (web), utilizzo un logger ThreadLocal che acquisisce le informazioni di registrazione in uno StringBuilder.L'oggetto logger viene inizializzato nel metodo HttpServlet#service, se è impostato un parametro di traccia (se non è impostato, è presente un null-logger molto veloce).L'output risultante viene scaricato come commento HTML nella pagina richiedente o scritto in un file di registro in un segmento.

In Java5 (e versioni successive) puoi chiamare

StackTraceElement[] stackTrace = Thread.currentThread().getStackTrace();

Esamina l'analisi dello stack alla profondità desiderata ed effettua il log di conseguenza.

In Java 1.4 puoi ottenere le stesse informazioni con

StackTraceElement[] stackTrace = new Exception().getStackTrace();

Penso che tu voglia associare oggetti logger ai thread.Una variabile ThreadLocal che contiene un'istanza del logger log4j per ogni thread potrebbe aiutare:

http://java.sun.com/javase/6/docs/api/java/lang/ThreadLocal.html

Sarà necessario passare una struttura al livello di accesso ai dati che identifichi l'attuale "attività".Potresti già avere una classe "Attività" che ha senso, potresti usare un'istanza di Logger come suggerì Sunny oppure potresti utilizzare una terza struttura per tenere traccia del contesto dell'attività.

In ogni caso, poiché la tua "attività" viene elaborata su più thread, non puoi utilizzare thread-local-storage per tenere traccia dell'attuale "attività", come suggerisce la maggior parte delle altre risposte attuali.Dovrai passarlo esplicitamente.

Suggerirei di creare una piccola facciata sopra log4j che espanda l'interfaccia con metodi come

void debug(Activity activity, String message);

e passando il contesto dell'attività in questo dal livello di accesso ai dati.

Sarà necessario apportare alcune modifiche al livello di accesso ai dati per consentirti di trasmettergli l'attività corrente, ma il modo migliore per farlo dipende fortemente dall'interfaccia corrente.Se utilizzi il modello Workspace, potresti semplicemente dover aggiungere un metodo setActivity() sulla classe Workspace, ma altri modelli di interfaccia potrebbero richiedere l'aggiunta di un parametro Activity a tutti i metodi.

Se per qualche motivo non sei in grado o non vuoi modificare il livello di accesso ai dati, potresti ovviamente archiviare il contesto dell'attività nel thread-local-storage prima di invocare il livello di accesso ai dati e recuperarlo subito prima di generare i sottothread o accodare il livello lavori nel livello di accesso ai dati.Questa è una soluzione praticabile, ma è un po’ pericoloso trasmettere informazioni in questo modo.

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