Windows 10 IoT Core 教程:Windows 10 IoT Core 回退记录器

> 当物联网解决方案的网络出现故障时会发生什么?硬重启可能意味着丢失了数据。实现脱机回退记录器,可以保证您的数据安全。

我们喜欢尽可能使用我们最喜欢的日志解决方案,但如果涉及到外部存储或外部服务,我们不能保证日志记录在危机情况下工作。这篇博客文章介绍了一个封装或回退(fallback),它使用主要记录器记录所有消息,并在主要记录器出现故障时使用辅助记录器。实现起来很简单,但是当主日志服务关闭时,日志消息很可能不会完全丢失。

注意:此处显示的源代码取自我在 GitHub 上的 TemperatureStation 解决方案。Windows 10 IoT Core 的记录器位于 Windows 10 IoT Core 后台服务的 Loggers 文件夹中。要在 Windows 10 IoT Core 上进行 ETW 日志记录工作,请阅读我的博客文章在 Windows 10 IoT Core 上使用 ETW Tracing

为什么使用一个回退记录器?

我们想要使用我们熟悉的记录器,并将其日志放在我们熟悉的地方。以下是将日志写入外部存储的记录器示例:

  • SyslogLogger:将事件记录到外部 Syslog 服务器
  • ApplicationInsightsLogger:将事件记录到 Application Insights 跟踪日志。

但是,当网络出现故障或 Wi-Fi 驱动程序崩溃的同时,在我们的 IoT 解决方案中发生了一些有趣的事情时会发生什么?有可能我们必须关闭我们的 Raspberry Pi,使其重新启动。 如果发生这种情况,最新的日志很有可能永远消失。 回退记录器在这里能帮助我们解决这个问题。

回退记录器架构

TemperatureStation 后台服务中的所有记录器都使用相同的 ILogger 接口。它使代码更容易处理,如果 ILogger 是已知的,具体类型的记录器只是一个配置问题。

回退记录器架构

FallbackLogger 是一个特例。它也遵循 ILogger 接口,但它也使用两个记录器:

  • 主记录器:这是首先尝试的记录器
  • 次记录器:当主记录器失败时使用该记录器。

为了更好地说明回退记录器,我们来举个例子。 我们的主要记录器是 SyslogLogger,它将事件记录到本地网络中的 Syslog 服务器。如果网络故障或 Syslog 服务器由于其他原因而不可用,则使用 ETW 跟踪记录器,因为它在本地工作,不需要任何外部资源。

实现一个回退记录器

这里是 FallbackLogger 的原始和未完成的实现。我知道代码可以更好更紧凑,因为重复的 try-catch 模式,但是我们坚持这个实现,因为它更容易理解。

internal class FallbackLogger : ILogger
{
    private readonly ILogger _mainLogger;
    private readonly ILogger _fallbackLogger;
    public FallbackLogger(ILogger mainLogger, ILogger fallbackLogger)
    {
        _mainLogger = mainLogger;
        _fallbackLogger = fallbackLogger;
    }
    public void Debug(string message)
    {
        try
        {
            _mainLogger.Debug(message);
        }
        catch (Exception ex)
        {
            _fallbackLogger.Debug(message);
            _fallbackLogger.Critical(ex.ToString());
        }
    }
    public void Info(string message)
    {
        try
        {
            _mainLogger.Info(message);
        }
        catch (Exception ex)
        {
            _fallbackLogger.Info(message);
            _fallbackLogger.Critical(ex.ToString());
        }
    }
    public void Warn(string message)
    {
        try
        {
            _mainLogger.Warn(message);
        }
        catch (Exception ex)
        {
            _fallbackLogger.Warn(message);
            _fallbackLogger.Critical(ex.ToString());
        }
    }
    public void Error(string message)
    {
        try
        {
            _mainLogger.Error(message);
        }
        catch (Exception ex)
        {
            _fallbackLogger.Error(message);
            _fallbackLogger.Critical(ex.ToString());
        }
    }
    public void Critical(string message)
    {
        try
        {
            _mainLogger.Critical(message);
        }
        catch (Exception ex)
        {
            _fallbackLogger.Critical(message);
            _fallbackLogger.Critical(ex.ToString());
        }
    }
}

上面的简单代码可以确保当我们所爱的主记录器,出于某种原因无法完成工作时记录工作。

整合

监控物联网解决方案非常重要,特别是在涉及定制硬件的情况下。 我们必须准备好回应我们还没有准备好的问题。不过,我们想使用熟悉的日志记录系统和服务。但是一些问题,比如网络问题和服务中断,可能使我们面临一种情况:我们的解决方案无法记录重要的信息。 这是一个回退记录器的地方,有一些记录器在本地工作,并且不使用任何外部资源。 尽管这里的回退记录器的实现是原始的,但在实践中仍然可行。

英语原文链接:A Fallback Logger for Windows 10 IoT Core

尚未评分
您的评分将帮助我们做出更好的玩法

观光\评论区

Copyright © 2017 玩点什么. All Rights Reserved.