Я настроил 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
});
}
}
}