日志系统
为了能够实时记录系统发生的各种事件,SylixOS 加入了日志管理功能,用户通过分析日志文件可以及时发现和处理系统运行过程中的问题。
在实际的应用中日志根据具体情况分为不同的等级,SylixOS 日志等级与 Linux 日志等级兼容,SylixOS 提供以下宏来表示不同的日志等级:
- KERN_EMERG :会导致主机系统不可用的情况。
- KERN_ALERT :必须马上采取措施解决的问题。
- KERN_CRIT :比较严重的情况。
- KERN_ERR :运行出现错误。
- KERN_WARNING :可能会影响系统功能的事件。
- KERN_NOTICE :不会影响系统但值得注意。
- KERN_INFO :一般信息。
- KERN_DEBUG :程序或系统调试信息等。
日志等级从上到下依次变低,通常对于系统来说,如果发现等级 KERN_EMERG 的日志,则代表发生了严重的问题导致系统不可以再运行。等级 KERN_DEBUG 通常被用于一些调试信息的打印,在 SylixOS 驱动的开发中,经常使用等级 KERN_ERR 来打印一些错误信息,使用等级 KERN_INFO 来打印一些普通信息。
调用下面函数可以打印日志信息。
#include <SylixOS.h>
INT logPrintk(CPCHAR pcFormat, ...);
函数 logPrintk 原型分析:
- 此函数成功返回打印长度,失败返回-1 并设置错误号。
- 参数 pcFormat 是日志打印格式字符串。
- 参数 ... 是可变参数,可以传递更多的参数。
此函数通常用于驱动开发中的日志打印,功能等价于 printk 函数,因此为了提高程序的兼容性通常使用 printk 函数来代替 logPrintk 函数。
注意:
实际上 SylixOS 中 printk 是对 logPrintk 函数的宏定义。
调用 logPrintk 函数会将日志信息打印到终端中,这在只有少量日志信息的情况下无疑是一种有效的查看方法,但是当日志信息大量增加时,这种方法将是低效的甚至是不可取的。为了解决这种效率问题通常需要将日志信息打印到一个指定文件中,以方便后续的分析。
下面函数用来设置日志文件的文件描述符。
#include <SylixOS.h>
INT logFdSet(INT iWidth, fd_set *pfdsetLog);
INT logFdGet(INT *piWidth, fd_set *pfdsetLog);
函数 logFdSet 原型分析:
- 此函数成功返回 0,失败返回-1 并设置错误号。
- 参数 iWidth 是文件描述符宽度。
- 参数 pfdsetLog 是关心的文件描述符集。
logFdSet 函数将新的文件描述符集设置为日志系统的文件描述符集,logFdGet 函数可以获得日志系统先前的文件描述符信息。需要注意的是,为了不破坏日志系统当前的文件描述符集,通常需要按下面的方式使用这两个函数:
logFdGet(&iWidth, &fdset);
FD_SET(iNewFd, &fdset);
logFdSet(iNewWidth, &fdset);
当设置完文件描述符后,就可以调用下面的函数进行日志的打印。
INT logMsg(CPCHAR pcFormat, PVOID pvArg0,
PVOID pvArg1, PVOID pvArg2,
PVOID pvArg3, PVOID pvArg4,
PVOID pvArg5, PVOID pvArg6,
PVOID pvArg7, PVOID pvArg8,
PVOID pvArg9, BOOL bIsNeedHeader);
函数 logMsg 原型分析:
- 此函数成功返回 0,失败返回-1 并设置错误号。
- 参数 pcFormat 是字符打印格式。
- 参数 pvArg0~pvArg9 是打印参数。
- 参数 bIsNeedHeader 表示是否打印日志头信息。
尽管 SylixOS 向应用层提供了这些打印日志函数,但通常被用于内核空间(如驱动程序开发的 printk 函数),实际上,在应用层 POSIX 已经提供了打印日志的方法,SylixOS 对 POSIX 日志系统提供了支持。