NGINX,从 http header 中提取 url 路径

NGINX, Extracting url path from http header

所以我将我的 Nginx 访问日志发送到 Datadog(一种 APM 解决方案)。

我的日志格式是这样的

  log_format json_custom 
    '{'
      '"http.version":"$request",'
      '"http.status_code":$status,'
      '"http.method":"$request_method",'
      '"http.referer":"$http_referer",'
      '"http.useragent":"$http_user_agent",'
      '"time_local":"$time_local",'
      '"remote_addr":"$remote_addr",'
      '"remote_user":"$remote_user",'
      '"body_bytes_sent":"$body_bytes_sent",'
      '"request_time":$request_time,'
      '"response_content_type":"$sent_http_content_type",'
      '"X-Forwarded-For":"$proxy_add_x_forwarded_for",'
      '"custom_key":"custom_value"'
    '}';

我可以从 referrer 字段中提取 url,它看起来像这样

http://example.com/foo/bar 

虽然我只想要/foo/bar。这是我必须在 log_format 中修改的内容吗?

我从 datadog 文档中看到了一个示例,他们可以在其中提取 url 路径属性,但没有示例配置。

Datadog 可以通过其管道过滤功能处理日志

https://docs.datadoghq.com/logs/processing/pipelines/

如果您已经有一个包含 url 的属性,一个真正简单的方法是对这些日志使用 processing pipelines and add a processor of the "url parser" 类型。您只需插入属性包含 url 和一个属性路径,您希望包含它的所有输出(通常是 http.url_details),然后所有新日志都将应用额外的 url 解析。

如果您的日志应用了 "source:nginx"(在日志传送器中配置),那么您将已经拥有 Datadog 用于构建标准 Nginx 的开箱即用的 Nginx 处理管道语法日志。您可以克隆它,然后在其中添加新的 url 解析器。或者,如果您的语法类似于标准语法,您可以只修改它们的默认建议解析器(在克隆的管道中)。无论如何,值得查看默认管道以获取 url 解析之外的其他有价值的事情的灵感。