2011-10-12 14 views
12

nel seguente documento, i gestori di eventi sono descritti come prendendo il posto di registrazione http://akka.io/docs/akka/1.2/general/event-handler.htmlperché usare Akka eventhandler per la registrazione

C'è un gestore eventi che prende il posto di un sistema di registrazione in Akka:

akka.event.EventHandler

in particolare, questo link fornisce un esempio di come fare questo durante l'utilizzo di slf4j: http://akka.io/docs/akka/1.2/general/slf4j.html

La mia domanda è 'quali vantaggi offre? 'perché dovrei farlo invece di usare solo un logger usando lo schema standard?'

import org.slf4j.Logger; 
import org.slf4j.LoggerFactory; 
... 
private static Logger log = LoggerFactory.getLogger(MyActor.class); 
... 
log.info("doing something"); 

C'è una sorta di beneficio sottostante che avrei avuto, sulla base di filettatura o dispatcher interni, utilizzando un gestore di evento sopra il modello logger sopra che non sto vedendo? Altrimenti, usare un gestore di eventi per la registrazione sembra una deviazione da uno schema familiare senza una ragione chiara.

Grazie per qualsiasi input!

risposta

11

La registrazione in genere indica l'I/O, che può rallentare le operazioni del codice. Nel contesto di un attore in cui ogni messaggio deve essere elaborato con un singolo file nel metodo di ricezione, questo sovraccarico può, in alcuni casi, effettuare un ordine (o più) di differenza di grandezza nel tempo necessario al completamento di tale metodo. È già un modello comune nei sistemi basati su Erlang per spostare la registrazione al di fuori del flusso di controllo del thread (o processo, nella sfera di Erlang) che sta eseguendo il blocco di ricezione. Se i tuoi attori non dipendono fortemente dalla tempistica del blocco di ricezione, puoi sempre ricorrere al modello di registrazione standard se questo ti rende le cose più facili, ma è probabilmente una buona idea abituarsi all'approccio basato su EventHandler.

+0

Grazie Thomas, che fa bene senso. Sono andato avanti e ho cambiato la registrazione nei miei attori per usare i metodi di EventHandler.info() ecc. Non sembra che rispetti il ​​layout del mio modello specificato nel mio file log4j.xml, ma vedo i miei messaggi a livello INFO almeno. –

+1

La registrazione asincrona sembra un po 'pericolosa. Che garanzia ho che a) le dichiarazioni del registro vengano fuori nell'ordine corretto eb) che EventHandler sia in grado di stare al passo con il resto del sistema (se il logging è la parte più lenta del sistema, la coda del log crescerà appena e crescere fino a quando non si verifica un OutOfMemory). Ha senso registrare gli errori in modo sincrono? –

+0

Se si dipende da una sequenza specifica o garanzie sull'ordinazione, forse un approccio basato sugli attori non è giusto per te.Detto questo, dal momento che il logging è gestito da un attore e gli attori ricevono i loro messaggi nell'ordine in cui sono stati ricevuti, questo non dovrebbe essere un problema. Inoltre, Akka ha un'implementazione di accodamento dei messaggi molto solida che è anche regolabile/sintonizzabile secondo le tue esigenze. Se si è preoccupati di sovraccaricare il buffer (non sono sicuro di cosa limiti Akka per impostazione predefinita) è possibile utilizzare una coda di messaggi limitata e creare il proprio gestore di registrazione che lo utilizza. –

0

@DParsin, si avrebbe bisogno di avere application.conf file nel percorso di classe con almeno le seguenti:

akka { 
    event-handlers = ["akka.event.slf4j.Slf4jEventHandler"] 
    loglevel = DEBUG 
    stdout-loglevel = INFO 
} 

e poi naturalmente anche fare in modo che si sta utilizzando logback (o slf4j-log4j etc.). Se si dispone di logback-classic-1.0.0.jar nel classpath, assicurarsi che NON ci siano altri adattatori SLF4J nel classpath.

0

Fare attenzione con Slf4jEventHandler in Akka 1.2. Si perde la possibilità di impostare i livelli di registrazione su una base per classe contro

import org.slf4j.Logger; 
import org.slf4j.LoggerFactory; 
... 
private static Logger log = LoggerFactory.getLogger(MyActor.class); 
... 
log.info("doing something"); 

Motivo essendo Slf4jEventHandler usa solo un registratore con il nome di "akka.event.slf4j.Slf4jEventHandler"