2011-10-12 6 views
12

En el siguiente documento, los controladores de eventos se describen como tomando el lugar de la tala http://akka.io/docs/akka/1.2/general/event-handler.htmlpor qué el uso akka manejador de sucesos para el registro

hay un controlador de eventos que toma el lugar de un sistema de registro en Akka:

akka.event.EventHandler

en concreto, este enlace es un ejemplo de cómo hacer esto durante el uso de slf4j: http://akka.io/docs/akka/1.2/general/slf4j.html

Mi pregunta es '¿qué ventajas le da esto? '¿por qué debería hacer esto en lugar de simplemente usar un registrador usando el patrón estándar?'

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

¿Hay algún tipo de beneficio subyacente que tendría, sobre la base de roscado o expedidor internos, mediante el uso de un controlador de eventos sobre el patrón anterior registrador que no estoy viendo? De lo contrario, utilizar un controlador de eventos para el registro parece desviarse de un patrón familiar sin una razón clara.

¡Gracias por cualquier entrada!

Respuesta

11

El registro generalmente significa IO, lo que puede ralentizar las operaciones de su código. En el contexto de un actor donde cada mensaje debe procesarse en un solo archivo en su método de recepción, esta sobrecarga puede, en algunos casos, hacer un pedido (o más) de diferencia de magnitud en el tiempo para que se complete ese método. Ya es un patrón común dentro de los sistemas basados ​​en Erlang mover el registro fuera del flujo de control del hilo (o proceso, en la esfera de Erlang) que está ejecutando el bloque de recepción. Si sus actores no dependen mucho del tiempo del bloque de recepción, siempre puede volver al patrón de registro estándar si eso le facilita las cosas, pero probablemente sea una buena idea acostumbrarse al enfoque basado en EventHandler.

+0

Gracias Thomas, que hace buen sentido. Seguí adelante y cambié el registro en mis actores para usar los métodos EventHandler.info() etc. No parece estar respetando el diseño de mi patrón especificado en mi archivo log4j.xml, pero al menos veo mis mensajes de nivel INFO. –

+1

El registro asincrónico suena un poco peligroso. ¿Qué garantía tengo de que a) las instrucciones de registro salgan en el orden correcto yb) que EventHandler pueda mantenerse al día con el resto del sistema (si el registro es la parte más lenta del sistema, la cola de registro solo crecerá? y crecer hasta que ocurra una OutOfMemory). ¿Tiene sentido registrar errores de forma sincrónica? –

+0

Si depende de una secuencia específica o garantías sobre el pedido, tal vez un enfoque basado en el actor no sea adecuado para usted.Dicho esto, dado que el registro lo maneja un actor y los actores reciben sus mensajes en el orden en que fueron recibidos, esto no debería ser un problema. Además, Akka tiene una implementación de colas de mensajes muy sólida que también se puede ajustar/ajustar según sus necesidades. Si le preocupa desbordar el búfer (no estoy seguro de qué límites tiene Akka de forma predeterminada), puede usar una cola de mensajes limitada y crear su propio controlador de registro que la use. –

0

@DParsin, que tendría que tener application.conf archivo en la ruta de clases con al menos la siguiente:

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

y luego, por supuesto, también asegurarse de que está utilizando logback (o slf4j-log4j etc.) Si tiene logback-classic-1.0.0.jar en su classpath, asegúrese de que NO tiene ningún otro adaptador SLF4J en su classpath también.

0

Tenga cuidado con Slf4jEventHandler en Akka 1.2. Se pierde la capacidad para establecer niveles de registro en una base por clase frente

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

La razón es Slf4jEventHandler utiliza sólo un registrador con el nombre de "akka.event.slf4j.Slf4jEventHandler"

Cuestiones relacionadas