Регистратор Akka. NET не отправляет журналы в Application Insights - PullRequest
0 голосов
/ 23 января 2020

Я настроил Application Insights в качестве поставщика журналов в Akka. NET и настроил Akka.Monitoring для записи различных пользовательских метрик (таких как подсчет полученных сообщений и длительность обработки синхронизации). Это прекрасно работает.

Но журналы, которые я генерирую с помощью Akka. Регистратор NET не отправляется в Application Insights:

var logger = Logging.GetLogger(Context);
logger.Info($"Please send me to Azure!");

Я ожидаю увидеть его в Traces раздел по Application Insights вместе с другими. NET Основные элементы журнала. Эти журналы, тем не менее, появляются в моих выходных данных времени выполнения, которые я предполагаю как stdout.

Application Insights настроен с использованием Akka.Monitoring.ApplicationInsights, например, так:

ActorMonitoringExtension.RegisterMonitor(system, new ActorAppInsightsMonitor(instrumentationKey));

РЕШЕНИЕ:

Благодаря ответу Питера мне пришлось реализовать собственный регистратор для этого:

public class ApplicationInsightsLogger
        : ReceiveActor
{
    private readonly TelemetryClient _telemetry = new TelemetryClient();

    private readonly IDictionary<LogLevel, SeverityLevel> _logLevelMap = new Dictionary<LogLevel, SeverityLevel>()
    {
        { LogLevel.DebugLevel, SeverityLevel.Verbose },
        { LogLevel.InfoLevel, SeverityLevel.Information },
        { LogLevel.WarningLevel, SeverityLevel.Warning },
        { LogLevel.ErrorLevel, SeverityLevel.Error },
    };

    public ApplicationInsightsLogger()
    {
        Receive<LogEvent>(message => this.Log(message.LogLevel(), message));
        Receive<InitializeLogger>(_ => Sender.Tell(new LoggerInitialized()));
    }

    private void Log(LogLevel level, LogEvent item)
    {
        if (!_logLevelMap.ContainsKey(level))
        {
            throw new InvalidOperationException($"{level} log level isn't handled.");
        }

        SeverityLevel severity = _logLevelMap[level];

        _telemetry.TrackTrace(new TraceTelemetry()
        {
            Message = item.Message.ToString(),
            SeverityLevel = severity,
            Timestamp = item.Timestamp,
            Properties = { { "Source", item.LogSource } }
        });

        if (item is Error)
        {
            _telemetry.TrackException(new ExceptionTelemetry()
            {
                Message = item.Message.ToString(),
                SeverityLevel = severity,
                Timestamp = item.Timestamp,
                Properties = { { "Source", item.LogSource } },
                Exception = (item as Error).Cause
            });
        }
    }
}

1 Ответ

1 голос
/ 23 января 2020

Быстрое сканирование показывает, что единственными вызовами в App Insights являются TrackMetrics вызовы. Для отправки сообщений журнала, таких как logger.Info($"Please send me to Azure!");, можно ожидать вызова на TrackTrace. Поэтому я полагаю, что библиотека полезна только для отслеживания метрик, а не сообщений. Это также подтверждается тем фактом, что описание пакета гласит:

Akka.Monitoring - расширение ActorSystem для Akka. NET, предоставляющее подключаемый слой для показателей производительности отчетов от актеров обратно в систему мониторинга su c ....

В любом случае документация не указывает на наличие доступного регистратора Application Insights.

...