Nginx快速入门:访问日志access.log参数详解 |访问日志记录自定义请求头(三)

news2024/12/26 13:36:09

0. 引言

在企业的生产环境中,我们时常需要通过nginx的访问日志来统计流量、排查调用问题等,而nginx默认的日志格式所包含的信息远无法满足我们使用,因此常常需要对日志进行自定义,所以今天我们就来看如何自定义nginx的访问日志格式,并了解nginx的访问日志支持多少参数。

1. 自定义日志格式

首先我们在默认的nginx.conf文件中可以看到,对访问日志是有默认定义的,其中包含了定义日志格式,定义日志文件位置。如下所示,其中main为定义的日志格式别名,你可以定义成其他的名称。

log_format  main  '$remote_addr - $remote_user [$time_local] "$request" '
                      '$status $body_bytes_sent "$http_referer" '
                      '"$http_user_agent" "$http_x_forwarded_for"';
access_log  /var/log/nginx/access.log  main;

默认日志输出示例
在这里插入图片描述
nginx的访问日志定义的语法是:

log_format name [escape=default | json] string ...;
  • name: 定义的格式名称,自定义,后续在access_log参数中引用
  • escape: 设置日志格式,默认为default,即默认输出,或者支持json, 按照json格式输出
  • string: 要定义的日志格式的内容,可以在里面设置要记录的日志参数

在默认日志格式中,定义的参数含义如下:

参数说明
$remote_addr客户端IP地址
$remote_user客户端用户名
$time_local请求时间
$request请求的URI和HTTP协议版本
$status请求返回的状态码
$body_bytes_sent发送给客户端的字节数
$http_referer引用的页面地址
$http_user_agent客户端代理信息, 比如浏览器信息等

nginx还支持的常用参数有:

参数说明
$http_host请求头中的 “Host” 字段的值,如果请求中没有 “Host” 字段,则会使用服务器监听的 server_name 中定义的第一个名称
$uri请求的 URI,即 URL 的后半部分,不包括查询字符串
$ssl_protocol使用的 SSL 协议版本,如 “SSLv3”、“TLSv1” 等
$ssl_cipher用于加密连接的加密算法,例如 “AES128-SHA”
$http_x_forwarded_for当前端有代理服务器时,设置web节点记录客户端地址的配置,此参数生效的前提是代理服务器也要进行相关的x_forwarded_for设置
$upstream_addr后端服务器的地址和端口,用于识别请求被转发到的服务器
$request_body客户端发送的请求体,即请求消息的主体部分,通常用于 POST 请求
$upstream_status后端服务器的响应状态码,如 “200”、“404” 等
$upstream_header_time后端服务器处理请求并返回响应头的时间
$upstream_response_time后端服务器从开始处理请求到返回响应的整个时间
$bytes_sent发送给客户端的字节数
$connection连接序列号
$connection_requests当前通过连接发出的请求数量
$msec日志写入时间,单位为秒,精度是毫秒
$pipe如果请求是通过http流水线发送,则其值为"p",否则为“."
$request_length请求长度(包括请求行,请求头和请求体)
$request_time请求处理时长,单位为秒,精度为毫秒,从读入客户端的第一个字节开始,直到把最后一个字符发送给客户端进行日志写入为止
$time_iso8601标准格式的本地时间,形如“2017-05-24T18:31:27+08:00”
$remote_addr客户端IP
$request完整的原始请求行,如 “GET / HTTP/1.1”
$request_uri完整的请求地址,如 “https://baidu.com”

2. 日志配置案例

下面我们按照生产环境的日志标准配置一个样例,包括请求时间、地址、加密算法、响应时长、请求体大小等信息

log_format main escape=json '{"@timestamp":"$time_iso8601",'
                '"remote_addr":"$remote_addr",'
                '"remote_user":"$remote_user",'
                '"http_host":"$http_host",'
                '"uri":"$uri",'
                '"http_referer":"$http_referer",'
                '"ssl_protocol":"$ssl_protocol",'
                '"ssl_cipher":"$ssl_cipher",'
                '"http_x_forwarded_for":"$http_x_forwarded_for",'
                '"upstream_addr":"$upstream_addr",'
                '"bytes":$body_bytes_sent,'
                '"request":"$request",'
                '"request_length":$request_length,'
                '"request_time":$request_time,'
                '"upstream_status":$upstream_status,'
                '"upstream_header_time":$upstream_header_time,'
                '"upstream_response_time":$upstream_response_time,'
                '"status":"$status",'
                '"http_referer":"$http_referer",'
                '"http_user_agent":"$http_user_agent"'
                '}';
 access_log  /var/log/nginx/access.log  main;

配置好记得重启,让配置生效

# 检查语法
nginx -t
# 重启
nginx -s reload

输出样式:
可以看到日志就以json格式的形式输出了
在这里插入图片描述

3. 日志记录自定义请求头

某些场景下,我们需要打印自定义的请求头,比如设置请求头参数为这次请求的流水号,这样将其打印后,我们就能快速定位到这笔请求的nginx日志了

1、而打印也很简单,就直接在日志格式里添加上这个header即可,如下添加一个自定义header:http_x_seqno,需要注意的是这里日志中引用的header变量,需要是原来的请求头名称小写,并且前面加上"http_“,比如请求头是"x_seqno”, 那么这里配置的就是"$http_x_seqno"

log_format main escape=json '{"@timestamp":"$time_iso8601",'
                '"http_user_agent":"$http_user_agent",'
                  '""http_x_seqno":"$http_x_seqno"'
                '}';
 access_log  /var/log/nginx/access.log  main;

2、如果这里直接重启访问,会发现日志并不会打印该header值,这是因为我们还需要在http或server模块中开启underscores_in_headers,以此支持读取下划线header

underscores_in_headers on; # 下划线支持,开启自定义header

在这里插入图片描述
然后重启nginx,测试访问
在这里插入图片描述
日志中会发现该header已经打印
在这里插入图片描述

4. 总结

如上,我们就掌握了关于nginx的访问日志的自定义,但还有一个问题,就是nginx的日志文件是一个,没有按天分割,时间一长,那么这个文件就会很大,影响我们维护阅读。于是如何实现nginx日志文件的按天分割呢?

以下提供几种思路,大家可以自己拓展:

  • 1、借助脚本实现,通过编写脚本,通过mv指令将日志文件迁移到有带日期名的日志文件,该脚本添加到linux每日定时任务中
  • 2、使用cronlog工具实现
  • 3、使用Logrotate工具实现

尽量避免使用通过在nginx http模块用map定义变量,然后声明日志文件名,或者其他类似的通过nginx本身变量声明而修改日志文件名的形式,因为这样每次请求进来都要进行判断,影响性能。

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

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

相关文章

移动端自适应

1.普通html页面 一般使用px定义,不会进行适配 移动端项目:从不同的终端保持页面的一致性(自适应),使用rem相对单位,rem是相对于根节点html的font-size的值进行动态换算的值 2.普通html页面进行适配 普通页面中&…

解决方案架构师 vs 技术架构师,有何区别?

Salesforce架构师角色是生态系统中常见的职业目标。架构师因其丰富的Salesforce知识以及在平台上构建可扩展解决方案的能力而广受认可。 解决方案架构师和技术架构师是Salesforce生态系统中最常见的两个架构师角色,这些角色有一些重叠,但它们完全不同&a…

Seata使用详解

分布式事务介绍分布式事务的优缺点CAP理论介绍Base理论介绍CAP和BASE之间有什么区别Seata介绍Seata支持的事务模式介绍Seata的架构Seata应用场景Seata集群部署Seata集群部署的优缺点Seata在Java中的使用案例Seata在Java中的代码示例Seata与SpringBoot2.x的整合Seata与SpringBoo…

winfrom大恒工业相机SDK二次开发、C#联合halcon开发

一、开发环境 1.在大恒图像官网下载SDK安装包,安装SDK后,打开安装目录找到Samples文件夹,然后找到Samples\CSharp SDK\x64\DoNET\.NET4.0文件夹下找到GxIAPINET.dll,如图: 2.打开VS2019软件,建立winfrom项…

Linux系统管理、服务器设置、安全、云数据中心

前言 「作者主页」:雪碧有白泡泡 「个人网站」:雪碧的个人网站 我们来快速了解liunx命令 文章目录 前言解析命令提示符linux的文件和目录文件和目录管理文件操作 进程管理命令系统管理网络管理 书籍推荐 本文以服务器最常用的CentOS为例 解析命令提示…

JDBC简单使用

1. 首先导包,放在src -> lib下 打开项目结构,添加导入的包为库 基础语法 Statement statement conn.createStatement(); ---------------------------------------------- 1.execute(String query)方法用来执行任意的SQL语句查询,如果…

AcrelEMS-HIM高速公路综合能效系统在新晋高速公路快村营至营盘段项目的应用——安科瑞 顾烊宇

摘 要:我国新型工业化、信息化、城镇化和农业现代化加快发展,经济结构加快转型,交通运输总量将保持较快增长态势,各项事业发展要求提高国家公路网的服务能力和水平。高速公路沿线的收费站、互通枢纽、服务区、隧道等配置的供配电、…

2024Java85w字面试宝典+从入门到架构师的学习路线图+Java开发求职手册,我终于做出来了!

这几年中,我遇到了很多不同困境中的Java开发者,让我有了一个思考,在做教育这件事情上,我的目标是什么?为此,我思考了很久。 然后今年有很多的粉丝或者一些学员来找我,说今年的面试很困难&#…

【工作流Activiti】MyActivit的maven项目

1、Idea新建一个项目MyActivit的maven项目 2、安装插件 在 idea 里面&#xff0c;activiti 的插件叫 actiBPM&#xff0c;在插件库里面把它安装好&#xff0c;重启 idea 就行了。 3、 maven 项目中&#xff0c;并更改 pom.xml。pom 中依赖如下&#xff1a; <?xml version…

C#中的协变和逆变

这两个都是只能使用在接口和委托上 个人理解&#xff1a; 协变&#xff1a;出参&#xff0c;让基类使用范围变大&#xff0c;将父类/基类当作子类一样使用 --为什么这样规定呢&#xff1f; 我的理解&#xff1a;真正实现的是子类&#xff0c;子类拥有所有的方法&#xff0c;却…

pytorch网络的增删改

本文介绍对加载的网络的层进行增删改, 以alexnet网络为例进行介绍。 1. 加载网络 import torchvision.models as models alexnet models.alexnet(weightsmodels.AlexNet_Weights.DEFAULT) print(alexnet)2. 删除网络 在做迁移学习的时候&#xff0c;我们通常是在分类网络的…

安全狗waf

安全狗waf安装 1、先将phpstudy 以管理员身份运行&#xff0c;将运行模式修改为 “系统服务”&#xff0c;点击“应用”。 2、下载安全狗&#xff0c;安全狗-领先云安全服务与解决方案提供商|云原生安全|服务器安全|网站安全|态势感知 3、安装安全狗&#xff0c;以管理员身份运…

python调取一欧易API并写一个比特币均线交易策略

比特币均线交易策略是一种基于比特币价格的移动均线的交易策略。它通过计算不同时间段的移动均线来确定买入和卖出点。 具体步骤如下&#xff1a; 确定要使用的均线。常用的均线包括5日、10日、20日、50日和200日均线。较短的均线可以更快地反应价格变动&#xff0c;而较长的均…

探秘 AJAX:让网页变得更智能的异步技术(下)

&#x1f90d; 前端开发工程师&#xff08;主业&#xff09;、技术博主&#xff08;副业&#xff09;、已过CET6 &#x1f368; 阿珊和她的猫_CSDN个人主页 &#x1f560; 牛客高级专题作者、在牛客打造高质量专栏《前端面试必备》 &#x1f35a; 蓝桥云课签约作者、已在蓝桥云…

AcWing算法提高课-4.1.2搭配购买

算法提高课整理 CSDN个人主页&#xff1a;更好的阅读体验 原题链接 题目描述 Joe觉得云朵很美&#xff0c;决定去山上的商店买一些云朵。 商店里有 n n n 朵云&#xff0c;云朵被编号为 1 , 2 , … , n 1,2,…,n 1,2,…,n&#xff0c;并且每朵云都有一个价值。 但是商店…

机器学习——主成分分析(PCA)

今天由我来向大家何为PCA算法及如何实现&#xff0c;PCA算法是无监督方法的典型&#xff0c;在此之前我们先来了解有监督学习、无监督学习以及半监督学习的区别。 一、有监督学习、无监督学习、半监督学习的区别 1. 有监督学习 监督学习是从标记的训练数据来推断一个功能的机…

C语言——小细节和小知识5

一、某些预处理指令 #ifdef #else #endif 这三个预处理指令用于条件编译&#xff0c;#ifdef用于判断某个宏是否被定义过&#xff0c;#endif用于结束#ifdef的作用范围&#xff0c;例如&#xff1a; #include <stdio.h>#define MAX 10int main() { #ifdef MAXprintf(&…

基于JAVA的无代码动态表单系统 开源项目

目录 一、摘要1.1 项目介绍1.2 项目录屏 二、功能模块2.1 动态类型模块2.2 动态文件模块2.3 动态字段模块2.4 动态值模块 三、系统设计3.1 用例设计3.2 数据库设计3.2.1 动态类型表3.2.2 动态文件表3.2.3 动态字段表3.2.4 动态值表 四、系统展示五、核心代码5.1 查询档案类型5.…

OpenHarmony鸿蒙原生应用开发,ArkTS、ArkUI学习踩坑学习笔记,持续更新中。

一、AMD处理器win10系统下&#xff0c;DevEco Studio模拟器启动失败解决办法。 结论&#xff1a;在BIOS里面将Hyper-V打开&#xff0c;DevEco Studio模拟器可以成功启动。 二、ArkTS自定义组件导出、引用实现。 如果在另外的文件中引用组件&#xff0c;需要使用export关键字导…

Educational Codeforces Round 160 (Rated for Div. 2)

Educational Codeforces Round 160 (Rated for Div. 2) Educational Codeforces Round 160 (Rated for Div. 2) A. Rating Increase 题意&#xff1a;给定一个由数字字符组成的字符串&#xff0c;且无前导零&#xff0c;将其分割成ab两部分&#xff0c;b不能有前导零&#x…