dpdk中log的使用方法
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的文件指针。
6,
dpdk中log的使用方法的更多相关文章
- Android开发过程中在sh,py,mk文件中添加log信息的方法
Android开发过程中在sh,py,mk文件中添加log信息的方法 在sh文件中: echo "this is a log info" + $info 在py文件中: print ...
- 译文:ovs+dpdk中的“vHost User NUMA感知”特性
本文描述了"vHost User NUMA感知"的概念,该特性的测试表现,以及该特性为ovs+dpdk带来的性能提升.本文的目标受众是那些希望了解ovs+dpdk底层细节的人,如果 ...
- JavaScript中Math对象的方法介绍
1.比较最值方法 比较最值有两种方法,max() 和 min() 方法. 1.1 max() 方法,比较一组数值中的最大值,返回最大值. var maxnum = Math.max(12,6,43,5 ...
- 在android开发中使用multdex的方法-IT蓝豹为你整理
Android系统在安装应用时,往往需要优化Dex,而由于处理工具DexOpt对id数目的限制,导致其处理的数目不能超过65536个,因此在Android开发中,需要使用到MultiDex来解决这个问 ...
- S5中新增的Array方法详细说明
ES5中新增的Array方法详细说明 by zhangxinxu from http://www.zhangxinxu.com 本文地址:http://www.zhangxinxu.com/wor ...
- 详解Webwork中Action 调用的方法
详解Webwork中Action 调用的方法 从三方面介绍webwork action调用相关知识: 1.Webwork 获取和包装 web 参数 2.这部分框架类关系 3.DefaultAction ...
- iOS5中UIViewController的新方法
iOS5中UIViewController的新方法 前言 在苹果的 WWDC2011 大会视频的<Session 101 - What's New in Cocoa> 和<Sessi ...
- 【转】Android中JNI的使用方法
Android中JNI的使用方法 首先看一下Android平台的框架图:(网上盗用) 可以看到Android上层的Application和ApplicationFramework都是使用Java编写, ...
- Android开发华为手机无法看log日志解决方法
Android开发华为手机无法看log日志解决方法 上班的时候,由于开发工具由Eclipse改成Android Studio后,原本的华为手机突然无法查看崩溃日志了,大家都知道,若是无法查看日志要它毛 ...
随机推荐
- Mac下docker搭建lnmp环境 + redis + elasticsearch
之前在windows下一直使用vagrant做开发, 团队里面也是各种开发环境,几个人也没有统一环境,各种上线都是人肉,偶尔还会有因为开发.测试.生产环境由于软件版本或者配置不一致产生的问题, 今年准 ...
- 没有80端口的备案域名,如何做微信公众平台的开发?本文介绍可以通过任何域名来做开发,www.baidu.com和www.163.com和www.so.com这样的域名都可以
1.首先做过微信开发的朋友都知道,微信后台需要绑定80端口的备案域名,如果此时手上没有80端口的备案域名就不能进行开发了吗?当然不是 首先在这些地方绑定一个备案域名,国内公司的网址基本上是有备案的如w ...
- 免费数据集下载网站【dataset】
https://github.com/awesomedata/awesome-public-datasets
- 在同一服务器使用git分支建立线上 和 测试 项目
分支分配文件夹后 sourcetree 创建分支与合并 https://blog.csdn.net/qq_34975710/article/details/74469068 线上分支master 测试 ...
- (转)SQL server 2005查询数据库表的数量和表的数据量
本文转载自:http://hi.baidu.com/ajyajyajy/item/4e2a7f4dc83393d2c1a592c1 use DBNAMEgoselect * from sysobjec ...
- date.js
/** * 此JS文件是格式化JS中日期时间的工具类,其中包含了传入日期对象Date,格式化成想要的格式,<br> * 或者传入字符串格式的时间个,次字符串日期对应的格式可以转换为相应的日 ...
- 【转】jMeter入门实例
人们对从认识事物都有一个具体到抽象的过程,学习Jmeter也不例外,通过一个实例来进行学习,一方面可以让初学者有所见即所得的信心,另一方面,其实也是在初学者心中留下了对这事物的一个朦胧的印象,这在以后 ...
- docker 远程rest api 访问配置
Docker RestApi 的配置及使用 Centos Docker1.12 远程Rest api访问的配置方法 http restapiv1.24 docker sdk for python
- 安装FFmpeg3.0.9
//静态版的 FFmpeg Static Builds release: 3.3.3 https://www.johnvansickle.com/ffmpeg/ ffmpeg-release-64 ...
- poj 3790 Recursively Palindromic Partitions
/*摘抄自博客:Recursively Palindromic Partitions Time Limit: 1000MS Memory Limit: 65536K Total Submissions ...