Nginx map 实现时间格式转换

news2024/11/18 13:36:29

哈喽大家好,我是咸鱼

最近我们需要把 Nginx 的日志接入到自研的日志采集平台上,但是这个平台只支持 JSON 格式,所以需要把 Nginx 日志格式改成 JSON 格式

例如下面这样的效果
在这里插入图片描述
刚开始在主配置文件 nginx.conf 中定义了一个名叫 json 的日志格式字段
在这里插入图片描述
验证的时候其他内容没啥问题,但是时间是2023-09-12T13:54:22+08:00 这样子的,不太符合预期
在这里插入图片描述
咸鱼想着把 $time_iso8601 变量中的年月日时分秒分别提取出来然后用变量去接受它,如下所示:

我自定义了一个时间格式 $year-$month-$day $hour:$minutes:$seconds:000,然后接着用了一个 if 语句用于检查请求的时间是否匹配 ISO8601 时间格式(例如:2023-09-12T13:54:22+08:00

如果匹配,它将执行其中的代码块。在代码块中,使用正则表达式提取时间的年、月、日、小时、分钟和秒,并将它们赋值给变量 $year$month$day$hour$minutes$seconds

    log_format json '{  "SYS_NO":"my_nginx",
                        "OS_TIME":"$year-$month-$day $hour:$minutes:$seconds",
                        "LOG_TYPE":"",
                        "RESULT":"$status",
                        "SPENT_TIME":"$request_time",
                        "CLIENT_IP":"$remote_addr",
                        "SERVER_IP":"$server_addr",
                        "O_CHANNEL":"$http_user_agent",
                        "UID":"$http_host",
                        "VALUE1":$body_bytes_sent,
                        "INFO1":"$http_referer",
					}';
	  if ($time_iso8601 ~ "^(\d{4})-(\d{2})-(\d{2})T(\d{2}):(\d{2}):(\d{2})") {
                        set $year $1;
                        set $month $2;
                        set $day $3;
                        set $hour $4;
                        set $minutes $5;
                        set $seconds $6;
                        }

但是 nginx -t 检测的时候我发现 if 语句不能够放在 http 块内,否则会报错

在 Nginx 中,if 语句主要用于在 serverlocation 块内设置条件,以便根据请求的属性来执行不同的配置。if 语句通常应该包含在 serverlocation 块内,而不是直接放在 http 块中

如果将 if 语句放在一个一个 server 块中,这不得累死我(有很多个 server 块),而且后期维护也不方便

所以如何将自定义变量在全局配置中生效则成为了一个问题

map

map 指令是由 ngx_http_map_module 模块提供的,是 Nginx 配置文件中的一种用于创建变量映射的指令

模块链接:Module ngx_http_map_module (nginx.org)

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

比较常见的 map 用法是通过 map 来实现允许多个域名跨域访问的问题

语法如下:

map $variable $new_variable {
    value1   result1;
    value2   result2;
    ...
    default  default_result;
}

其中:

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

需要注意的是,map 只能放在 http 块中

有了 map,我们就可以轻易的把 $time_iso8601 变量中的 ISO 8601 格式的时间戳转换为指定的时间格式,然后存储到自定义变量 $log_time

# nginx.conf
	map $time_iso8601 $log_time {
        default "";
        "~^(?<year>\d{4})-(?<month>\d{2})-(?<day>\d{2})T(?<hour>\d{2}):(?<minutes>\d{2}):(?<seconds>\d{2})" "${year}-${month}-${day} ${hour}:${minutes}:${seconds}";
    }

我们可以看到:

  • 输入变量为 $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 变量的值

例如,如果 $time_iso8601 的值是 “2023-09-09T14:30:00”,则 $log_time 将被设置为 “2023-09-09 14:30:00”

然后我们再把 $log_time 放进我们自定义的日志格式里面,完整配置如下

    log_format json '{  "SYS_NO":"my_nginx",
                        "OS_TIME":"$log_time",
                        "LOG_TYPE":"",
                        "RESULT":"$status",
                        "SPENT_TIME":"$request_time",
                        "CLIENT_IP":"$remote_addr",
                        "SERVER_IP":"$server_addr",
                        "O_CHANNEL":"$http_user_agent",
                        "UID":"$http_host",
                        "VALUE1":$body_bytes_sent,
                        "INFO1":"$http_referer",
					}';
					
	map $time_iso8601 $log_time {
    	default "";
        "~^(?<year>\d{4})-(?<month>\d{2})-(?<day>\d{2})T(?<hour>\d{2}):(?<minutes>\d{2}):(?<seconds>\d{2})" "${year}-${month}-${day} ${hour}:${minutes}:${seconds}";
    }

最后我们验证一下
在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1011739.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

好用的电容笔有哪些推荐?apple pencil的平替笔推荐

很小伙伴会觉得越贵的电容笔就会越好用&#xff0c;但其实不是这样子的。我们要综合产品的性能和价格来购买。在电容笔领域中&#xff0c;性价比是很重要购买参数&#xff0c;今天我给大家推荐几款性价比高的平替电容笔&#xff0c;希望可以给你带来有益的参考。 1.西圣电容笔…

雅思学习总结

#【中秋征文】程序人生&#xff0c;中秋共享# 雅思小科普&#xff1a; 1. 什么是雅思考试&#xff1f; 雅思考试是由&#xff1a;英国文化协会、澳洲 IDP 教育集团、剑桥 大学考试委员会举办的英语水平测试。全称翻译成中文是&#xff1a; 国际英语语言测试系统。 2…

一招识别吞没和Marubozu,只需记住FPmarkets澳福这两点

在后台有很多投资者都在问FPmarkets澳福&#xff0c;吞没和Marubozu这两种形态的区别&#xff0c;今天这篇文章通过相似和不同来了解吞没和Marubozu这两种形态的区别。 共同点&#xff1a; 1. Marubozu和吞没都是烛台分析中的反转形态。 2.这两种模式&#xff0c;阴影都不需要特…

华为云云耀云服务器L实例评测-搭建基于hexo的个人博客

1、演示 访问地址&#xff1a;演示传送门开头先来一个效果图。 2、准备服务器 前面有介绍了一下华为云云耀云服务器L实例评测以及简单的配置用法&#xff0c;具体可以看上篇的博客。https://blog.csdn.net/yongqing_/article/details/132867889我这里用的是华为云云耀云服务器…

OpenAPI,连接新世界_三叠云

开放平台 路径 应用与导航 >> 开放平台 功能简介 随着企业数字化转型的不断深入&#xff0c;越来越多的公司需要与其他企业或应用程序进行集成&#xff0c;实现更高效和智能的业务流程。因此&#xff0c;三叠云提出了一种新的解决方案&#xff1a;开放平台。 三叠云…

OpenHarmony 系统能力 SystemCapability 使用指南

一、概述 1、系统能力与 API SysCap&#xff0c;全称 SystemCapability&#xff0c;即系统能力&#xff0c;指操作系统中每一个相对独立的特性&#xff0c;如蓝牙&#xff0c;WIFI&#xff0c;NFC&#xff0c;摄像头等&#xff0c;都是系统能力之一。每个系统能力对应多个 API&…

Python模板注入(SSTI)

概念 发生在使用模板引擎解析用户提供的输入时。模板注入漏洞可能导致攻击者能够执行恶意代码或访问未授权的数据。 模板引擎可以让&#xff08;网站&#xff09;程序实现界面与数据分离&#xff0c;业务代码与逻辑代码分离。即也拓宽了攻击面&#xff0c;注入到模板中的代码可…

flutter聊天界面-TextField输入框实现@功能等匹配正则表达式展示高亮功能

flutter聊天界面-TextField输入框实现功能等匹配正则表达式展示高亮功能 一、简要描述 描述&#xff1a; 最近有位朋友讨论的时候&#xff0c;提到了输入框的高亮展示。在flutter TextField中需要插入特殊样式的标签&#xff0c;比如&#xff1a;“请 张三 回答一下”&#x…

streamlit打包方式

Streamlit是一个开放的资源框架&#xff0c;用于将数据脚本转换为可共享的 Web 应用程序。它允许数据科学家和机器学习工程师构建直观的界面&#xff0c;而无需了解 Web 开发。在本教程中&#xff0c;我们将学习一些将 Streamlit 应用程序转换为双击可执行文件的方法&#xff0…

贪心(5)

绝对值不等式 |x-a||x-b|>|a-b| (中位数&#xff09; 仓库选址&#xff08;中位数就是最优解&#xff09; 在一条数轴上有 N 家商店&#xff0c;它们的坐标分别为 A1∼AN。 现在需要在数轴上建立一家货仓&#xff0c;每天清晨&#xff0c;从货仓到每家商店都要运送一车商…

山区自建房BCD浪涌保护器接线方案(自建房用电防雷)

家庭&#xff08;自建房&#xff09;电路防雷保护指南 家庭&#xff08;自建房&#xff09;电路防雷保护指南.png 已共享。 链接: https://pan.baidu.com/s/1xkwsIgizg4WvLJ8V3cd_ZQ?pwde9pv 提取码: e9pv 山区自建房BCD浪涌保护器接线方案。

小土堆pytorch学习笔记

想入门pytorch强化学习&#xff0c;就去找pytorch的课来看。B站上播放量最高的就是小土堆的课&#xff0c;整体跟下来感觉内容还是很详细的&#xff0c;但和我的预期不太一样&#xff0c;这个是DL的不是RL的&#xff0c;不过作为对于pytorch使用的初期了解也是很好的&#xff0…

【Linux网络编程】Socket-TCP实例

netstat -nltp 无法用read函数读取UDP套接字的数据&#xff0c;因为UDP是面向数据报&#xff0c;而TCP是面向数据流。 客户端不需要 bind&#xff0c;listen&#xff0c;accept&#xff0c;但是客户端需要connect&#xff0c;connect会自动做bind工作。 #include <sys/sock…

前端开发工作中可能会遇到的问题及解决方法

一、uni-app小程序中xxx代码依赖分析忽略二、uni-app弹窗列表滚动, 弹框下面的内容也跟随滚动三、uni-app小程序正常自定义组件不生效 四、uni-app popup 弹出层底部空隙问题 五、uni-app小程序自定义导航栏后iOS页面可上下滑动问题解决方案 六. uni-app中的分享二维码以及…

5个关键步骤助您顺利开发跑腿小程序

作为跑腿服务的热门方式&#xff0c;跑腿小程序的开发成为了许多创业者和企业的首选。然而&#xff0c;要成功开发一款出色的跑腿小程序&#xff0c;并不是一件轻松的事情。本文将为您揭示5个关键步骤&#xff0c;助您在开发跑腿小程序的道路上顺利前行。 步骤一&#xff1a;需…

java项目之固定资产管理系统(源码+文档)

风定落花生&#xff0c;歌声逐流水&#xff0c;大家好我是风歌&#xff0c;混迹在java圈的辛苦码农。今天要和大家聊的是一款基于ssm的固定资产管理系统。源码和部署相关看文章末尾&#xff01; 开发环境&#xff1a; 后端&#xff1a; 开发语言&#xff1a;Java 框架&…

Games101作业7 蒙特卡洛路径追踪

文章目录 基本思想基本代码问题1:我们采取每次弹射都弹射N跟光线&#xff0c;此时会发生指数爆炸问题2:这是一个递归的过程&#xff0c;递归的终止条件我们还没规定优化&#xff0c;对光源直接进行采样 本文不涉及:蒙特卡洛积分的原理以及渲染方程是如何推到出来&#xff0c;而…

长胜证券:全球年内最大IPO“首秀”,标普香港创业板指数即将归零?

当地时间周四&#xff0c;美股三大股指团体上涨。到收盘&#xff0c;道指涨0.96%&#xff0c;报34907.11点&#xff1b;标普500指数涨0.84%&#xff0c;报4505.10点&#xff1b;纳指涨0.81%&#xff0c;报13926.05点。 美国8月PPI数据、零售出售月率双双超预期。美国8月PPI同比…

【Feign】feignclient发送formdata请求

文章目录 前言实操示例代码注意 常见问题formdata类型的post请求&#xff0c;为什么参数会被拼到url上&#xff1f;分析总结 RequestPart只可以接收文件吗&#xff1f;分析一些示例注意 前言 小伙伴们在使用feign进行远程调用时&#xff0c;会遇到formdata类型的post请求&…

5.docker可视化工具(Portainer)

本文操作&#xff0c;在 192.168.204.102 机器执行 安装最新版 portainer&#xff0c;请使用 portainer/portainer-ce 镜像。图片来源&#xff1a;https://hub.docker.com/r/portainer/portainer。   来这里可查看最新版本&#xff1a;https://github.com/portainer/p…