【问题标题】:Akka.NET logger not sending logs to Application InsightsAkka.NET 记录器未将日志发送到 Application Insights
【发布时间】:2020-01-23 06:53:53
【问题描述】:

我已将 Application Insights 设置为 Akka.NET 中的日志记录提供程序,并设置 Akka.Monitoring 来记录各种自定义指标(例如接收的消息计数和计时处理持续时间)。这很好用。

但是我使用 Akka.NET 的记录器生成的日志没有发送到 Application Insights:

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

我希望在 Application Insights 的 Traces 部分中看到它以及我的其他 .NET Core 日志项。但是,这些日志确实出现在我的运行时输出中,我假设它是标准输出。

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
            });
        }
    }
}

【问题讨论】:

  • 您是使用库来执行此操作,还是编写自己的逻辑将其发送到应用洞察?如何配置应用洞察?
  • @PeterBons 查看我的编辑。我正在使用Akka.Monitoring.ApplicationInsights

标签: azure akka azure-application-insights akka.net akka-monitoring


【解决方案1】:

快速扫描显示,对 App Insights 的唯一调用是 TrackMetrics 调用。要发送像logger.Info($"Please send me to Azure!"); 这样的日志消息,人们会期望调用TrackTrace。所以我想这个库只对跟踪指标有用,而不是消息。包装说明中的内容进一步证实了这一点:

Akka.Monitoring 是 Akka.NET 的 ActorSystem 扩展,它公开了一个可插入层,用于报告性能指标从参与者返回到监控系统,例如 ....

无论如何,documentation 并不表示有可用的 Application Insights 记录器。

【讨论】:

  • 谢谢。最后我实现了一个自定义记录器。现在可以使用了。
猜你喜欢
  • 2021-09-21
  • 2021-11-02
  • 2021-04-18
  • 1970-01-01
  • 1970-01-01
  • 2020-01-08
  • 2022-01-06
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多