DPDK中Log的使用方法

本文谢绝转载,如有需要,请以链接的方式引用。

注:本文中的代码为git库中的dpdk-2.0.0-rc1,对应Linux平台。

1 log简介

dpdk中通过log系统记录相关的日志信息,每一条日志除日志内容外,还有两个附加信息,log级别和log类型。开发人员可根据级别和类型对日志信息进行过滤,只记录

必要的日志。

1.1 log级别

根据日志信息的优先级高低,dpdk将日志信息分为8个级别,其中RTE_LOG_DEBUG的值为8,这是日志的最高级别,也就是说记录的日志信息最多;相应的,RTE_LOG_EMERG为日志的最低级别,只记录严重的错误信息。dpdk在运行时只有一个log级别,代码中每一条日志都有其固定的log级别,只有代码的log级别小于等于当前系统的log级别时

,才有可能记录该条日志(还要参考log类型)。

log级别的相关宏在“./lib/librte_eal/common/include/rte_log.h”中定义:

91 /* Can‘t use 0, as it gives compiler warnings */

92 #define RTE_LOG_EMERG    1U  /**< System is unusable.               */

93 #define RTE_LOG_ALERT    2U  /**< Action must be taken immediately. */

94 #define RTE_LOG_CRIT     3U  /**< Critical conditions.              */

95 #define RTE_LOG_ERR      4U  /**< Error conditions.                 */

96 #define RTE_LOG_WARNING  5U  /**< Warning conditions.               */

97 #define RTE_LOG_NOTICE   6U  /**< Normal but significant condition. */

98 #define RTE_LOG_INFO     7U  /**< Informational.                    */

99 #define RTE_LOG_DEBUG    8U  /**< Debug-level messages.             */

1.2 log类型

与常见的log系统不同(如Linux的syslog),dpdk还根据日志所属的不同模块,将日志分为不同的log类型。每种log类型通过一个bit来表示,这与log级别不同,dpdk在运行时可以配置多个log类型(保存为bitmap)。代码中每一条日志都有其固定的log类型,当该log类型相应的bit置1时,才有可能记录该条日志(还要参考log级别)。

dpdk除了默认的log类型外,还留给用户8个可由用户自定义的log类型,用户可利用这8个自定义的log类型,将转发程序中的日志进行更详细的分类。

log类型的相关宏在“./liblibrte_eal/common/include/rte_log.h”中定义:

63 /* SDK log type */

64 #define RTE_LOGTYPE_EAL     0x00000001 /**< Log related to eal. */

65 #define RTE_LOGTYPE_MALLOC  0x00000002 /**< Log related to malloc. */

66 #define RTE_LOGTYPE_RING    0x00000004 /**< Log related to ring. */

67 #define RTE_LOGTYPE_MEMPOOL 0x00000008 /**< Log related to mempool. */

68 #define RTE_LOGTYPE_TIMER   0x00000010 /**< Log related to timers. */

69 #define RTE_LOGTYPE_PMD     0x00000020 /**< Log related to poll mode driver. */

70 #define RTE_LOGTYPE_HASH    0x00000040 /**< Log related to hash table. */

71 #define RTE_LOGTYPE_LPM     0x00000080 /**< Log related to LPM. */

72 #define RTE_LOGTYPE_KNI     0x00000100 /**< Log related to KNI. */

73 #define RTE_LOGTYPE_ACL     0x00000200 /**< Log related to ACL. */

74 #define RTE_LOGTYPE_POWER   0x00000400 /**< Log related to power. */

75 #define RTE_LOGTYPE_METER   0x00000800 /**< Log related to QoS meter. */

76 #define RTE_LOGTYPE_SCHED   0x00001000 /**< Log related to QoS port scheduler. */

77 #define RTE_LOGTYPE_PORT    0x00002000 /**< Log related to port. */

78 #define RTE_LOGTYPE_TABLE   0x00004000 /**< Log related to table. */

79 #define RTE_LOGTYPE_PIPELINE 0x00008000 /**< Log related to pipeline. */

80

81 /* these log types can be used in an application */

82 #define RTE_LOGTYPE_USER1   0x01000000 /**< User-defined log type 1. */

83 #define RTE_LOGTYPE_USER2   0x02000000 /**< User-defined log type 2. */

84 #define RTE_LOGTYPE_USER3   0x04000000 /**< User-defined log type 3. */

85 #define RTE_LOGTYPE_USER4   0x08000000 /**< User-defined log type 4. */

86 #define RTE_LOGTYPE_USER5   0x10000000 /**< User-defined log type 5. */

87 #define RTE_LOGTYPE_USER6   0x20000000 /**< User-defined log type 6. */

88 #define RTE_LOGTYPE_USER7   0x40000000 /**< User-defined log type 7. */

89 #define RTE_LOGTYPE_USER8   0x80000000 /**< User-defined log type 8. */

1.3 支持syslog

syslog是Linux系统中功能比较完善的log工具,Linux系统中的服务基本都使用syslog记录自己的日志信息。其所记录的日志一般在/var/log目录中。dpdk的log系统除了按照自己的方式处理日志之外,还会根据命令行的选项将日志写入syslog.conf配置的日志文件中(syslog相关信息可参考man手册)。

2 命令行中与log有关的配置项

2.1 配置能记录日志的最高级别

通过eal的命令行选项"--log-level"指定,最大值为8,对应RTE_LOG_DEBUG,此时记录的日志内容最多;最小值为1,对应RTE_LOG_EMERG。

2.2 配置syslog的facility

通过eal的命令行选项"--syslog"设置写入syslog的默认日志类型,此参数对应openlog()的第三个参数。

3.在代码中使用log

3.1 标记所有要记录的log类型

eal的命令行中没有添加配置log类型的命令行选项,猜测其可能有2个原因:1) 输出哪种类型的log,转发程序关心dpdk中哪个模块的log,开发人员在写转发程序时已经确定,这不像log级别那样根据运行环境的不同而变化(调试时需要较多的日志);2)通过命令行配置bitmap这样的资源,不是那么容易,如果直接配置bitmap,其选值不够直观(无法在命令行选项中使用代码中定义的宏),如果通过重复使用同一个命令行选项来配置bitmap中的每一位,又有些繁琐。

在转发程序的代码中,通过调用rte_set_log_type()函数来设置log类型的bitmap。函数的定义查看lib/librte_eal/common/include/rte_log.h。

3.2 使用log函数

log系统提供的标准log函数(宏)为RTE_LOG(l, t, ...),其中第一个参数l为此条log的级别(参考1.1),第二个参数t为此条log的类型(参考1.2)。但在dpdk的模块中,一般会将此函数进行封装,将t设置为固定值。

4. 查看log内容

默认情况下,符合优先级和类型要求的日志会通过自定义的文件操作函数,将日志:

1) 通过mempool记录历史日志信息

2) 输出到标准输出(stdout)

3) 通过syslog()将日志记录到syslog.conf中对应的文件中

用户也可以在转发程序中通过调用rte_openlog_stream()设置记录日志的文件描述符,这种情况下,记录日志的方式由用户的代码决定。

5. 深入分析

DPDK对程序内部的日志区分了级别和类型,这比syslog的记录更加精细,后者在程序内部只能区分不同级别(反复调用openlog()/closelog()也可实现区分日志类型,但是代码的执行十分繁琐)。

如果DPDK的使用者对日志系统的要求不高,DPDK就会按照默认的方式来保存日志,此时会将日志输出到stdout,我认为如果记录日志较频繁,这将会影响程序的性能。

但DPDK的日志系统的另一个好处就是,使用者可以自定义记录日志的方式,通过fopencookie()打开一个自己定义的文件操作函数的文件指针,调用rte_openlog_stream()函数将其设置为记录log的文件指针。

时间: 2024-11-10 01:24:21

DPDK中Log的使用方法的相关文章

schema中的虚拟属性方法

schema中的虚拟属性方法相当于vue中的计算属性,它是通过已定义的schema属性的计算\组合\拼接得到的新的值 var personSchema = new Schema({ name: { first: String, last: String } }); var Person = mongoose.model('Person', personSchema); // create a document var bad = new Person({ name: { first: 'Walt

iOS5中UIViewController的新方法

iOS5中UIViewController的新方法 前言 在苹果的 WWDC2011 大会视频的<Session 101 - What’s New in Cocoa> 和<Session 102 - Implementing UIViewController Containment> 中介绍了苹果在 iOS5 中给 UIViewController 新增加的 5 方法以及一个属性: // 方法addChildViewController: removeFromParentViewC

【计算机视觉】SIFT中LoG和DoG比较

在实际计算时,三种方法计算的金字塔组数noctaves,尺度空间坐标σ,以及每组金字塔内的层数S是一样的.同时,假设图像为640*480的标准图像. 金字塔层数: 其中o_min = 0,对于分辨率为640*480的图像N=5. 每组金字塔内图像数:S=3,即在做极值检测时使用金子塔内中间3张图像.对于LoG每组金字塔内有S+2张图像(S=-1,0,1,2,3),需要做S+1次高斯模糊操作(后一张图像由前一张做高斯模糊得到):而DoG每组金字塔有S+3张高斯图像,得到S+2张DoG图像.尺度空间

Linux中LVM功能使用方法

1.介绍        LVM全称Logical Volume Manager(逻辑卷管理器),是将存储空间虚拟化成虚拟设备来进行管理的一种机制.LVM本身通过调用Linux内核中的"Device-mapper"功能来实现这种机制.         LVM组成部分: Physical volume(pv)物理卷:是LVM底层的设备,可以是硬盘分区,硬盘. Volume group (vg)卷组:是组织pv的管理单元. Logical volume(lv)逻辑卷:虚拟分区,既可以存储数据

JavaScript中Object.prototype.toString方法的原理

在JavaScript中,想要判断某个对象值属于哪种内置类型,最靠谱的做法就是通过Object.prototype.toString方法. ? 1 2 var arr = []; console.log(Object.prototype.toString.call(arr)) //"[object Array]" 本文要讲的就是,toString方法是如何做到这一点的,原理是什么. ECMAScript 3 在ES3中,Object.prototype.toString方法的规范如下:

详解Webwork中Action 调用的方法

详解Webwork中Action 调用的方法 从三方面介绍webwork action调用相关知识: 1.Webwork 获取和包装 web 参数 2.这部分框架类关系 3.DefaultActionProxyFactory.DefaultActionProxy.DefaultActionInvocation 终于要开始 webwork 核心业务类的总结,webwork 通过对客户端传递的 web 参数重新包装,进行执行业务 Action 类,并反馈执行结果,本篇源码分析对应下图 WebWork

php面向对象类中常用的魔术方法

php面向对象类中常用的魔术方法 1.__construct():构造方法,当类被实例化new $class时被自动调用的方法,在类的继承中可以继承与覆盖该方法,例: //__construct() class construct{ public function __construct(){ $this->var = "this is var"; } } class con2 extends construct{ public function __construct(){ $

S5中新增的Array方法详细说明

ES5中新增的Array方法详细说明 by zhangxinxu from http://www.zhangxinxu.com 本文地址:http://www.zhangxinxu.com/wordpress/?p=3220 一.前言-索引 ES5中新增的不少东西,了解之对我们写JavaScript会有不少帮助,比如数组这块,我们可能就不需要去有板有眼地for循环了. ES5中新增了写数组方法,如下: forEach (js v1.6) map (js v1.6) filter (js v1.6

node.js中的url.parse方法使用说明

node.js中的url.parse方法使用说明 *方法说明:* 讲一个URL字符串转换成对象并返回 代码如下: url.parse(urlStr, [parseQueryString], [slashesDenoteHost]) 接收参数: urlStr                                       url字符串 parseQueryString                   为true时将使用查询模块分析查询字符串,默认为false slashesDeno