2012-01-23 6 views
6

Por lo tanto, estoy usando Slf4jEventHandler y logback-classic. ¿Cómo configuro los niveles de registro para diferentes actores por separado? [Estoy usando Akka 2.0_M2]nombres de registrador para configurar akka logger utilizando el controlador de eventos

He intentado hacer algo como

<configuration debug="true" scan="true"> 
    <appender name="STDOUT" class="ch.qos.logback.core.ConsoleAppender"> 
     <encoder class="ch.qos.logback.classic.encoder.PatternLayoutEncoder"> 
      <pattern>%-5level %logger{36} - %msg%n</pattern> 
     </encoder> 
    </appender> 
    <logger name="akka://TradeService" level="DEBUG" /> 
    <root level="INFO"> 
     <appender-ref ref="STDOUT" /> 
    </root> 
</configuration> 

pero eso no ayuda en absoluto:

INFO akka://TradeService/user/realTimeReqListener - Declaring queue 
INFO akka://TradeService/user/restReqListener - Declaring queue 
INFO akka://TradeService/user/restReqListener - Starting listening to queue 

Como se puede ver que sólo estoy haciendo Nivel de registro INFO para los actores. ¿Cuál es la jerarquía de nombres para los registradores de actores?

Respuesta

6

que supongo que está utilizando un 2,0 hito Akka, y supongo que seguirán, además, que obtiene su registrador de la siguiente manera:

val log = Logging(context.system, this) 

por la documentación, la representación por defecto de un actor en términos de categoría de registro es su camino Desafortunadamente, logback no está preparado para tratar con jerarquías de actores, está configurado para tratar con nombres de paquetes (es decir, jerarquía separada por puntos), que es la razón por la que su configuración afecta al registrador incorrecto. Hubo algunos cambios en esta área en Akka master recientemente que formarán parte del hito 3 (que se lanzará muy pronto), donde la categoría de registro predeterminada se obtendría de la clase de implementación real (según LoggerFactory.getLogger(someClass)). Si usted quiere lograr lo mismo en su versión más antigua Akka, utilice

val log = Logging(context.system, getClass.getName) 

Tenga en cuenta que esto por supuesto no unifica la jerarquía de nombres de agente mágicamente con los nombres de los paquetes, es decir, tendrá que configurar por clase de actor como es habitual para los marcos de registro de Java tradicionales. Si quieres que escriba su propia conversión del camino actor para dot separados por nombre jerárquico y pasar la cadena resultante de la fábrica:

val log = Logging(context.system.eventStream, mangleMyName(self.path)) 

El cambio en el uso de eventStream en lugar de llanura system será necesario una vez que se actualice a una versión más reciente, porque otro cambio fue que el nombre del sistema ahora se agregará a las categorías de registro simple si pasa en un sistema. Supongamos system.name == "Fred":

val log = Logging(context.system, "testa") // will log as "testa(Fred)" 
+0

estoy mezclando en el ActorLogging rasgo para traer * registro. Pero me condujo a la dirección de escritura. Me pregunto si podría configurar la parte mangleMyName en una extensión de SLF4JEventHandler en lugar de tener que escribir explícitamente en mi código. Luego solo le pediré que convierta un nombre como akka: // TradeService/AnotherService en TradeService.AnotherService (creo que eliminaría la parte del protocolo). ¿Cuál es tu opinión? –

+0

Otra pequeña molestia, porque el registro está basado en eventos, el Patrón [% X {sourceThread}] para mi registro no Actor generará espacios en blanco "[]". Y si tengo% thread obtendré "dispatcher-thread-x" para Actor-loggin ...pero puedo vivir con eso. –

+0

Supongo que puedo usar otro controlador de eventos que primero convierte el logSource de XXXEvents y luego pasa los mensajes a SLF4JEventHandler –

1

El registro Akka no se integra bien con el juego de la caja. También usa una API diferente a slf4j, p. Ej. advertencia en lugar de advertir, por lo que es más difícil reemplazarlo si lo necesita.

El rasgo más adelante obliga a la estructura de nombre de paquete slf4j clásica/log4j hacer madereros más fácil de configurar en el application.conf

import org.slf4j.LoggerFactory 
import akka.actor.ActorRef 

trait ActorLogger { 
    implicit val self:ActorRef 
    protected val log = LoggerFactory.getLogger(getClass().getName() + "_" + self.path.toString()) 
} 

y utilizar de esta manera

class Foo extends Actor with ActorLogger { 
    def run = { 
    log.info("hi") 
    log.warn("hi") 
    } 
} 
+0

Normalmente no me gusta este tipo de solución, pero hasta ahora esto no me ha causado ningún problema y ha hecho que la configuración sea infinitamente más fácil. Lo uso en lugar de ActorLogging con Actores y obtengo declaraciones de registro con formato estándar (es decir, advertencia), así como configuración fácil. – jlegler

Cuestiones relacionadas