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

Nginx map 实现时间格式转换

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

map

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

标签:
  • 热门焦点
  • 7月安卓手机性能榜:红魔8S Pro再夺榜首

    7月份的手机市场风平浪静,除了红魔和努比亚带来了两款搭载骁龙8Gen2领先版处理器的新机之外,别的也想不到有什么新品了,这也正常,通常6月7月都是手机厂商修整的时间,进入8月份之
  • 十个可以手动编写的 JavaScript 数组 API

    JavaScript 中有很多API,使用得当,会很方便,省力不少。 你知道它的原理吗? 今天这篇文章,我们将对它们进行一次小总结。现在开始吧。1.forEach()forEach()用于遍历数组接收一参
  • 一文搞定Java NIO,以及各种奇葩流

    大家好,我是哪吒。很多朋友问我,如何才能学好IO流,对各种流的概念,云里雾里的,不求甚解。用到的时候,现百度,功能虽然实现了,但是为什么用这个?不知道。更别说效率问题了~下次再遇到,
  • 大厂卷向扁平化

    来源:新熵作者丨南枝 编辑丨月见大厂职级不香了。俗话说,兵无常势,水无常形,互联网企业调整职级体系并不稀奇。7月13日,淘宝天猫集团启动了近年来最大的人力制度改革,目前已形成一
  • 华为和江淮汽车合作开发百万元问界MPV?双方回应来了

    8月1日消息,郭明錤今天在社交平台发文称,华为正在和江淮汽车合作,开发售价在100万元的问界MPV,预计在2024年第2季度量产,销量目标为上市首年交付5万辆。
  • OPPO K11评测:旗舰级IMX890加持 2000元档最强影像手机

    【Techweb评测】中端机型用户群体巨大,占了中国目前手机市场的大头,一直以来都是各手机品牌的“必争之地”,其中OPPO K系列机型一直以来都以高品质、
  • 联想小新Pad Pro 12.6将要推出,搭载高通骁龙 870 处理器

    联想小新Pad Pro 12.6将于秋季新品会上推出,官方按照惯例直接在发布会前给出了机型的所有参数。联想小新 Pad Pro 12.6 将搭载高通骁龙 870 处理器,重量为 5
  • onebot M24巧系列一体机采用轻薄机身设计,现已在各平台开售

    onebot M24 巧系列一体机目前已在线上线下各平台同步开售。onebot M24 巧系列采用一体化轻薄机身设计,最薄处为 10.15mm,拥有宝石红、午夜蓝、石墨绿、雅致
  • 电博会与软博会实现"线下+云端"的双线融合

    在本次“电博会”与“软博会”双展会利好条件的加持下,既可以发挥展会拉动人流、信息流、资金流实现快速交互流动的作用,继而推动区域经济良性发展;又可以聚
Top