f-stack和dpdk中如何添加syslog的输出

在我们的长连接网关中使用了syslog作为日志收集的工具,又因为引入dpdk作为用户态协议栈,调用ff_init后,发现日志输出不到syslog了,经过研究dpdk的文档后,发现dpdk支持syslog的配置,祥见rte_eal_init函数的实现,我们只需要添加“--syslog=local6”参数就行,“local6”就是syslog的facility,它的取值参考syslog的定义,实际上当然我们还可以调用rte_eal_log_init去设置syslog输出。在f-stack中可以修改如下代码实现:
/lib/ff_config.c 文件

static int
dpdk_args_setup(struct ff_config *cfg)
{
    int n = 0, i;
    dpdk_argv[n++] = strdup("f-stack");
    char temp[DPDK_CONFIG_MAXLEN] = {0}, temp2[DPDK_CONFIG_MAXLEN] = {0};

    if (cfg->dpdk.no_huge) {
        dpdk_argv[n++] = strdup("--no-huge");
    }
    if (cfg->dpdk.proc_mask) {
        sprintf(temp, "-c%s", cfg->dpdk.proc_mask);
        dpdk_argv[n++] = strdup(temp);
    }
    if (cfg->dpdk.nb_channel) {
        sprintf(temp, "-n%d", cfg->dpdk.nb_channel);
        dpdk_argv[n++] = strdup(temp);
    }
    if (cfg->dpdk.memory) {
        sprintf(temp, "-m%d", cfg->dpdk.memory);
        dpdk_argv[n++] = strdup(temp);
    }
    if (cfg->dpdk.proc_type) {
        sprintf(temp, "--proc-type=%s", cfg->dpdk.proc_type);
        dpdk_argv[n++] = strdup(temp);
    }
    if (cfg->dpdk.base_virtaddr) {
        sprintf(temp, "--base-virtaddr=%s", cfg->dpdk.base_virtaddr);
        dpdk_argv[n++] = strdup(temp);
    }

    sprintf(temp, "--syslog=%s", "local6");
    dpdk_argv[n++] = strdup(temp);

    if (cfg->dpdk.nb_vdev) {
        for (i=0; i<cfg->dpdk.nb_vdev; i++) {
            sprintf(temp, "--vdev=virtio_user%d,path=%s",
                cfg->dpdk.vdev_cfgs[i].vdev_id,
                cfg->dpdk.vdev_cfgs[i].path);
            if (cfg->dpdk.vdev_cfgs[i].nb_queues) {
                sprintf(temp2, ",queues=%u",
                    cfg->dpdk.vdev_cfgs[i].nb_queues);
                strcat(temp, temp2);
            }
            if (cfg->dpdk.vdev_cfgs[i].nb_cq) {
                sprintf(temp2, ",cq=%u",
                    cfg->dpdk.vdev_cfgs[i].nb_cq);
                strcat(temp, temp2);
            }
            if (cfg->dpdk.vdev_cfgs[i].queue_size) {
                sprintf(temp2, ",queue_size=%u",
                    cfg->dpdk.vdev_cfgs[i].queue_size);
                strcat(temp, temp2);
            }
            if (cfg->dpdk.vdev_cfgs[i].mac) {
                sprintf(temp2, ",mac=%s",
                    cfg->dpdk.vdev_cfgs[i].mac);
                strcat(temp, temp2);
            }
            dpdk_argv[n++] = strdup(temp);
     ...... // 此处代码省略
}

以上仅是测试代码,实际工程不能如此草率。
参考文档:https://programming.vip/docs/dpdk-rte_log-log-module.html
https://dpdk.readthedocs.io/en/v16.04/testpmd_app_ug/run_app.html

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • 3. 环境抽象层 环境抽象层(EAL)为底层资源如硬件和存储空间的访问提供了接口。这些接口为上层应用程序和库隐藏了...
    半天妖阅读 4,694评论 0 10
  • 1. DPDK技术介绍 1) 简介 DPDK全称Intel Data Plane Development Kit,...
    Aubrey_de6c阅读 71,277评论 0 7
  • 上一篇文章中谈到DPDK是一个高性能的用户态驱动,改变了网卡驱动原先的中断为轮询的模式,那么它的性能到底有多强,用...
    少阁主_enfj阅读 8,567评论 3 8
  • 3. 环境抽象层 环境抽象层(Environment Abstraction Layer,下文简称EAL)是对操作...
    希尔哥哥s阅读 4,767评论 0 1
  • 久违的晴天,家长会。 家长大会开好到教室时,离放学已经没多少时间了。班主任说已经安排了三个家长分享经验。 放学铃声...
    飘雪儿5阅读 7,575评论 16 22