使用dlt-viewer查看日志

 2023-09-05 阅读 99 评论 0

摘要:想知道node-health-monitor在哪里退出了,要查看日志。一读代码发现所有日志都是用DLT_LOG输出的,syslog默认位置/var/log下看不到任何有用的日志。于是搜索如何查看dlt日志,how to view dlt log,查到可以使用dlt-viewer查看DLT日志 。 该组件作用

想知道node-health-monitor在哪里退出了,要查看日志。一读代码发现所有日志都是用DLT_LOG输出的,syslog默认位置/var/log下看不到任何有用的日志。于是搜索如何查看dlt日志,how to view dlt log,查到可以使用dlt-viewer查看DLT日志 。
该组件作用是通过SSH连接ECU,可视化呈现ECU上所有通过DLT输出的日志,如下图:

该组件为开源软件,可通过源代码编译后使用。参考文档:
https://pelux.io/software-factory/master/swf-blueprint/docs/articles/sdk/read-system-logs.html
源代码:
https://github.com/COVESA/dlt-viewer
dlt-viewer日志分析
首先映入眼帘的是nhm在请求pas服务时被拒绝,systemctl status pas-daemon发现该服务压根没启动。
systemctl enable pas-daemon启用服务后还是不行。
分析dlt-viewer日志发现:
ERROR1
pas服务在获取DBUS name时失败了。
查看nodestatemanager-daemon服务的配置文件,大致在如下四个位置:
/lib/systemd/system/nodestatemanager-daemon.service

其中针对dbus配置的行:
BusName=org.genivi.NodeStateManager
/etc/dbus-1/system.d/org.genivi.NodeStateManager.conf

该文件用于定义dbus总线的归属、目的地及接口。
其中:

需要跟代码中g_bus_own_name函数传入的bus name匹配。

一般跟own的值一致。

定义interface,取值与下面文件中的接口相一致:
/usr/share/dbus-1/interfaces/org.genivi.NodeStateManager.LifecycleConsumer.xml

另外还有两个接口定义文件,但不知道为什么不需要/etc/dbus-1/system.d/下没有对应的conf
/usr/share/dbus-1/interfaces/org.genivi.NodeStateManager.LifecycleControl.xml
org.genivi.NodeStateManager.LifecycleControl.xml
/usr/share/dbus-1/system-services/org.genivi.NodeStateManager.LifeCycleControl.service

[D-BUS Service]
Name=org.genivi.NodeStateManager
SystemdService = nodestatemanager-daemon.service
Exec=/bin/false
该文件用于定义dbus服务名及对应的systemd服务名和启动命令行。注意Name要与system服务service文件中定义的 BusName 匹配。

根据以上信息,结合persistence-admin源代码中的dbus配置文件,手动添加如下文件:
/etc/dbus-1/system.d/org.genivi.persistence.admin.conf
/usr/share/dbus-1/system-services/org.genivi.persistence.admin.service
同时在/lib/systemd/system/pas-daemon.service中添加:
BusName=org.genivi.persistence.admin
重启发现pas-daemon服务起来了,但node-health-monitor服务仍然没有起来。
继续查看dlt-viewer日志发现:
ERROR2
node-health-monitor服务也获取DBUS name失败。
按照解决ERROR1的方法对node-health-monitor进行dbus配置,结果不好用。
看node-health-monitor源代码发现,其使用的dbus类型为2,即session dbus,而之前的nodestatemanager-daemon和pas-daemon服务使用的dbus类型都是1,system dbus。
结果及总结
经过搜索system dbus和session dbus的区别和各自的配置方法,以及多番尝试,最后得出如下结论:

  1. 服务service文件
    使用system dbus的服务,其服务service文件存放在/lib/systemd/system下
    使用session dbus的服务,其服务service文件存放在/etc/systemd/user和/lib/systemd/system两个位置,/etc/systemd/user下的service文件可以是软链接指向/lib/systemd/system下对应的服务service文件
  2. dbus配置文件
    使用system dbus的服务,其dbus配置文件存放在/etc/dbus-1/system.d/
    使用session dbus的服务,其dbus配置文件存放在/etc/dbus-1/session.d/
  3. dbus服务service文件
    使用system dbus的服务,其dbus服务service文件存放在/usr/share/dbus-1/system-services/
    使用session dbus的服务,其dbus服务service文件存放在/usr/share/dbus-1/services/
  4. 服务启用命令
    使用system dbus的服务,启用服务的命令为systemctl enable xxx.service
    使用session dbus的服务,启用服务的命令为systemctl --user enable xxx.service
  5. 服务状态查看
    使用system dbus的服务,查看服务状态的命令为systemctl status xxx.service
    使用session dbus的服务,查看服务状态的命令为systemctl --user status xxx.service
    第四点尤为重要,因为没有注意到这一点卡了三四天,直到在启用服务时加了–user,才终于把node-health-monitor服务启动起来。
    执行:
    ps -e | grep -i dbus
    会发现有两个dbus-daemon:
    dbus-daemon --system --address=systemd: --nofork --nopidfile --systemd-activation --syslog-only
    dbus-daemon --session --address=systemd: --nofork --nopidfile --systemd-activation --syslog-only
    第一个由/lib/systemd/system/dbus.service服务启动
    第二个由/usr/lib/systemd/user/dbus.service服务启动
    依赖于dbus的服务在service文件中定义require和after的时候都添加dbus.service,系统会根据服务对应的dbus服务类型(system或session)自动匹配对应目录下的dbus.service。

版权声明:本站所有资料均为网友推荐收集整理而来,仅供学习和研究交流使用。

原文链接:https://808629.com/713.html

发表评论:

本站为非赢利网站,部分文章来源或改编自互联网及其他公众平台,主要目的在于分享信息,版权归原作者所有,内容仅供读者参考,如有侵权请联系我们删除!

Copyright © 2022 86后生记录生活 Inc. 保留所有权利。

底部版权信息