当前位置:首页 > 科技  > 软件

Nginx map 实现时间格式转换

来源: 责编: 时间:2023-09-18 21:42:26 492观看
导读哈喽大家好,我是咸鱼最近我们需要把 Nginx 的日志接入到自研的日志采集平台上,但是这个平台只支持 JSON 格式,所以需要把 Nginx 日志格式改成 JSON 格式例如下面这样的效果刚开始在主配置文件 nginx.conf 中定义了一个名

哈喽大家好,我是咸鱼RRe28资讯网——每日最新资讯28at.com

RRe28资讯网——每日最新资讯28at.com

最近我们需要把 Nginx 的日志接入到自研的日志采集平台上,但是这个平台只支持 JSON 格式,所以需要把 Nginx 日志格式改成 JSON 格式RRe28资讯网——每日最新资讯28at.com

RRe28资讯网——每日最新资讯28at.com

例如下面这样的效果RRe28资讯网——每日最新资讯28at.com

RRe28资讯网——每日最新资讯28at.com

RRe28资讯网——每日最新资讯28at.com

刚开始在主配置文件 nginx.conf 中定义了一个名叫 json 的日志格式字段RRe28资讯网——每日最新资讯28at.com

RRe28资讯网——每日最新资讯28at.com

RRe28资讯网——每日最新资讯28at.com

验证的时候其他内容没啥问题,但是时间是2023-09-12T13:54:22+08:00 这样子的,不太符合预期RRe28资讯网——每日最新资讯28at.com

RRe28资讯网——每日最新资讯28at.com

RRe28资讯网——每日最新资讯28at.com

咸鱼想着把 $time_iso8601 变量中的年月日时分秒分别提取出来然后用变量去接受它,如下所示:RRe28资讯网——每日最新资讯28at.com

RRe28资讯网——每日最新资讯28at.com

我自定义了一个时间格式 $year-$month-$day $hour:$minutes:$seconds:000,然后接着用了一个 if 语句用于检查请求的时间是否匹配 ISO8601 时间格式(例如:2023-09-12T13:54:22+08:00)RRe28资讯网——每日最新资讯28at.com

RRe28资讯网——每日最新资讯28at.com

如果匹配,它将执行其中的代码块。在代码块中,使用正则表达式提取时间的年、月、日、小时、分钟和秒,并将它们赋值给变量 $year、$month、$day、$hour、$minutes 和 $secondsRRe28资讯网——每日最新资讯28at.com

RRe28资讯网——每日最新资讯28at.com

RRe28资讯网——每日最新资讯28at.com

但是 nginx -t 检测的时候我发现 if 语句不能够放在 http 块内,否则会报错RRe28资讯网——每日最新资讯28at.com

RRe28资讯网——每日最新资讯28at.com

在 Nginx 中,if 语句主要用于在 server 或 location 块内设置条件,以便根据请求的属性来执行不同的配置。if 语句通常应该包含在 server 或 location 块内,而不是直接放在 http 块中RRe28资讯网——每日最新资讯28at.com

RRe28资讯网——每日最新资讯28at.com

如果将 if 语句放在一个一个 server 块中,这不得累死我(有很多个 server 块),而且后期维护也不方便RRe28资讯网——每日最新资讯28at.com

RRe28资讯网——每日最新资讯28at.com

所以如何将自定义变量在全局配置中生效则成为了一个问题RRe28资讯网——每日最新资讯28at.com

RRe28资讯网——每日最新资讯28at.com

RRe28资讯网——每日最新资讯28at.com

map

RRe28资讯网——每日最新资讯28at.com

map 指令是由 ngx_http_map_module 模块提供的,是 Nginx 配置文件中的一种用于创建变量映射的指令RRe28资讯网——每日最新资讯28at.com

RRe28资讯网——每日最新资讯28at.com

模块链接:https://nginx.org/en/docs/http/ngx_http_map_module.htmlRRe28资讯网——每日最新资讯28at.com

RRe28资讯网——每日最新资讯28at.com

它允许我们将一个或多个输入值映射到一个输出值,类似于字典或哈希表的概念。map 指令通常用于根据特定条件为请求设置自定义变量,或者执行基于请求属性的条件控制RRe28资讯网——每日最新资讯28at.com

RRe28资讯网——每日最新资讯28at.com

比较常见的 map 用法是通过 map 来实现允许多个域名跨域访问的问题RRe28资讯网——每日最新资讯28at.com

RRe28资讯网——每日最新资讯28at.com

语法如下:RRe28资讯网——每日最新资讯28at.com

RRe28资讯网——每日最新资讯28at.com

RRe28资讯网——每日最新资讯28at.com

其中:RRe28资讯网——每日最新资讯28at.com

  • $variable 输入变量,通常是 nginx 的内置变量。
  • $new_variable 输出变量,它将根据输入值的映射设置为特定的结果。
  • value1, value2, ... 输入值,可以列出多个值。
  • result1, result2, ... 与相应输入值相关联的输出结果。
  • default 一个可选项,表示如果没有匹配的输入值,将使用默认结果

RRe28资讯网——每日最新资讯28at.com

需要注意的是,map 只能放在 http 块中RRe28资讯网——每日最新资讯28at.com

RRe28资讯网——每日最新资讯28at.com

有了 map,我们就可以轻易的把 $time_iso8601 变量中的 ISO 8601 格式的时间戳转换为指定的时间格式,然后存储到自定义变量 $log_time 中RRe28资讯网——每日最新资讯28at.com

RRe28资讯网——每日最新资讯28at.com

RRe28资讯网——每日最新资讯28at.com

我们可以看到:RRe28资讯网——每日最新资讯28at.com

  • 输入变量为 $time_iso8601,输出变量为 $log_time;
  • default "":如果没有匹配任何条件,将使用空字符串作为 $log_time 的值
  • "~^(?<year>/d{4})-(?<month>/d{2})-(?<day>/d{2})T(?<hour>/d{2}):(?<minutes>/d{2}):(?<seconds>/d{2})":这是一个正则表达式条件,它用于匹配 ISO 8601 格式的时间戳。该正则表达式包含了多个捕获组(使用 ?<name> 语法),用于从时间戳中提取年、月、日、小时、分钟和秒的值
  • "${year}-${month}-${day} ${hour}:${minutes}:${seconds}":这是与正则表达式条件匹配时设置的输出值。当正则表达式条件匹配时,它会将捕获组中提取的年、月、日、小时、分钟和秒的值组合成一个自定义的时间格式,然后将该值设置为 $log_time 变量的值

RRe28资讯网——每日最新资讯28at.com

例如,如果 $time_iso8601 的值是 "2023-09-09T14:30:00",则 $log_time 将被设置为 "2023-09-09 14:30:00"RRe28资讯网——每日最新资讯28at.com

RRe28资讯网——每日最新资讯28at.com

然后我们再把 $log_time 放进我们自定义的日志格式里面,完整配置如下RRe28资讯网——每日最新资讯28at.com

RRe28资讯网——每日最新资讯28at.com

RRe28资讯网——每日最新资讯28at.com

最后我们验证一下RRe28资讯网——每日最新资讯28at.com

RRe28资讯网——每日最新资讯28at.com

RRe28资讯网——每日最新资讯28at.com

本文链接:http://www.28at.com/showinfo-26-10492-0.htmlNginx map 实现时间格式转换

声明:本网页内容旨在传播知识,若有侵权等问题请及时与本网联系,我们将在第一时间删除处理。邮件:2376512515@qq.com

上一篇: 反驳来了!放弃TypeScript?说明你无知!

下一篇: 19个JavaScript数组常用方法总结! 赶快收藏吧!

标签:
  • 热门焦点
  • 5月iOS设备性能榜:M1 M2依旧是榜单前五

    和上个月一样,没有新品发布的iOS设备性能榜的上榜设备并没有什么更替,仅仅只有跑分变化而产生的排名变动,刚刚开始的苹果WWDC2023,推出的产品也依旧是新款Mac Pro、新款Mac Stu
  • K6:面向开发人员的现代负载测试工具

    K6 是一个开源负载测试工具,可以轻松编写、运行和分析性能测试。它建立在 Go 和 JavaScript 之上,它被设计为功能强大、可扩展且易于使用。k6 可用于测试各种应用程序,包括 Web
  • 学习JavaScript的10个理由...

    作者 | Simplilearn编译 | 王瑞平当你决心学习一门语言的时候,很难选择到底应该学习哪一门,常用的语言有Python、Java、JavaScript、C/CPP、PHP、Swift、C#、Ruby、Objective-
  • 虚拟键盘 API 的妙用

    你是否在遇到过这样的问题:移动设备上有一个固定元素,当激活虚拟键盘时,该元素被隐藏在了键盘下方?多年来,这一直是 Web 上的默认行为,在本文中,我们将探讨这个问题、为什么会发生
  • 雅柏威士忌多款单品价格大跌,泥煤顶流也不香了?

    来源 | 烈酒商业观察编 | 肖海林今年以来,威士忌市场开始出现了降温迹象,越来越多不断暴涨的网红威士忌也开始悄然回归市场理性。近日,LVMH集团旗下苏格兰威士忌品牌雅柏(Ardbeg
  • 年轻人的“职场羞耻感”,无处不在

    作者:冯晓亭 陶 淘 李 欣 张 琳 马舒叶来源:燃次元&ldquo;人在职场,应该选择什么样的着装?&rdquo;近日,在网络上,一个与着装相关的帖子引发关注,在该帖子里,一位在高级写字楼亚洲金
  • 小米汽车电池信息疑似曝光:容量101kWh,支持800V高压快充

    7月14日消息,今日一名博主在社交媒体发布了一张疑似小米汽车电池信息的照片,显示该电池包正是宁德时代麒麟电池,容量为101kWh,电压为726.7V,可以预测小
  • 三星推出Galaxy Tab S9系列平板电脑以及Galaxy Watch6系列智能手表

    2023年7月26日,三星电子正式发布了Galaxy Z Flip5与Galaxy Z Fold5。除此之外,Galaxy Tab S9系列平板电脑以及三星Galaxy Watch6系列智能手表也同期
  • 超级标准版旗舰!iQOO 11S全球首发iQOO超算独显芯片

    上半年已接近尾声,截至目前各大品牌旗下的顶级旗舰都已悉数亮相,而下半年即将推出的顶级旗舰已经成为了数码圈爆料的主流,其中就包括全新的iQOO 11S系
Top