zoukankan      html  css  js  c++  java
  • 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调试信息分成两种
    一种是DPDK的log输出,RTE_PMD_DEBUG_TRACE 类似于这种
    通过修改build目录下的.config文件,以获得支持
    另外一种就是支持编译的时候带debug信息
    这种其实很简单使用find+sed就可以搞定了
    find . -name Makefile |xargs sed -i "s/-O3/-O0 -g/g"
    搞定。
    再执行make T=xxx config就OK了
    重新编译就OK了。
  • 相关阅读:
    383. Ransom Note
    598. Range Addition II
    453. Minimum Moves to Equal Array Elements
    492. Construct the Rectangle
    171. Excel Sheet Column Number
    697. Degree of an Array
    665. Nondecreasing Array
    视频网站使用H265编码能提高视频清晰度吗?
    现阶段的语音视频通话SDK需要解决哪些问题?
    企业远程高清会议平台视频会议系统在手机端使用的必备要求有哪些?
  • 原文地址:https://www.cnblogs.com/kb342/p/7818905.html
Copyright © 2011-2022 走看看