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

Nginx map 实现时间格式转换

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

map

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

我们可以看到:JPZ28资讯网——每日最新资讯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 变量的值

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

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

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

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

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

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

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

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

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

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

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

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

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

标签:
  • 热门焦点
  • 一加Ace2 Pro真机揭晓 钛空灰配色质感拉满

    终于,在经过了几波预热之后,一加Ace2 Pro的外观真机图在网上出现了。还是博主数码闲聊站曝光的,这次的外观设计还是延续了一加11的方案,只是细节上有了调整,例如新加入了钛空灰
  • 直屏旗舰来了 iQOO 12和K70 Pro同台竞技

    旗舰机基本上使用的都是双曲面屏幕,这就让很多喜欢直屏的爱好者在苦等一款直屏旗舰,这次,你们等到了。据博主数码闲聊站带来的最新爆料称,Redmi下代旗舰K70 Pro和iQOO 12两款手
  • 2023年Q2用户偏好榜:12+256G版本成新主流

    3月份的性能榜、性价比榜和好评榜之后,就要轮到2023年的第二季度偏好榜了,上半年的新机潮已经过去,最明显的肯定就是大内存和存储的机型了,另外部分中端机也取消了屏幕塑料支架
  • JVM优化:实战OutOfMemoryError异常

    一、Java堆溢出堆内存中主要存放对象、数组等,只要不断地创建这些对象,并且保证 GC Roots 到对象之间有可达路径来避免垃 圾收集回收机制清除这些对象,当这些对象所占空间超过
  • 重估百度丨“晚熟”的百度云,能等到春天吗?

    &copy;自象限原创作者|程心排版|王喻可2016年7月13日,百度云计算战略发布会在北京举行,宣告着百度智能云的正式启程。彼时的会场座无虚席,甚至排队排到了门外,在场的所有人几乎都
  • 10天营收超1亿美元,《星铁》比《原神》差在哪?

    来源:伯虎财经作者:陈平安即便你没玩过《原神》,你一定听说过的它的大名。恨它的人把《原神》开服那天称作是中国游戏史上最黑暗的一天,有粉丝因为索尼在PS平台上线《原神》,怒而
  • Counterpoint :OPPO双旗舰战略全面落地 高端产品销量增长22%

    2023年6月30日,全球行业分析机构Counterpoint Research发布的《中国智能手机高端市场白皮书》显示,中国智能手机品牌正在寻求高质量发展,中国高端智能
  • 联想YOGA 16s 2022笔记本将要推出,屏幕支持触控功能

    联想此前宣布,将于11月2日19:30召开联想秋季轻薄新品发布会,推出联想 YOGA 16s 2022 笔记本等新品。官方称,YOGA 16s 2022 笔记本将搭载 16 英寸屏幕,并且是一
  • 微软发布Windows 11新版 引入全新任务栏状态

    近日,微软发布了Windows 11新版,而Build 22563更新主要引入了几周前曝光的平板模式任务栏等,系统更流畅了。更新中,Windows 11加入了专门针对平板优化的任务栏
Top