2017-02-20 26 views
0

У меня есть приложение, которому необходимо вызвать некоторую внешнюю систему (чтобы дешифровать конфиденциальную информацию, чтобы она была коротка), прежде чем создавать конфигурацию, которую будет использовать система актеров.Akka (JVM) инициализирует регистратор перед ActorSystem

Возможно ли инициализировать регистратор в самом начале моего процесса, чтобы средства мониторинга/исследования могли обращаться к журналам, если связь с внешней системой идет не так?

// the following call will modify the config from a secret id read in the conf 
// and write the value "redis.password" after getting the value from an Azure Keyvault 
val updatedConf = KeyVaultHelper.decryptFromKeyVault(ConfigFactory.load("application"), 
    Map(
    "azure.keyvault.redis.password.secret-id", 
    "redis.password" 
)) 

// now we initialize the actor system with the updated conf 
// and the logging system will be initialized 
val system = ActorSystem("ClusterSystem", updatedConf) 
+0

Не могли бы вы разместить образец кода? Это очень трудно сказать, для самого пессимистического пути я бы сказал, чтобы использовать ранний инициализатор. –

+0

Я только что сделал, не уверен, что это помогает? – CanardMoussant

+0

Поэтому вам необходимо использовать регистратор перед созданием системы. Я не уверен, что правильно понял ваш случай использования, но я вставлю код ниже. –

ответ

1

Для достижения этой цели, вы можете использовать akka-slf4j библиотеки вместе с их рекомендуемого лесозаготовительного бэкэндом logback. Необходимо настроить две вещи.

logback.xml файл, который настраивает лесоруб:

<!-- src/main/resources/logback.xml --> 
<configuration> 
    <appender name="STDOUT" class="ch.qos.logback.core.ConsoleAppender"> 
    <encoder> 
     <pattern>%date{ISO8601} %-5level %logger{36} %X{sourceThread} - %msg%n</pattern> 
    </encoder> 
    </appender> 
    <root level="debug"> 
    <appender-ref ref="STDOUT" /> 
    </root> 
</configuration> 

SLF4J регистратор должны быть сконфигурирован из типизированной конфигурации, а также:

# src/main/resources/application.conf 
akka { 
    loggers = ["akka.event.slf4j.Slf4jLogger"] 
    loglevel = "DEBUG" 
    logging-filter = "akka.event.slf4j.Slf4jLoggingFilter" 
} 

Пожалуйста, см дуют образец кода, чтобы проверить конфигурацию.

object LoggingTest extends App { 
    // Do all decryption logging here 
    val logger = LoggerFactory.getLogger(getClass) 
    logger.debug("Starting application. Decrypting info from config") 

    // Now you boot the system which will use the same logging config 
    val system = ActorSystem() 
    val actor = system.actorOf(Props[Echo]) 

    actor ! "hello" 
} 

class Echo extends Actor { 
    override def receive: Receive = { 
    case message => 
     context.system.log.debug(s"echo $message") 
    } 
} 

Я использовал следующий akka-actor & akka-slf4j 2.4.17 и ch.qos.logback 1.1.3.

Дайте мне знать, если у вас есть еще вопросы.

+0

Да, жаль, что вы не кристально чисты. Я использую logback как регистратор для моей системы actitors, и я хотел бы поделиться своей конфигурацией с тем, что я делаю, если попытаюсь войти в систему до того, как будет существовать существующая система. На данный момент регистратор инициализируется самой Akka, и я не уверен, как его инициализировать. Я думаю, что на самом деле довольно просто, что я хочу сделать: просто убедитесь, что loglog logger, который я создал бы, будет использовать ту же конфигурацию. – CanardMoussant

+0

Возможно, если вы используете akka-slf4j. Я отредактирую ответ после обеда :) –

+0

Да, спасибо, спасибо! – CanardMoussant