Diagnostic Log and Trace——DLT 离线日志存储

Posted andylauren

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Diagnostic Log and Trace——DLT 离线日志存储相关的知识,希望对你有一定的参考价值。

doc/dlt_offline_logstorage.md · RTplay/dlt-daemon - Gitee.com

DLT离线日志存储介绍

Logstorage 是一种将 DLT 日志存储在目标系统或连接到目标的外部设备(例如 U 盘)上的机制。它可以被视为对已经是 DLT 一部分的离线跟踪功能的改进。

配置

一般配置在 dlt.conf 中完成。存在以下配置选项:

##############################################################################
# Offline logstorage                                                         #
##############################################################################
# Store DLT log messages, if not set offline logstorage is off (Default: off)
# Maximum devices to be used as offline logstorage devices
# OfflineLogstorageMaxDevices = 1

# Path to store DLT offline log storage messages (Default: off)
# OfflineLogstorageDirPath = /opt

# File options
# Appends timestamp in log file name, Disable by setting to 0 (Default: 1)
# OfflineLogstorageTimestamp = 0

# Appends delimiter in log file name, allowed punctutations only (Default: _)
# OfflineLogstorageDelimiter = _

# Wrap around value for log file count in file name (Default: UINT_MAX)
# OfflineLogstorageMaxCounter = 999

# Maximal used memory for Logstorage Cache in KB (Default: 30000 KB)
# OfflineLogstorageCacheSize = 30000

配置文件格式

对于存储日志的 DLT 守护程序,名为“dlt_logstorage.conf”的配置文件应存在于外部存储或内部存储设备(= 文件系统中的给定路径)中。

[Filter<unique number>]              # 过滤器配置名称
LogAppName=<APID>                    # 从中存储日志的应用程序的名称。多个应用程序可以用“,”分隔,“.*”表示所有应用程序
ContextName=<CTID>                   # 要从中存储日志的上下文的名称或名称。多个上下文可以用“,”分隔,“.*”表示应用程序的所有上下文
LogLevel=<Log level>                 # 定义日志级别,例如DLT_LOG_INFO 或 DLT_LOG_FATAL
File=<file name>                     # 包含日志的已创建文件的基本名称,例如“例子”。有关进一步的文件命名方案配置,请参阅 man dlt.conf
FileSize=<file size in bytes>        # 最大文件大小(以字节为单位)
NOFiles=<number of files>            # 删除最旧文件并创建新文件之前创建的文件数
SyncBehavior=<strategy>              # 指定同步策略。默认值:在每条消息后同步。请参阅下面的 Logstorage Rinbuffer 实现。
EcuID=<ECUid>                        # 指定ECU标识符
SpecificSize=<spec size in bytes>    # 达到特定大小后将日志存储在存储设备中。

参数“SyncBehavior”、“EcuID”和“SpecificSize”是可选的——所有其他参数都是必需的。

如果参数“LogAppName”和“ContextName”都设置为通配符或配置文件中不存在,则必须指定“EcuID”。

典型的配置文件可能如下所示:

[FILTER1]
LogAppName=APP1
ContextName=CON1,CON2
LogLevel=DLT_LOG_INFO
File=App
FileSize=10000
NOFiles=10

[FILTER2]
LogAppName=TEST
ContextName=.*
LogLevel=DLT_LOG_ERROR
File=Test
FileSize=250000
NOFiles=5
EcuID=ECU1
SyncBehavior=ON_SPECIFIC_SIZE
SpecificSize=5000

[FILTER3]
LogAppName=TEST
ContextName=.*
LogLevel=DLT_LOG_ERROR
File=Test
FileSize=250000
NOFiles=5
SyncBehavior=ON_FILE_SIZE,ON_DEMAND
EcuID=ECU1

在非详细模式的情况下,应使用以下过滤器。

[NON-VERBOSE-STORAGE-FILTER<unique number>]    # filter configuration name for a Non-Verbose passive node
EcuID=<ECUid>                                  # Specify ECU identifier
File=<file name>                               # Base name of the created files that containing the logs, e.g. "example". For further file naming scheme configurations see man dlt.conf
FileSize=<file size in bytes>                  # Maximum file size in bytes
NOFiles=<number of files>                      # Number of created files before oldest is deleted and a new one is created

[NON-VERBOSE-LOGLEVEL-CTRL<unique number>]     # filter configuration name to control log level of Non-Verbose applications
LogAppName=<APID>                              # Name of application (wildcard allowed)
ContextName=<CTID>                             # Name of context (wildcard allowed)
LogLevel=<Log level>                           # Define log level, e.g. DLT_LOG_INFO or DLT_LOG_FATAL
EcuID=<ECUid>                                  # Specify ECU identifier

典型的配置文件可能如下所示:

[NON-VERBOSE-STORAGE-FILTER1]
EcuID=PASV
File=scc
FileSize=50000
NOFiles=5

[NON-VERBOSE-LOGLEVEL-CTRL1]
LogAppName=LOG
ContextName=TEST
LogLevel=DLT_LOG_DEBUG
EcuID=PASV

[NON-VERBOSE-LOGLEVEL-CTRL2]
LogAppName=.*
ContextName=.*
LogLevel=DLT_LOG_WARN
EcuID=PASV

使用 DLT 离线日志存储

通过在 dlt.conf 中设置 OfflineLogstorageMaxDevices = 1 来启用 OfflineLogstorage。请注意,如果使用多个 Logstorage 设备,DLT 的性能可能会下降;性能也取决于所用设备的写入速度。

创建设备文件夹:

mkdir -p /var/dltlogs

创建一个配置文件并将其存储到该文件夹​​中或挂载包含配置文件的外部设备。

启动 DLT 守护进程。如果 DLT 守护程序已经在启用离线日志存储的情况下启动,则不需要这样做。

触发 DLT 守护进程使用新的日志存储设备:

dlt-logstorage-ctrl -c 1 -p /var/dltlogs

之后,匹配过滤器配置的日志将存储到 Logstorage 设备上。

dlt-logstorage-ctrl -c 0 -p /var/dltlogs

配置的日志存储设备与 DLT 守护程序断开连接。

使用 dlt-logstorage-ctrl 应用程序

Usage: dlt-logstorage-ctrl [options]
Send a trigger to DLT daemon to connect/disconnect a certain logstorage device

Options:
  -c         Connection type: connect = 1, disconnect = 0
  -d[prop]   Run as daemon: prop = use proprietary handler
             'prop' may be replaced by any meaningful word
  -e         Set ECU ID (Default: ECU1)
  -h         Usage
  -p         Mount point path
  -s         Sync Logstorage cache
  -t         Specify connection timeout (Default: 10s)
  -S         Send message with serial header (Default: Without serial header)
  -R         Enable resync serial header
  -v         Set verbose flag (Default:0)

测试 DLT 离线日志存储

以下过程可用于测试离线 Logstorage:

1、通过在 dlt.conf 中设置 OfflineLogstorageMaxDevices = 1 来启用 OfflineLogstorage

2、启动 dlt 守护进程

logstorage 的默认搜索路径是:/tmp/dltlogs/dltlogsdevX 其中 X 是 [1..OfflineLogstorageMaxDevices] 范围内的数字

3、创建设备文件夹

$ mkdir -p /var/dltlog

在此文件夹中创建配置文件“dlt_logstorage.conf”并定义过滤器配置:

[FILTER1]
LogAppName=LOG
ContextName=TEST
LogLevel=DLT_LOG_WARN
File=example
FileSize=50000
NOFiles=5

4、触发 dlt-daemon 使用新设备

$ dlt-logstorage-ctrl -c 1 -p /var/dltlog

5、启动 dlt-example-user

$ dlt-example-user Hello123

执行后,会在 /var/dltlogs 中创建一个日志文件,例如示例_001_20150512_133344.dlt

要检查文件的内容,请使用 dlt-convert 或 DLT Viewer 打开它。

Logstorage 环形缓冲区实现

DLT Logstorage 主要用于在连接到目标的外部大容量存储设备上存储一组可配置的日志。在这种情况下,将每个传入的日志消息直接写入外部存储设备是值得赞赏的,因为存储设备可能随时被卸载/突然删除。立即写入每条日志消息可避免丢失过多消息的问题,因为在设备从目标物理移除之前无法完成文件系统同步。另一方面,DLT Logstorage 功能也可用于在任何内部非易失性存储器(例如闪存设备)上存储一组可配置的日志。由于FLASH设备写周期有限的原因,必须尽可能减少写周期数。但是,在意外操作系统崩溃的情况下丢失日志消息的缺点也必须考虑在内。显而易见的想法是将传入的日志消息缓存在内存中,并根据某种策略将日志数据写入磁盘。传入的日志消息存储在具有特定大小的数据缓存中。根据用户定义的策略,将数据缓存写入存储设备,不依赖于文件系统的同步机制。

维护 Logstorage 日志级别实现

logstorage FILTER 中每个用户上下文的日志级别设置将被视为最高优先级。其他客户端(例如:dlt-control、dlt-viewer)可以将用户上下文的日志级别更新为较低级别,但无法更新为较高级别。如果客户端需要将用户上下文的日志级别更新到更高级别,则在 [General] 会话中实现了新的宏MaintainLogstorageLogLevel,以允许将用户上下文的日志级别更改为任何级别或维护日志存储配置的日志级别。

典型的配置文件可能如下所示:

[General]
MaintainLogstorageLogLevel=OFF

通过设置MaintainLogstorageLogLevel=OFF 或MaintainLogstorageLogLevel=0,客户端能够将任何日志级别更新到用户上下文。

通过设置MaintainLogstorageLogLevel=ON 或MaintainLogstorageLogLevel=1 或不设置,logstorage 将保持其日志级别为最高优先级。

设置默认路径

# Path to store DLT offline log storage messages (Default: off)

OfflineLogstorageDirPath = /tmp

使用这个设置了默认路径后就不需要再使用命令进行挂载设备了。

使用dlt-convert example_1_20211103-144749.dlt –a命令查看离线日志。

以上是关于Diagnostic Log and Trace——DLT 离线日志存储的主要内容,如果未能解决你的问题,请参考以下文章

Diagnostic Log and Trace——dlt的编译和安装

Diagnostic Log and Trace——开发人员如何使用 DLT

Diagnostic Log and Trace——为应用程序和上下文设置日志级别的方法

使用 Trace 和 TraceSource 的区别

Diagnostic and programming Interface

Diagnostic and programming Interface