Nginx/Openresty日志时间显示到毫秒级的三种方法(不改源码)

  • 方法一 :set (只能在server节点内)
  • 方法二: set_by_lua (只能在server节点内)
  • 方法三: map (在http节点内)

在这里,我们生成三个自定义变量

#以下为内置变量
$time_iso8601  日期格式示例: 2022-09-08T18:16:01+08:00
$time_local    日期格式示例: 02/Aug/2022:11:11:32 +0800
$msec          日期格式示例: 1663839717.105 当前的Unix时间戳,单位为秒,小数为毫秒#生成自定义变量
$time_zh    示例值: 2022-10-08 22:00:18
$timestamp  示例值: 1663839717105
$time_zh_ms 示例值: 2022-10-08 22:00:18,888

方法一 :set (只能在server节点内)

建议创建独立 conf 文件,使用include方式,如:time-zh.conf 内容如下:

# 该 文件使用方法  在 nginx 配置 server 节点内:   include time-zh.conf;
#
# nginx 内置变量,解析为定义格式,仅支持到秒 (实现支持到毫秒)
#
# $time_iso8601  日期格式示例: 2022-09-08T18:16:01+08:00
# $time_local    日期格式示例: 02/Aug/2022:11:11:32 +0800
# $msec          日期格式示例: 1663839717.105 当前的Unix时间戳,单位为秒,小数为毫秒
# 自定义变量 - 默认值
#set $time_zh $time_iso8601;
#set $timestamp $msec;
#set $time_zh_ms $time_zh,000;# 格式化日期
if ($time_iso8601 ~ "^(\d{4})-(\d{2})-(\d{2})T(\d{2}):(\d{2}):(\d{2})(\+\d{2})") {set $year   $1;set $month  $2;set $day    $3;set $hour   $4;set $minute $5;set $second $6;# 时区,只到小时set $time_zone $7;# 自定义 yyyy-MM-dd hh:mi:ss 格式set $time_zh "$1-$2-$3 $4:$5:$6";
}
# 时间戳,单位毫秒  使用 $msec 去除中间的小数点实现
if ($msec ~ "^(\d+)\.(\d+)") {set $timestamp $1$2;# 自定义 yyyy-MM-dd hh:mi:ss,SSS 带毫秒格式set $time_zh_ms $time_zh,$2;
}

方法二: set_by_lua (只能在server节点内)

建议创建独立 conf 文件,使用include方式,如:time-zh-lua.conf 内容如下:

# 该 文件使用方法  在 nginx 配置 server 节点内:   include time-zh-lua.conf;
#
# nginx 内置变量,解析为定义格式,仅支持到秒 (实现支持到毫秒)
#
# 取 ngx_lua 模块提供的带缓存的时间接口
# ngx.now()          日期格式示例: 1663839717.105  当前的Unix时间戳,单位为秒,小数为毫秒; 与 nginx 内置变量 $msec 相同
#                          -- 因 nginx 有缓存时间,所以与实际服务器时间会有些许偏差,可能偏差几毫秒 - 正常业务可忽略不计
#                          -- 若 一定要强一致,可先调用 ngx.update_time() 强制更新,但成本较高,不推荐使用
# ngx.time()         日期格式示例: 1663839717  当前的Unix时间戳,单位为秒(1970年至今)
# ngx.var.time_local 日期格式示例: 02/Aug/2022:11:11:32 +0800
# ngx.utctime()      日期格式示例: 2022-09-08 10:16:01
# ngx.localtime()    日期格式示例: 2022-09-08 18:16:01
# ngx.today()        日期格式示例: 2022-09-08
## 本地时间(yyyy-MM-dd hh:mi:ss)
set_by_lua $time_zh 'return ngx.localtime()';# Unix时间戳,单位为毫秒
set_by_lua $timestamp 'return ngx.now() * 1000';# 本地时间(yyyy-MM-dd hh:mi:ss,SSS)
# 毫秒数: 先用 ngx.now()%1, 取余数去除秒的部分,再*1000获取毫秒部分,再用 math.floor + 0.5 四舍五入,再用 string.format 固定3位长度
set_by_lua $time_zh_ms 'return ngx.localtime()..","..string.format("%03d", math.floor(ngx.now()%1*1000+0.5))';

方法三: map (在http节点内)

建议创建独立 conf 文件,使用include方式,如:time-zh-map.conf 内容如下:

# 该 文件使用方法  在 nginx 配置 http 节点内:   include time-zh-map.conf;
#
# nginx 内置变量,解析为定义格式,仅支持到秒
#
# $time_iso8601  日期格式示例: 2022-09-08T18:16:01+08:00
# $time_local    日期格式示例: 02/Aug/2022:11:11:32 +0800
# $msec          日期格式示例: 1663839717.105 当前的Unix时间戳,单位为秒,小数为毫秒# 使用以下 map 必须增加 map_hash_bucket_size 大小,否则会报异常
# 默认值为 cpu 的缓存行大小,一般为64
map_hash_bucket_size 128;# 自定义 yyyy-MM-dd hh:mi:ss 格式
map $time_iso8601 $time_zh {default $time_iso8601;"~(\d{4}-\d{2}-\d{2})T(\d{2}:\d{2}:\d{2})(\+\d{2})" "$1 $2";
}# 时间戳,单位毫秒  使用 $msec 去除中间的小数点实现
map $msec $timestamp {default $msec;~(\d+)\.(\d+) $1$2;
}# 自定义 yyyy-MM-dd hh:mi:ss,SSS 带毫秒格式
map "$time_iso8601 # $msec" $time_zh_ms {default $time_zh,000;"~(\d{4}-\d{2}-\d{2})T(\d{2}:\d{2}:\d{2})(\+\d{2}:\d{2}) # (\d+)\.(\d+)$" "$1 $2,$5";
}

PS: 若存在多个Server, 推荐使用方法三, 则不需要每个 server 配置一次

Nginx/Openresty日志时间显示到毫秒级的三种方法(不改源码)相关推荐

  1. Python计算程序运行时间秒级/毫秒级的两种方法datetime和time

    Python计算程序运行时间秒级/毫秒级的两种方法datetime和time 简单粗暴,先上代码: import datetime import time# 方法一:datetime.datetime ...

  2. matplotlib显示中文字体的常用三种方法

    文章目录 (一)调用Fontproperties(推荐使用) 1.1 调用Fontproperties方法介绍 1.2 实例 1.2.1 实例一 2.1.2 实例二(具体怎么使用,细节\重点) (二) ...

  3. java数据输入的步骤_Java学习日志1.4 Scanner 数据输入的三种方法

    Scanner sc = new Scanner(System.in); /注意in 是InputStream的缩写,是字节输入流的意思. 整句话的含义就是: new 一个对象,接受从键盘输入的数据, ...

  4. 记录Nginx的升级实践以及实现的三种方法详解

    方法一: 对于现在有的环境是通过源码包安装nginx的,由于库文件都存在,要升级nginx直接在虚拟机上编译安装好包 然后打包 ,更新到线上机器的/opt/nginx1.x上. 测试如下: scp n ...

  5. oracle数据库报300006,Oracle归档日志所在目录时间不对Oracle集群日志时间显示错误...

    Oracle归档日志所在目录时间不对&&Oracle集群日志时间显示错误 Oracle归档日志所在目录时间不对&&Oracle集群日志时间显示错误 前言 这个问题在18 ...

  6. Java精确到毫秒获取时间的三种方法,以及适用场景

    目前获取毫秒值时间戳大概有下面三种方法 // 方法一 System.currentTimeMillis(); // 方法二 Calendar.getInstance().getTimeInMillis ...

  7. vux 显示 html,浅谈vux之x-input使用以及源码解读

    前言 近期项目中使用的vux中的input,以及使用自定义校验规则和动态匹配错误提示,有时间记录下自己的使用经历和源码分析.希望大家多多指正,留言区发表自己宝贵的建议. 详解 列举官方文档中常用的几个 ...

  8. 独家 | 将时间信息编码用于机器学习模型的三种编码时间信息作为特征的三种方法...

    作者:Eryk Lewinson 翻译:汪桉旭 校对:zrx本文约4400字,建议阅读5分钟 本文研究了三种使用日期相关的信息如何创造有意义特征的方法. 标签:时间帧,机器学习,Python,技术演示 ...

  9. Android TextView里直接显示图片的三种方法

    方法一:重写TextView的onDraw方法,也挺直观就是不太好控制显示完图片后再显示字体所占空间的位置关系.一般如果字体是在图片上重叠的推荐这样写.时间关系,这个不付源码了. 方法二:利用Text ...

最新文章

  1. 修改手机屏幕刷新率_到底高刷新率屏幕为智能手机带来什么?
  2. 爬取微博好友所发微博制作词云
  3. 终版!思科网络设备基础命令大全(三)
  4. 基于墨刀的软件界面原型设计——小说搜索阅读软件
  5. js blob 下载到本地文件
  6. 09_Flink入门案例、word-count程序(java和scala版本)、添加依赖、Flink Streaming和Batch的区别 、在集群上执行程序等
  7. sql 命令使用简单记录
  8. Leetcode--1248. 统计「优美子数组」(java)
  9. FJ集团企业级邮件服务器——Exchange服务器安装与配置(边缘传输服务器)
  10. linux中文件输出输入,linux中文件输入输出的管理
  11. 获取当日零点 PHP
  12. 你的网站首页完成最重要的使命了吗?
  13. Python十进制转十五进制
  14. matlab有哪些算法,30个最常用的智能算法MATLAB实现
  15. 【R语言】GARCH模型的应用
  16. cai_VBA植物大战僵尸2Total Control自动刷金币
  17. 橙色优学:PS扣图技术讲解,六种方法你都知道吗?
  18. 2018年新浪微博产品笔试题目
  19. ssm在线教学质量评价系统毕业设计源码141550
  20. 新媒体短视频营销玩法

热门文章

  1. 推动营销模式创新,华为云大数据解决方案加码企业数字化转型
  2. LVDS 驱动 适配
  3. 秒懂Excel的三种引用
  4. 关于JAVA中十进制转换二进制的小程序
  5. 【前端性能优化】 --- 一次总结明白
  6. 【Unity3D】血条(HP)
  7. 龙王传说古月_龙王传说:小舞对古月娜不满,婆媳关系紧张,这四点让她难以接受...
  8. ECharts(中国地图篇)的使用
  9. Flink 状态管理与 Checkpoint 机制
  10. 如何用java读取并解析geojson文件