在排查问题时,看log尤为重要,可以清楚地看到流程走到哪一步。一个log系统设置是否合理直接影响到问题的定位的效率。
- dpdk日志系统
1、根据级别和类型对日志信息进行过滤
根据日志信息的优先级高低,dpdk将日志信息分为8个级别,其中RTE_LOG_DEBUG的值为8,代码log级别小于当前系统log级别,才会输出。dpdk支持的日志等级如下(参考具体的dpdk版本):
/* these log types can be used in an application */
#define RTE_LOGTYPE_USER1 24 /**< User-defined log type 1. */
#define RTE_LOGTYPE_USER2 25 /**< User-defined log type 2. */
#define RTE_LOGTYPE_USER3 26 /**< User-defined log type 3. */
#define RTE_LOGTYPE_USER4 27 /**< User-defined log type 4. */
#define RTE_LOGTYPE_USER5 28 /**< User-defined log type 5. */
#define RTE_LOGTYPE_USER6 29 /**< User-defined log type 6. */
#define RTE_LOGTYPE_USER7 30 /**< User-defined log type 7. */
#define RTE_LOGTYPE_USER8 31 /**< User-defined log type 8. */
log类型可以指定只输出哪一模块的日志信息,使用bitmap来配置,当对应的位置1并且日志等级满足上述才会输出,dpdk定义的log类型如下:
/* SDK log type */
#define RTE_LOGTYPE_EAL 0 /**< Log related to eal. */
#define RTE_LOGTYPE_MALLOC 1 /**< Log related to malloc. */
#define RTE_LOGTYPE_RING 2 /**< Log related to ring. */
#define RTE_LOGTYPE_MEMPOOL 3 /**< Log related to mempool. */
#define RTE_LOGTYPE_TIMER 4 /**< Log related to timers. */
#define RTE_LOGTYPE_PMD 5 /**< Log related to poll mode driver. */
#define RTE_LOGTYPE_HASH 6 /**< Log related to hash table. */
#define RTE_LOGTYPE_LPM 7 /**< Log related to LPM. */
#define RTE_LOGTYPE_KNI 8 /**< Log related to KNI. */
#define RTE_LOGTYPE_ACL 9 /**< Log related to ACL. */
#define RTE_LOGTYPE_POWER 10 /**< Log related to power. */
#define RTE_LOGTYPE_METER 11 /**< Log related to QoS meter. */
#define RTE_LOGTYPE_SCHED 12 /**< Log related to QoS port scheduler. */
#define RTE_LOGTYPE_PORT 13 /**< Log related to port. */
#define RTE_LOGTYPE_TABLE 14 /**< Log related to table. */
#define RTE_LOGTYPE_PIPELINE 15 /**< Log related to pipeline. */
#define RTE_LOGTYPE_MBUF 16 /**< Log related to mbuf. */
#define RTE_LOGTYPE_CRYPTODEV 17 /**< Log related to cryptodev. */
#define RTE_LOGTYPE_EFD 18 /**< Log related to EFD. */
#define RTE_LOGTYPE_EVENTDEV 19 /**< Log related to eventdev
2、用户自定义
用户可以根据自己的定义来输出,体现对用户友好。Dpdk留给用户8个可由用户自定义的log类型:
/* these log types can be used in an application */
#define RTE_LOGTYPE_USER1 24 /**< User-defined log type 1. */
#define RTE_LOGTYPE_USER2 25 /**< User-defined log type 2. */
#define RTE_LOGTYPE_USER3 26 /**< User-defined log type 3. */
#define RTE_LOGTYPE_USER4 27 /**< User-defined log type 4. */
#define RTE_LOGTYPE_USER5 28 /**< User-defined log type 5. */
#define RTE_LOGTYPE_USER6 29 /**< User-defined log type 6. */
#define RTE_LOGTYPE_USER7 30 /**< User-defined log type 7. */
#define RTE_LOGTYPE_USER8 31 /**< User-defined log type 8. */
3、支持syslog
syslog是Linux系统中功能比较完善的log工具,Linux系统中的服务基本都使用syslog记录自己的日志信息。其所记录的日志一般在/var/log目录中。dpdk的log系统除了按照自己的方式处理日志之外,还会根据命令行的选项将日志写入syslog.conf配置的日志文件中(syslog相关信息可参考man手册)。
4、代码中使用log
(1)通过命令行指定等级:--log-level
(2)设置日志类型:rte_set_log_type()
(3)打印log: RTE_LOG(l, t, ...)
(4)用户自定义:#define RTE_LOGTYPE_*** RTE_LOGTYPE_USER1
(5)将输出定义到指定文件:f=fopen() rte_openlog_stream(f)
(6)设置某个模块的等级:rte_log_set_level()
(7)设置全局等级rte_log_set_global_level()
- linux日志系统
1、只有日志优先级
2、相关日志在/var/log下面
3、实用工具:logrotate
可以自动对日志进行截断(或轮循)、压缩以及删除旧的日志文件