Syslog-ng作为下一代的系统日志记录工具,兼容syslog,配置更为清晰灵活,支持正则消息过滤和多种归档方式。在项目中,利用syslog-ng配合自定义DLOG调试接口可以极大增加开发效率。案例主要阐述了DCIMA项目中syslog-ng的配置和使用过程。
本案例同时适用于其他大型嵌入式系统开发中,对今后类似开发有重要借鉴意义。
DCIMA项目中存在大量的系统固件模块如hardware manager、system manager等,在系统运行期间,获得这些服务模块的实时运行数据对于软件维护和开发过程中的测试等具有重要意义。除此之外,软件开发中也可以采用这种配合dlog模块查看log的方法增加调试的简易性和通用性,syslog-ng成为开发过程中强有力的调试工具。其他项目可以参考此文档进行配置和使用。
在安装有AVos系统的DCIMA开发板中,已默认安装syslog-ng服务和dlog模块支持,如何配置和使用这些工具提高我们的开发效率需要一个具体的说明。在DCIMA项目中的配置和使用整体步骤如下:
1. 安装syslog-ng和相关支持程序
2. 配置dlog
3. 配置syslog-ng
4. 远程windows主机中进行日志查看
5. 在程序中调用dlog接口使用syslog
1. 安装syslog-ng服务(DCIMA所用的AVOS在系统定制时已经加入了此模块并默认开启了syslog-ng服务,如未安装此服务的系统可查阅参考文档中的安装过程)。
2. 配置dlog服务使其向syslog发送日志消息
dlog服务必须经过设置以便能向syslog服务发送日志信息。
使用如下命令可以进行不同级别日志信息的发送。
dlogcfg add "*""*" <loglevel>
<loglevel> 其实是一个枚举数字,各个由高到低的优先级说明如下:
0. Emergency
1. Alert
2. Critical
3. Error
4. Warning
5. Notice
6. Info
7. Debug
8. None
例如dlogcfg add "*""*" Debug 将发送所有模块的所有字符串的debug类消息。
3. 配置syslog-ng服务
为了在远程机上查看开发板上程序运行发出的日志消息,syslog-ng必须配置向远程syslog服务主机发送消息的相关参数。步骤如下:
1) 修改/etc/syslog-ng.conf,添加目标远程主机IP地址(即需要查看这些日志的主机地址)
destination d_remote1 {udp("xxx.xxx.xxx.xxx", port(514));};
找到改行并修改地址,如需加入多个远程主机,可类似添加
destination d_remote2{udp("xxx.xxx.xxx.xxx", port(514));};
2) 也可以将日志写入一个本地文件中以备日后查看
destination all { file("/var/log/all.log"); };
3) 配置日记内容来源source(src在安装后在配置文件中已有默认定义),直接按如下定义即可,如目标有多个远程机可根据前述远程机名称定义类似增加d_remote2等。向本机发送log消息的Java代码和SPM适配器中使用source还需添加s_remote 。
log { source(src); destination(d_remote1); };
log { source(s_remote); destination(d_remote1); };
4) 如果仅需要得到某个特定模块的日志,则可添加过滤规则filter将日志记录到一个特定文件。
log { source(src); filter(f_sysmgrd); destination(d_sysmgrd); };
5) 上述修改完成后,重启系统syslog-ng服务。
/etc/init.d/syslog-ng restart
4. 在远程windows主机中查看日志
上述几步中的配置完成后,远程主机就可以使用任意的syslog查看器和服务器查看刚才所配置的客户机中的日志信息了。以项目中使用的windows下的免费SyslogWatcher Personal Edition为例.
5. 配合dlog模块在程序中的应用
C++代码需要配合dlog使用。在C++代码中使用dlog提供的接口可以在log viewer中看到该log所在源代码的文件名和行号。示例如下:
LOG_MSG (DLOG_ERROR,"some error : value = " << argument1);
// log msg = "whatever.cpp:57 some error : value = 42"
std::string strWarning = "some warnings text";
LOG_MSG (DLOG_WARNING, "warning msg: " <<strWarning);
// log msg = "whatever.cpp:60 warning msg: some warningtext"
1. 此方法可以极大提高开发中的测试效率,但配置过程中需要注意:
如果windows服务机中开启了防火墙,需添加对于514端口的例外并且在主机网络设置中取消禁用安全客户端选项
2. 使用syslog查看C++程序调试的日志信息时,系统库usr/lib中需要加入dlog静态库,并且在编译时增加-ldlog这个参数,以链接dlog支持。
3. 如果需要添加对于Java代码的支持,syslog-ng的配置过程相同,只是Java中需添加log4j包的支持并配置其指向syslogAppender。