原文地址::http://blog.csdn.net/wb5916/article/details/18136911
QNX系统日志进行统一管理。具体包括:约定日志的级别,日志导出方式,日志的保存目录,日志的输出格式。
通过集中管理,有效方便异常定位和故障分析。
软件环境:QNX CAR2
述语 |
描述 |
|
|
|
|
|
|
|
|
通过系统动态库,提供一系统的日志函数,所有模块调用此日志API输出模块的日志。
日志库支持日志的动态管理,日志空间存储循环利用。
1.模块在日志输出时,支持四种打印级别:错误,警告,通知,调试。
2.系统通过全局环境变量QNX_LOG_OUTPUT_LEVEL来指定所有模块的日志输出等级。在研发时,我们指定的输出等级为:调试。(即调试及以上级别的日志将输出和保存),在量产后,我们指定的输出等级为:错误。(即我们将不保存错误以下的日志)。
3.模块在输出日志时指定输出的级别。
4.定义
typedef enum
{
LOG_ERR = 0,/* 错误 */
LOG_WAR, /* 警告 */
LOG_NOT, /* 通知 */
LOG_DBG, /* 只是调试用的日志 */
LOG_LAST,
}LOG_LEV_EN;
1.系统的所有日志都将存储在flash数据分区中,日志的存储路径为flash挂载目录下的log目录中。日志保存目录由环境变量QNX_LOG_OUTPUT_PATH指定。
2.模块在初始化时,指定日志的前缀,前缀必须唯一,我们将在log目录下对每个模块分别创建一个目录(前缀名称),分开保存模块的日志文件。
3.默认我们为每个模块分配10个日志文件,每个文件的最大字节为1M。模块的日志在以文件为单位,在这10个文件中循环存储,文件达到最大个数时,覆盖最老的文件。可选功能为模块可以在日志初始化函数中重新选定日志文件的个数和单个日志文件的最大字节。
4.日志文件的命名规则:假定前缀为称为:AAAA,则日志文件命名从1到10分别为,AAAA_01.log AAAA_02.log AAAA …………. AAAA_10.log
其中索引文件:BB.writing 文件名中的BB表示当前正在写入的文件索引号。
1.系统的所有日志支持输出到控制台(stdout)和输出到文件(flash)中。通过系统的环境变量QNX_LOG_OUTPUT_DIRECT来指定,模块启动时设定,默认为输出到flash。
2.此项功能只在模块调试开发时使用,比如模块在调试时需要从控制台来查看实时的日志输出,就可以修改此环境变量来切换输出。
1.系统日志输出格式支持两种:基本格式和扩展格式,通过环境变量QNX_LOG_OUTPUT_FORMAT来指定,一般在研发时指定为扩展格式,量产后指定为基本格式,默认为基本格式。
扩展格式:[级别]-[时间]-[函数名]-[文件名]-[行号]-[内容]
基本格式:[级别]-[时间]-[内容]
举例:
[DBG]-[08/2519:15:42][FuncGetKeyInd][mcumanager.c][814]-[xxxxxxxxxxxxxxxxxxxxx]
[NOT]-[08/2519:15:42] -[xxxxxxxxxxxxxxxxxxxxx]
日志保存目录,日志输出方向,日志输出格式,日志打印级别。
Export QNX_LOG_OUTPUT_PATH=/opt/datas/log
Export QNX_LOG_OUTPUT_DIRECT=[flash/stdout]
Export QNX_LOG_OUTPUT_FORMAT=[normal/extra]
Export QNX_LOG_OUTPUT_LEVEL=[ERR/WAR/NOT/DBG]
默认为:输出到FLASH,打印基本格式,打印级别为:ERR。
日志库主要提供3个API函数,模块在启动流程:
Main()
{
//日志初始化函数 (设置日志前缀,日志打印级别,日志输出方向,日志文件个数,日志文件大小)
//运行输出日志函数 (打印级别,内容字符串)
………………………
//日志释放函数。(释放和回写相关日志)
}
函数 |
功能描述 |
LogInit |
设置日志前缀,日志打印级别,日志输出方向,日志文件个数,日志文件大小。其中日志前经为必选,其它为可选(取环境变量值)。 |
LogOut |
输出日志函数,参数为:打印级别,日志字符串 |
LogRelease |
日志释放函数,参数无,功能为:释放写文件句柄,文件读写锁,释放分配内存,回写磁盘等收尾工作。 |
|
|
int LogInit(char *pcFilePath, char *pcFilePrefix,
int iLevel=0,int iDirect=0, int iMaxFileSize=0, int iMaxFileCount=0);
void LogOut (int iLevel, const char * fmt, ...);
void LogRelease();
为方便日志输出,功能设计如下:
在界面上提供日志导出按扭,在点击时,将系统日志目录/flash/log拷贝到USB或SD存储卡的根目录下面。重命令为:log_XXXXX 其中XXXXX为系统当前时间。
同一进程中可能存在多个线程,当多个线程并发写同一日志时,需要进行线程锁控制,解决资源冲突。也就是说LogOut必须是线程安全的。
pthread_mutex_lock函数使用。
LogInit/ LogRelease必须是进程安全的,不存在进程资源冲突问题。
日志采取文件流进行读写(FILE*),利用流的机制来保证回写flash的频率。