AUTOSAR图解==>AUTOSAR_AP_SWS_LogAndTrace

AUTOSAR Adaptive Platform Log and Trace详解

基于AUTOSAR Adaptive Platform R24-11 SWS_LogAndTrace (文档853)

目录

  1. 概述
  2. Log and Trace架构
    1. 架构组件
    2. 与其他功能集群的关系
  3. Logger API详解
    1. Logger类结构
    2. LogStream与日志流构建
  4. 日志消息处理流程
    1. 初始化过程
    2. 非模型化消息与模型化消息
    3. 消息路由与输出
  5. 配置模型
    1. Manifest配置结构
    2. 日志级别与输出目标
  6. 使用案例
    1. 基本日志记录
    2. 模型化消息应用
  7. 总结

1. 概述

AUTOSAR Adaptive Platform中的Log and Trace功能集群提供了一套标准化的日志记录和跟踪机制,使应用程序和其他功能集群能够生成、记录和传输诊断和调试信息。这个功能集群是Adaptive Platform架构中的基础组件,为系统开发、调试和诊断提供了关键支持。

Log and Trace功能集群主要解决以下问题:

  • 提供统一的日志API,简化应用程序开发
  • 支持不同严重级别的日志消息分类
  • 实现日志消息的灵活路由(控制台、文件、网络等)
  • 通过模型化消息减少网络带宽占用
  • 支持日志消息的时间同步和上下文信息添加

本文档基于AUTOSAR Adaptive Platform R24-11版本的Log and Trace规范(文档ID:853),分析其架构设计、API结构、实现机制和配置模型,帮助开发者深入理解和正确使用这一功能集群。

2. Log and Trace架构

2.1 架构组件

Log and Trace功能集群由多个组件构成,形成完整的日志处理框架。下图展示了Log and Trace功能集群的总体架构:

在这里插入图片描述

上图展示了AUTOSAR Log and Trace功能集群的架构和组件关系。主要组件包括:

  1. Logger API:提供面向应用程序的日志接口,是应用程序与日志框架交互的主要入口点

    • 提供不同日志级别的记录方法
    • 实现日志消息过滤
    • 支持模型化和非模型化消息
  2. LogStream API:用于构建非模型化日志消息

    • 通过操作符<<追加消息内容
    • 支持各种数据类型的自动转换
    • 允许添加源代码位置信息
  3. Logging框架:核心处理组件

    • 收集和处理日志消息
    • 根据配置路由消息到不同输出
    • 添加时间戳和上下文信息
    • 支持消息分段处理
  4. 输出后端

    • Console输出:直接显示在控制台
    • 文件后端:将日志写入本地文件系统
    • DLT后端:通过AUTOSAR标准DLT协议发送日志消息

2.2 与其他功能集群的关系

Log and Trace与AUTOSAR Adaptive Platform中的其他功能集群有密切的交互关系:

  1. 提供服务给其他功能集群

    • 通信管理、诊断管理、执行管理等几乎所有功能集群都使用Log and Trace记录日志信息
    • 提供统一的Logger接口,确保日志格式和处理的一致性
  2. 依赖其他功能集群

    • 依赖时间同步功能集群获取准确的时间戳
    • 使用TCP/IP栈发送网络日志
    • 使用非易失性存储保存日志文件

Log and Trace功能集群通过标准化的接口与其他组件交互,保持了模块间的低耦合性,同时确保日志信息的统一处理和管理。

3. Logger API详解

3.1 Logger类结构

AUTOSAR Log and Trace的核心是ara::log::Logger类,它提供了日志记录的主要接口。下图展示了Logger类及其相关类的结构:

在这里插入图片描述

Logger类的主要特点和功能:

  1. 多级别日志方法

    • LogDebug():输出调试信息
    • LogVerbose():输出详细信息
    • LogInfo():输出一般信息
    • LogWarn():输出警告信息
    • LogError():输出错误信息
    • LogFatal():输出致命错误
  2. 灵活的日志级别控制

    • WithLevel(LogLevel level):使用指定级别记录日志
    • SetThreshold(LogLevel level):设置日志级别阈值
    • IsEnabled(LogLevel level):检查指定级别是否启用
  3. 模型化消息支持

    • Log(const DltMessageType& id, const Parameters&... params):使用预定义消息ID和参数记录日志
  4. 日志级别枚举

    • kOff(关闭)到kDebug(最详细)的七个级别
    • 每个级别有明确定义的使用场景

值得注意的是,Logger实例通过工厂函数CreateLogger创建,这确保了Logger的生命周期由日志框架管理,应用程序无需担心资源释放问题。

3.2 LogStream与日志流构建

对于非模型化消息,AUTOSAR Log and Trace采用了流式API设计,通过LogStream类实现:

  1. 流式构建

    • 使用operator<<添加各种类型的消息参数
    • 支持自定义类型,只需实现相应的operator<<重载
  2. 参数格式化

    • 通过Format类控制数值输出格式
    • 支持十进制、十六进制、二进制等不同格式
  3. 参数注解

    • 使用Arg模板类为参数添加名称和单位
    • 例如:logger.WithLevel(LogLevel::kInfo) << Arg(4.2, "velocity", "m/s")
  4. 源码位置

    • 通过WithLocation(StringView file, uint32_t line)添加源代码位置信息
    • 有助于快速定位日志来源

这种流式API设计灵活直观,符合C++开发习惯,使日志记录代码简洁易读。

4. 日志消息处理流程

4.1 初始化过程

Log and Trace功能集群在使用前需要经过初始化,下图展示了日志消息的完整处理流程:

在这里插入图片描述

初始化过程包括以下关键步骤:

  1. 应用程序初始化

    • 调用ara::core::Initialize()进行系统初始化
    • 系统加载Manifest配置,识别应用程序ID和上下文信息
  2. 创建Logger实例

    • 调用ara::log::CreateLogger创建Logger对象
    • 可通过两种方式创建:
      • 直接提供上下文ID和描述
      • 使用InstanceSpecifier从模型获取配置
  3. 配置默认日志级别

    • 从Manifest中获取默认日志级别
    • 如果未在Manifest中指定,则使用LogLevel::kWarn作为默认级别

4.2 非模型化消息与模型化消息

AUTOSAR Log and Trace支持两种类型的日志消息:

  1. 非模型化消息

    • 通过Logger的LogXXX()方法或WithLevel()方法创建
    • 使用operator<<添加消息参数
    • 所有消息内容都会通过网络传输
    • 适合开发调试阶段使用
  2. 模型化消息

    • 在ARXML模型中预定义消息ID和格式
    • 通过Logger.Log()方法使用预定义消息
    • 静态消息部分不通过网络传输,减少带宽使用
    • 适合生产环境使用

两种消息类型各有优势,可以在同一应用中同时使用。模型化消息特别适合频繁发送的标准消息,可以显著减少网络流量。

4.3 消息路由与输出

日志消息在处理过程中会经历以下阶段:

  1. 日志级别过滤

    • 检查消息级别是否高于或等于设定的阈值
    • 低于阈值的消息将被丢弃,不会进一步处理
  2. 上下文信息添加

    • 添加应用ID、上下文ID等身份信息
    • 添加时间戳,可选择使用时间同步功能集群提供的同步时间
  3. 消息分段处理

    • 检查消息大小是否超过网络MTU
    • 大消息会被自动分段传输,接收端重组
  4. 多路输出

    • 根据配置,消息可同时发送到多个目标
    • 常见输出目标包括控制台、文件和DLT网络

消息路由配置在Manifest中指定,可以针对不同的应用程序和上下文定制不同的输出策略。

5. 配置模型

5.1 Manifest配置结构

AUTOSAR Log and Trace功能集群的配置通过Manifest文件指定,下图展示了其配置模型:

在这里插入图片描述

配置模型的核心组件包括:

  1. DltApplication

    • 定义应用程序标识符(applicationId)
    • 提供应用程序描述信息
    • 与Process建立关联
  2. DltLogSink

    • 定义日志输出目标
    • 配置默认日志级别阈值
    • 根据category类型提供不同配置:
      • DltLogSinkConsole:输出到控制台
      • DltLogSinkFile:输出到文件(指定path)
      • DltLogSinkDlt:通过DLT协议输出
      • DltLogSinkRemote:输出到远程目标
  3. LogAndTraceMessageCollectionSet

    • 包含多个预定义的DltMessage
    • 每个消息有唯一ID和描述
    • 定义消息类型和隐私级别
  4. PortPrototype

    • 将可执行文件与LogAndTraceInterface关联
    • 确定应用程序可使用的日志消息集合

5.2 日志级别与输出目标

Log and Trace配置中的关键设置包括:

  1. 日志级别

    • kOff:关闭所有日志
    • kFatal:仅致命错误
    • kError:错误和致命错误
    • kWarn:警告及以上级别
    • kInfo:一般信息及以上级别
    • kVerbose:详细信息及以上级别
    • kDebug:所有调试信息
  2. 输出目标类型

    • 控制台输出:开发调试阶段使用
    • 文件输出:支持本地日志存储
    • DLT输出:通过网络发送到诊断工具
    • 远程输出:发送到远程日志服务器

通过合理配置日志级别和输出目标,可以在不同的开发阶段和运行环境中优化日志处理策略,平衡诊断需求与系统性能。

6. 使用案例

6.1 基本日志记录

以下是使用Log and Trace功能集群进行基本日志记录的示例:

#include "ara/log/logger.h"
#include "ara/core/string_view.h"

// 创建Logger实例
ara::log::Logger& logger = ara::log::CreateLogger("APP1", "My Application", ara::log::LogLevel::kInfo);

// 记录不同级别的日志
logger.LogInfo() << "系统启动成功";
logger.LogWarn() << "配置文件未找到,使用默认配置";
logger.LogError() << "无法连接到服务器: " << serverAddress;

// 使用WithLevel方法
logger.WithLevel(ara::log::LogLevel::kInfo) << "当前温度: " << Arg(25.5, "temperature", "°C");

// 添加源码位置信息
logger.LogDebug().WithLocation(__FILE__, __LINE__) << "调试点1通过";

// 使用格式化输出
logger.LogInfo() << "十六进制值: " << ara::log::Hex() << value;

这个示例展示了基本的日志API使用,包括不同级别的日志记录、参数添加、源码位置和格式化输出。

6.2 模型化消息应用

模型化消息需要先在ARXML模型中定义消息,然后生成对应的头文件:

  1. ARXML定义示例

    <LOG-AND-TRACE-MESSAGE-COLLECTION-SET>
      <SHORT-NAME>SystemMessages</SHORT-NAME>
      <DLT-MESSAGE>
        <SHORT-NAME>SystemStartup</SHORT-NAME>
        <MESSAGE-ID>1</MESSAGE-ID>
        <DESCRIPTION>系统启动,版本: {0}, 配置: {1}</DESCRIPTION>
        <MESSAGE-TYPE>kStandard</MESSAGE-TYPE>
      </DLT-MESSAGE>
    </LOG-AND-TRACE-MESSAGE-COLLECTION-SET>
    
  2. 生成的头文件:

    namespace system {
      namespace messages {
        namespace SystemMessages {
          constexpr static SystemStartupType SystemStartup;
        }
      }
    }
    
  3. 使用模型化消息

    #include "system/messages/SystemMessages/messages.h"
    
    // 创建Logger实例,使用InstanceSpecifier
    ara::log::Logger& logger = ara::log::CreateLogger(instanceSpecifier);
    
    // 使用模型化消息
    logger.Log(system::messages::SystemMessages::SystemStartup, "1.2.3", "Standard");
    

模型化消息的优势在于减少网络带宽使用、简化消息管理和增强系统一致性,特别适合大型分布式系统的生产环境。

7. 总结

AUTOSAR Adaptive Platform的Log and Trace功能集群提供了一套全面、灵活的日志记录和跟踪机制,具有以下主要特点:

  1. 统一的日志API

    • 标准化的Logger接口简化应用开发
    • 流式API设计符合C++开发习惯
  2. 多级别日志支持

    • 从致命错误到调试信息的完整级别覆盖
    • 基于阈值的过滤机制优化性能
  3. 灵活的输出路由

    • 支持控制台、文件和网络多种输出
    • 基于配置的动态路由策略
  4. 模型化消息优化

    • 减少网络带宽占用
    • 增强消息一致性和可管理性
  5. 与平台集成

    • 与时间同步等功能集群协同工作
    • 被其他功能集群广泛使用

Log and Trace功能集群作为AUTOSAR Adaptive Platform的基础组件,为开发者提供了强大的日志和调试工具,对于开发复杂的车载软件系统具有重要意义。通过正确使用这一功能集群,开发者可以更有效地开发、测试和维护AUTOSAR Adaptive应用程序,提高软件质量和开发效率。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

KaiGer666

慧眼~施主!!!

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值