Akka.NET не распознает мой пользовательский регистратор и по умолчанию использует BusLogger - PullRequest
0 голосов
/ 27 июня 2018

Я учу Akka.NET. Я пытаюсь создать собственный регистратор. Я следовал за учебником в блоге здесь . Мне не удалось заставить Акку подключить мой собственный регистратор. Видимо строка var sys = ActorSystem.Create("AkkaCustomLoggingActorSystem"); читает в hocon Akka и настраивает ведение журнала в соответствии с настройками. Когда я проверяю значение sys после создания системы акторов, я вижу сохраненную конфигурационную строку, но регистратор имеет тип BusLogger вместо моего собственного регистратора.

Я проверил источник Akka.NET для класса ActorSystemImpl . В строке 441 регистратор настроен на BusLogging, и я нигде не вижу, чтобы использовался регистратор, установленный в конфигурации.

У меня есть чрезвычайно простой проект Akka.NET, ориентированный на .NET core 2.0, который демонстрирует эту проблему. Полный источник ниже. Что мне здесь не хватает? Почему я не могу подключить свой собственный регистратор, как описано в руководстве?

Program.cs:

using Akka.Actor;
using Akka.Event;
using System;

namespace AkkaCustomLogging
{
    class Program
    {
        static void Main(string[] args)
        {
            var sys = ActorSystem.Create("AkkaCustomLoggingActorSystem");
            var logger = Logging.GetLogger(sys, sys, null); // Always bus logger
            Console.ReadLine();
        }
    }
}

CustomLogger.cs:

using Akka.Actor;
using Akka.Event;
using System;

namespace AkkaCustomLogging
{
    public class CustomLogger : ReceiveActor
    {
        public CustomLogger()
        {
            Receive<Debug>(e => this.Log(LogLevel.DebugLevel, e.ToString()));
            Receive<Info>(e => this.Log(LogLevel.InfoLevel, e.ToString()));
            Receive<Warning>(e => this.Log(LogLevel.WarningLevel, e.ToString()));
            Receive<Error>(e => this.Log(LogLevel.ErrorLevel, e.ToString()));
            Receive<InitializeLogger>(_ => this.Init(Sender));
        }

        private void Init(IActorRef sender)
        {
            Console.WriteLine("Init");
            sender.Tell(new LoggerInitialized());
        }

        private void Log(LogLevel level, string message)
        {
            Console.WriteLine($"Log {level} {message}");
        }
    }
}

app.config:

<?xml version="1.0" encoding="utf-8" ?>
<configuration>

  <configSections>
    <section name="akka" type="Akka.Configuration.Hocon.AkkaConfigurationSection, Akka" />
  </configSections>
    <startup> 
        <supportedRuntime version="v4.0" sku=".NETFramework,Version=v4.6.1" />
    </startup>
  <akka>
    <hocon>
      <![CDATA[
            loggers = [ "AkkaCustomLogging.CustomLogger, AkkaCustomLogging" ]
            loglevel = warning
            log-config-on-start = on
            stdout-loglevel = off
            actor {
              debug {
                receive = on      
                autoreceive = on  
                lifecycle = on    
                event-stream = on 
                unhandled = on    
              }
            }
      ]]>
    </hocon>
  </akka>
</configuration>

1 Ответ

0 голосов
/ 27 июня 2018

Ваша проблема в том, что в вашем HOCON отсутствует пространство имен akka - оно должно выглядеть так:

<akka>
    <hocon>
      <![CDATA[
            akka {
            loggers = [ "AkkaCustomLogging.CustomLogger, AkkaCustomLogging" ]
            loglevel = warning
            log-config-on-start = on
            stdout-loglevel = off
              actor {
                  debug {
                    receive = on      
                    autoreceive = on  
                    lifecycle = on    
                    event-stream = on 
                    unhandled = on    
                  }
               }
            }
      ]]>
    </hocon>
</akka>
...