首页 > 其他分享 >apisix~kafka-logger插件

apisix~kafka-logger插件

时间:2024-09-10 10:24:30浏览次数:9  
标签:插件 3A% 22% agent version user 2C% logger apisix

作用

将http请求与响应的内容发到kafka的topic,以json的形式发送存储

配置相关

  • log_format为自定义配置字段,添加后,默认的请求响应消息将被覆盖
{
  "_meta": {
    "disable": false
  },
  "batch_max_size": 1,
  "brokers": [
    {
      "host": "192.168.10.132",
      "port": 9091
    },
    {
      "host": "192.168.10.133",
      "port": 9092
    },
    {
      "host": "192.168.10.134",
      "port": 9097
    }
  ],
  "disable": false,
  "include_req_body": false,
  "include_resp_body": false,
  "kafka_topic": "apisix-logger-test",
  "log_format": {
    "api": "$request_uri",
    "userId": "$http_sub",
    "userName": "$http_preferred_username",
    "now":"$time_iso8601",
  },
  "producer_type": "async",
  "required_acks": 1
}
  • $开头表示是系统变量
  • $http_开头的,表示是从请求头里获取
  • 如果获取字段的内容为空,则不会出现在消息体里
  • kafka里存储的消息为以下内容
{
  "now": "2024-09-10T02:01:22+00:00",
  "route_id": "528226539821597458",
  "api": "/pkulaw-chat-gpt-api-4/6.0.0.0/gpt/writer/ping",
}

上面配置,是直接在路由或者全局插件配置中,可以通过apisix-dashboard进行配置,使用log_format对记录的信息进行了设置,我们不建议自定义log_format,因为默认的就是最全的信息

不使用log_format,默认的消息体内容如下

[
  {
    "client_ip": "192.168.60.136",
    "upstream": "10.42.4.236:8080",
    "apisix_latency": 7.0000324249268,
    "start_time": 1716198064095,
    "latency": 16.000032424927,
    "request": {
      "uri": "/kpi/hello",
      "method": "GET",
      "size": 1757,
      "url": "http://test-apisix.pkulaw.com:9080/kpi/hello",
      "headers": {
        "accept": "text/html,application/xhtml+xml,application/xml;q\u003d0.9,image/avif,image/webp,*/*;q\u003d0.8",
        "connection": "close",
        "user-agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:125.0) Gecko/20100101 Firefox/125.0",
        "cookie": "Hm_lvt_8266968662c086f34b2a3e2ae9014bf8\u003d1715752532; Hm_up_8266968662c086f34b2a3e2ae9014bf8\u003d%7B%22ysx_yhqx_20220602%22%3A%7B%22value%22%3A%220%22%2C%22scope%22%3A1%7D%2C%22ysx_hy_20220527%22%3A%7B%22value%22%3A%2206%22%2C%22scope%22%3A1%7D%2C%22uid_%22%3A%7B%22value%22%3A%22fd9959db-ab28-eb11-b390-00155d3c0709%22%2C%22scope%22%3A1%7D%2C%22ysx_yhjs_20220602%22%3A%7B%22value%22%3A%221%22%2C%22scope%22%3A1%7D%7D; cookieUUID\u003dcookieUUID_1715593171791; Hm_lpvt_8266968662c086f34b2a3e2ae9014bf8\u003d1715852645; CookieId\u003daa4be28db45fcd6c3edd84d304533838; SUB\u003d79781f2d-8b4f-483e-ac31-dd55ada12e21; preferred_username\u003dphone2021090709182413393; session_state\u003dde594c09-5681-47c2-ad76-6a7979ff38cd; sensorsdata2015jssdkcross\u003d%7B%22distinct_id%22%3A%22CPcsuEJK%22%2C%22first_id%22%3A%2218f938551ccfe-0b472eec538364-e505625-2073600-18f938551cde56%22%2C%22props%22%3A%7B%22%24latest_traffic_source_type%22%3A%22%E7%9B%B4%E6%8E%A5%E6%B5%81%E9%87%8F%22%2C%22%24latest_search_keyword%22%3A%22%E6%9C%AA%E5%8F%96%E5%88%B0%E5%80%BC_%E7%9B%B4%E6%8E%A5%E6%89%93%E5%BC%80%22%2C%22%24latest_referrer%22%3A%22%22%7D%2C%22%24device_id%22%3A%2218f938551ccfe-0b472eec538364-e505625-2073600-18f938551cde56%22%7D; sajssdk_2015_cross_new_user\u003d1",
        "sec-fetch-dest": "document",
        "upgrade-insecure-requests": "1",
        "accept-language": "zh-CN,en;q\u003d0.8,en-US;q\u003d0.7,zh;q\u003d0.5,zh-TW;q\u003d0.3,zh-HK;q\u003d0.2",
        "sec-fetch-mode": "navigate",
        "accept-encoding": "gzip, deflate, br",
        "sec-fetch-site": "none",
        "sec-fetch-user": "?1",
        "host": "test-apisix.pkulaw.com",
        "x-forwarded-for": "111.198.143.194"
      },
      "querystring": {}
    },
    "response": {
      "status": 200,
      "headers": {
        "server": "APISIX/3.8.0",
        "content-type": "application/json",
        "x-ratelimit-limit": "5",
        "transfer-encoding": "chunked",
        "connection": "close",
        "date": "Mon, 20 May 2024 09:41:04 GMT",
        "x-ratelimit-reset": "60",
        "x-ratelimit-remaining": "4"
      },
      "size": 2064
    },
    "route_id": "513923429800346372",
    "upstream_latency": 9,
    "service_id": "",
    "server": {
      "version": "3.8.0",
      "hostname": "apisix-78bcfb45c6-26746"
    }
  }
]

在log_format的同步添加扩展字段

  • 这需要修改kafka-logger的源码了
  • 获取user-agent中的操作系统,浏览器等信息,你可以添加下面的方法
local function parse_user_agent(user_agent)
    local os, browser, version

    -- 检测操作系统
    if user_agent:find("Windows") then
        os = "Windows"
    elseif user_agent:find("Macintosh") then
        os = "Mac OS"
    elseif user_agent:find("Linux") then
        os = "Linux"
    elseif user_agent:find("Android") then
        os = "Android"
    elseif user_agent:find("iPhone") then
        os = "iOS"
    end

    -- 检测浏览器
    if user_agent:find("Chrome") then
        browser = "Chrome"
        version = user_agent:match("Chrome%/(%d+%.%d+)")
    elseif user_agent:find("Firefox") then
        browser = "Firefox"
        version = user_agent:match("Firefox%/(%d+%.%d+)")
    elseif user_agent:find("Safari") then
        browser = "Safari"
        version = user_agent:match("Version%/(%d+%.%d+)")
    elseif user_agent:find("MSIE") then
        browser = "Internet Explorer"
        version = user_agent:match("MSIE (%d+%.%d+)")
    elseif user_agent:find("Trident") then
        browser = "Internet Explorer"
        version = user_agent:match("rv:(%d+%.%d+)")
    end

    return {
        os = os or "Unknown",
        browser = browser or "Unknown",
        version = version or "Unknown"
    }
end

在kafka-logger的_M.log(conf, ctx)方法中,添加浏览器扩展字段

function _M.log(conf, ctx)
    local entry
    if conf.meta_format == "origin" then
        entry = log_util.get_req_original(ctx, conf)
    else
        entry = log_util.get_log_entry(plugin_name, conf, ctx)
    end
    -- 添加扩展字段开始
    local user_agent = ngx.var.http_user_agent
    local info = parse_user_agent(user_agent)
    entry.os = info.os
    entry.browser=info.browser
    entry.version=info.version
    -- 添加扩展字段结束
    if batch_processor_manager:add_entry(conf, entry) then
        return
    end
...

标签:插件,3A%,22%,agent,version,user,2C%,logger,apisix
From: https://www.cnblogs.com/lori/p/18405910

相关文章

  • 离线标注 - mastergo - 资源社区 - 插件广场 (设计稿打包离线页面)- marklion+figma 平
    离线标注-mastergo-资源社区-插件广场(设计稿打包离线页面)-marklion+figma平替同事用的标记狮marklion做的设计稿,离线包特别好,但是需要配合figma或者苹果的设计器。国内的话,可以用mastergo里面有个离线标注插件,功能一样。又找了个xd的下载,回头试试和mar......
  • xlam插件制作实验手册
    大家来和笔者一起做一个xlam插件吧。很简单,很详细。楔子excel支持自定义菜单栏,但是我在搜索如何制作菜单栏,以及如何制作addin文件的时候,即使是最好的例子,也只是点到为止,做了一个按钮就结束了。想要再进一步,竟然就没有合适的二手资料了。所以自然笔者就决定自己补充这样一篇文章......
  • 【Rust】Mdbook插件开发和分享——多图浏览和多语言代码
    mdbook-image-slider受DevExpress文档多图浏览的启发,我开发这个插件,在查看多个图片和图片的描述的时候非常方便项目地址:https://github.com/VinciYan/mdbook-image-slider.git特点鼠标置于图片查看区域时显示切换图片按钮鼠标点击图片可以缩放查看,移动端支持点击图片进行缩......
  • ROS2 - Moveit2 - 创建Moveit插件(MoveIt Plugins)
    创建MoveIt插件本节详细说明了如何在ROS中添加插件。两个必需元素是基类和插件类。插件类继承自基类并覆盖其虚拟函数。用于此目的的主要库是pluginlib。本教程包含三种不同类型的插件,即运动规划器、控制器管理器和约束采样器。运动规划器插件在本节中,我们将展示如何将新......
  • vue打印模版模块,使用vue-plugin-hiprint插件搭建过程
    文章目录概要安装插件引入全局样式引入字体图标库完整demo解析-保存模版解析-左侧的自定义组件解析-视图容器解析-打印文件地址概要项目中,我们可能需要实现打印的需求功能,而打印时,用户可以先去编辑打印模版,这样再其他模版,只需要提供数据,就可以使用模......
  • 【更新日志】AI运动识别插件又双叕发布更新了,v1.5.4版已正式发布。
    Ai运动识别插件可以为您的小程序赋于原生的人体检测、运动识别、姿态识别、运动计时计数AI能力,让您的小程序轻松实现AI健身、线上运动会、学生体测等场景,并拥有大量的用户案例,针对近期开发者的反馈,我们修复了相关问题,并对部分功能进行了优化增强,发布了v1.5.4版。本次版本的详细......
  • 超轻量级、支持插件的 .NET 网络通信框架
    前言给大家推荐一个轻量级的、支持插件的综合网络通信库:TouchSocket。TouchSocket的基础通信功能包括TCP、UDP、SSL、RPC和HTTP。其中,HTTP服务器支持WebSocket、静态网页、XML-RPC、WebAPI和JSON-RPC等扩展插件。此外,TouchSocket还支持自定义协议的TouchRPC,具备SSL......
  • Chrome下载视频的插件
      大家好,我是爱编程的喵喵。双985硕士毕业,现担任全栈工程师一职,热衷于将数据思维应用到工作与生活中。从事机器学习以及相关的前后端开发工作。曾在阿里云、科大讯飞、CCF等比赛获得多次Top名次。现为CSDN博客专家、人工智能领域优质创作者。喜欢通过博客创作的方式对所学......
  • crypto插件的用法
    文章目录1.概念介绍2.方法与功能2.1基本用法2.2加密算法3.示例代码4.内容总结我们在上一章回中介绍了"FlutterCacheManager组件"相关的内容,本章回中将介绍一个加密工具包.闲话休提,让我们一起TalkFlutter吧。1.概念介绍加密主要是为了保护一些重要数据,我......
  • 【Unity必备插件】NGUI:UI设计传奇工具
    ......