如何利用NJS实现根据响应时间动态调整日志记录粒度的教程

星萱君_3047

星萱君_3047

2026-06-03

1016人浏览

原创

njs可通过$upstream_response_time分类响应时间并设置$log_tier变量,结合log_format中if=指令实现按档输出不同详细度日志:≤100ms精简、100–500ms增加耗时与请求长度、>500ms追加trace_id等字段。

如何利用njs实现根据响应时间动态调整日志记录粒度的教程

NJS 本身不支持直接修改日志格式或动态切换 log_format,也无法在运行时重载日志级别(如 nginx 的 error_log 级别是静态配置)。但你可以利用 NJS 捕获请求响应时间,并结合自定义变量 + 条件日志记录,实现“按响应时间分档输出不同详细程度日志”的效果——这本质上是**动态控制日志内容的丰富度,而非改变全局日志级别**。

核心思路:用 $upstream_response_time 触发日志字段条件输出

nginx 原生提供 $upstream_response_time 变量(毫秒级,含小数),NJS 可读取它并计算、分类,再通过 js_set 输出一个标记变量(如 $log_level_hint),最后在 log_format 中用 if= 指令控制是否记录某些字段(例如完整 header、body 截断、trace_id 等)。

  • 响应 ≤ 100ms → 记录精简日志(仅 status、uri、time_iso8601)
  • 100ms
  • 响应 > 500ms → 额外记录 $http_x_request_id、$upstream_addr、完整 $request

步骤一:定义 NJS 函数生成日志分级提示变量

http 块中引入脚本:

js_import conf.d/loglevel.js;
js_set $log_tier loglevel.tier;
js_set $log_detail loglevel.detail;

对应 conf.d/loglevel.js 内容:

function tier(r) {
  const t = parseFloat(r.variables.upstream_response_time || '0');
  if (t function detail(r) {
const t = parseFloat(r.variables.upstream_response_time || '0');
if (t > 0.5) {
return r.variables.http_x_request_id || '-';
}
return '-';
}

步骤二:配置多层级日志格式(使用 if= 条件字段)

定义一个支持条件字段的 log_format:

Comprehensive Three.js 3D graphics reference
Comprehensive Three.js 3D graphics reference

详细的 Three.js 3D 图形参考,涵盖场景设置、相机、几何体、材质、光照、动画、控制器、加载器、数学工具和调试。

下载
log_format tiered '$remote_addr - $remote_user [$time_local] '
                   '"$request" $status $body_bytes_sent '
                   '$upstream_response_time '
                   '$request_length '
                   '$log_tier '
                   '"$log_detail" '
                   '$http_user_agent';

⚠️ 注意:$log_detail 在 fast/normal 场景下值为 '-',不会额外增加体积;只有 slow 请求才填入真实 request_id,实现“按需记录”。

若需更精细控制(如只在 slow 时记录 $request),可改用 map + 多个变量组合,或借助 access_log ... if= 分流到不同文件(但会增加磁盘 I/O)。

步骤三:配合采样降低高负载影响

高频慢请求仍可能撑爆日志。建议叠加轻量采样逻辑(不依赖外部库):

  • 在 NJS 中对 $log_tier === 'slow' 的请求,用 Math.abs(hash($request_uri + $msec)) % 100 模拟 1% 采样
  • 仅当采样命中且 tier === 'slow' 时,才赋值真实 $log_detail,否则保持 '-'
  • 避免在 NJS 中做复杂加密或实时统计,防止阻塞 worker 进程

不复杂但容易忽略:这个方案不改动 nginx 日志系统底层,完全基于变量和格式控制,零 reload、零模块依赖,适合生产环境灰度上线。

相关文章

PHP速学视频免费教程(入门到精通)
PHP速学视频免费教程(入门到精通)

PHP怎么学习?PHP怎么入门?PHP在哪学?PHP怎么学才快?不用担心,这里为大家提供了PHP速学教程(入门到精通),有需要的小伙伴保存下载就能学习啦!

下载

相关标签:

nginx配置 js

本站声明:本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn

相关专题

更多
nginx 重启
nginx 重启

nginx重启对于网站的运维来说是非常重要的,根据不同的需求,可以选择简单重启、平滑重启或定时重启等方式。本专题为大家提供nginx重启的相关的文章、下载、课程内容,供大家免费下载体验。

2023.07.27

363

5

nginx 配置详解
nginx 配置详解

Nginx的配置是指设置和调整Nginx服务器的行为和功能的过程。通过配置文件,可以定义虚拟主机、HTTP请求处理、反向代理、缓存和负载均衡等功能。Nginx的配置语法简洁而强大,允许管理员根据自己的需要进行灵活的调整。php中文网给大家带来了相关的教程以及文章,欢迎大家前来学习阅读。

2023.08.04

3007

6

nginx配置详解
nginx配置详解

NGINX与其他服务类似,因为它具有以特定格式编写的基于文本的配置文件。本专题为大家提供nginx配置相关的文章,大家可以免费学习。

2023.08.04

5485

6

tomcat和nginx有哪些区别
tomcat和nginx有哪些区别

tomcat和nginx的区别:1、应用领域;2、性能;3、功能;4、配置;5、安全性;6、扩展性;7、部署复杂性;8、社区支持;9、成本;10、日志管理。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

2024.02.23

541

5

nginx报404怎么解决
nginx报404怎么解决

当访问 nginx 网页服务器时遇到 404 错误,表明服务器无法找到请求资源,可以通过以下步骤解决:1. 检查文件是否存在且路径正确;2. 检查文件权限并更改为 644 或 755;3. 检查 nginx 配置,确保根目录设置正确、没有冲突配置等等。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

2024.07.09

1456

5

Nginx报404错误解决方法
Nginx报404错误解决方法

解决方法:只需要加上这段配置:try_files $uri $uri/ /index.html;即可。想了解更多Nginx的相关内容,可以阅读本专题下面的文章。

2024.08.07

3898

3

nginx部署php项目教程汇总
nginx部署php项目教程汇总

本专题整合了nginx部署php项目教程汇总,阅读专题下面的文章了解更多详细内容。

2026.01.13

102

12

nginx配置文件详细教程
nginx配置文件详细教程

本专题整合了nginx配置文件相关教程详细汇总,阅读专题下面的文章了解更多详细内容。

2026.01.13

397

23

Nginx跨平台安装实操指南:Windows、macOS与Linux环境快速搭建
Nginx跨平台安装实操指南:Windows、macOS与Linux环境快速搭建

本指南详解Nginx在Windows、macOS及Linux系统的安装全流程。涵盖官方包解压、Homebrew一键部署、APT/YUM源配置及Docker容器化方案。无论新手或开发者,均可快速搭建运行环境,掌握跨平台核心指令,为后续配置与调优奠定坚实基础。

2026.03.16

139

12

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
WEB前端教程【HTML5+CSS3+JS】
WEB前端教程【HTML5+CSS3+JS】

共101课时 | 20.5万人学习

JS进阶与BootStrap学习
JS进阶与BootStrap学习

共39课时 | 4.7万人学习