QNX 系统日志设计

来源:互联网 发布:lol淘宝半价点券 编辑:程序博客网 时间:2024/04/29 00:17

原文地址::http://blog.csdn.net/wb5916/article/details/18136911


1         引言

1.1文档内容

    QNX系统日志进行统一管理。具体包括:约定日志的级别,日志导出方式,日志的保存目录,日志的输出格式。

    通过集中管理,有效方便异常定位和故障分析。

1.2适用平台

软件环境:QNX CAR2

1.3 述语

述语

描述

 

 

 

 

 

 

 

 

 

2         总体设计

通过系统动态库,提供一系统的日志函数,所有模块调用此日志API输出模块的日志。

日志库支持日志的动态管理,日志空间存储循环利用。

2.1日志打印级别

1.模块在日志输出时,支持四种打印级别:错误,警告,通知,调试。

2.系统通过全局环境变量QNX_LOG_OUTPUT_LEVEL来指定所有模块的日志输出等级。在研发时,我们指定的输出等级为:调试。(即调试及以上级别的日志将输出和保存),在量产后,我们指定的输出等级为:错误。(即我们将不保存错误以下的日志)。

       3.模块在输出日志时指定输出的级别。

       4.定义

typedef enum

{

    LOG_ERR = 0,/* 错误 */

    LOG_WAR,    /* 警告 */

    LOG_NOT,    /* 通知 */

    LOG_DBG,    /* 只是调试用的日志 */

    LOG_LAST,

}LOG_LEV_EN;

2.2日志存储管理

       1.系统的所有日志都将存储在flash数据分区中,日志的存储路径为flash挂载目录下的log目录中。日志保存目录由环境变量QNX_LOG_OUTPUT_PATH指定。

       2.模块在初始化时,指定日志的前缀,前缀必须唯一,我们将在log目录下对每个模块分别创建一个目录(前缀名称),分开保存模块的日志文件。

       3.默认我们为每个模块分配10个日志文件,每个文件的最大字节为1M。模块的日志在以文件为单位,在这10个文件中循环存储,文件达到最大个数时,覆盖最老的文件。可选功能为模块可以在日志初始化函数中重新选定日志文件的个数和单个日志文件的最大字节。

       4.日志文件的命名规则:假定前缀为称为:AAAA,则日志文件命名从110分别为,AAAA_01.log    AAAA_02.log   AAAA …………. AAAA_10.log

       其中索引文件:BB.writing 文件名中的BB表示当前正在写入的文件索引号。

2.3日志输出方向

       1.系统的所有日志支持输出到控制台(stdout)和输出到文件(flash)中。通过系统的环境变量QNX_LOG_OUTPUT_DIRECT来指定,模块启动时设定,默认为输出到flash

       2.此项功能只在模块调试开发时使用,比如模块在调试时需要从控制台来查看实时的日志输出,就可以修改此环境变量来切换输出。

2.4日志输出格式

       1.系统日志输出格式支持两种:基本格式和扩展格式,通过环境变量QNX_LOG_OUTPUT_FORMAT来指定,一般在研发时指定为扩展格式,量产后指定为基本格式,默认为基本格式。

       扩展格式:[级别]-[时间]-[函数名]-[文件名]-[行号]-[内容]

       基本格式:[级别]-[时间]-[内容]

 

      

       举例:

       [DBG]-[08/2519:15:42][FuncGetKeyInd][mcumanager.c][814]-[xxxxxxxxxxxxxxxxxxxxx]

[NOT]-[08/2519:15:42] -[xxxxxxxxxxxxxxxxxxxxx]

 

3         接口设计

3.1全局环境变量

       日志保存目录,日志输出方向,日志输出格式,日志打印级别。

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.2日志动态库函数

日志库主要提供3API函数,模块在启动流程:

       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();

4         日志导出管理

为方便日志输出,功能设计如下:

在界面上提供日志导出按扭,在点击时,将系统日志目录/flash/log拷贝到USBSD存储卡的根目录下面。重命令为:log_XXXXX  其中XXXXX为系统当前时间。

5         健壮性处理

5.1多线程并发写处理

同一进程中可能存在多个线程,当多个线程并发写同一日志时,需要进行线程锁控制,解决资源冲突。也就是说LogOut必须是线程安全的。

pthread_mutex_lock函数使用。

5.2 进程安全性

       LogInit/ LogRelease必须是进程安全的,不存在进程资源冲突问题。

5.3 频繁写问题

       日志采取文件流进行读写(FILE*),利用流的机制来保证回写flash的频率。


0 0
原创粉丝点击