为了统计和其它用途,经常有人需要自定义Nginx日志,把http请求中的某个字段记录到日志中,刚好在看lua+nginx的文章,第一想到的是用lua赋值来做,但是想想有点小恶心,于是Google了一番,发现Nginx自己就能够记录收到的HTTP请求的头部数据,测试如下方法可用。

测试环境Nginx 1.1.19

把自定义头部加入日志

为了方便,我们可能会在HTTP头里面加入特定的字符串,做一些标示,如果需要把标示打到日志里面,其实很简单。

在nginx的http段里面对access log做如下的设置:

……
http {
……
log_format main '$remote_addr - $remote_user [$time_local] "$request" '
'$status $body_bytes_sent "$http_referer" '
'"$http_user_agent" "$http_x_forwarded_for" "$http_mycheck"';
access_log logs/access.log main;
……
}
……

我在日志格式的最后面加入了$http_mycheck,那么,Nginx会记录mycheck这个头部,保存到access log里面。

重启Nginx,然后curl测试:

./nginx -s reload
curl -H "mycheck: justtestlog" localhost/whatever.html
curl localhost/whatever.html

然后查看两次请求的日志记录

tail -2 logs/access.log

127.0.0.1 - - [xxx] "GET /whatever.html HTTP/1.1" 200 21 "-" "curl/7.19.7 (x86_64-redhat-linux-gnu) libcurl/7.19.7 NSS/3.19.1 Basic ECC zlib/1.2.3 libidn/1.18 libssh2/1.4.2" "-" "justtestlog"

127.0.0.1 - - [xxx] "GET /whatever.html HTTP/1.1" 200 21 "-" "curl/7.19.7 (x86_64-redhat-linux-gnu) libcurl/7.19.7 NSS/3.19.1 Basic ECC zlib/1.2.3 libidn/1.18 libssh2/1.4.2" "-" "-"

请求头部中没有mycheck字段的时候,日志字段里记为"-",header有mycheck字段的时候,最后一段是mycheck的值。

记录用户访问的cookie

……
set $dm_cookie "";
if ($http_cookie ~* "(.+)(?:;|$)") {
set $dm_cookie $1;
}
log_format main '$remote_addr - $remote_user [$time_local] "$request" '
'$status $body_bytes_sent "$http_referer" '
'"$http_user_agent" "$http_x_forwarded_for" "$http_mycheck" "$dm_cookie"';
access_log logs/access.log main;
……

这样日志里面就可以看到cookie了,据说可以监控用户和行为。但是在实际中,cookie太长,加上cookie之后,日志量会成倍增长,会加大服务器的压力,如非必要,不建议在日志中添加该字段。

记录用户访问的$request_body

……
log_format main '$remote_addr - $remote_user [$time_local] "$request" $request_body '
'$status $body_bytes_sent "$http_referer" '
'"$http_user_agent" "$http_x_forwarded_for" "$http_mycheck" "$dm_cookie"';
access_log logs/access.log main;
……

$request_body 变量已经增加到上述文件里面,可以记录到客户端请求体也就是域名后面进行的传参值,记录这个主要时判断用户名密码一类的,建议生产服务器也不要添加,日志量会增大。

Nginx记录用户请求Header到access log的更多相关文章

  1. Nginx根据用户请求的不同参数返回不同的json值

    用户请求url:http://localhost:8000/getconfig?v=1.03.01,根据参数v=1.03.01或者其他的值返回不同的json值.如果用户请求不带该参数,则返回默认的js ...

  2. nginx关闭全局access.log,error.log

    如果nginx的server里没配置access.log,nginx会默认将server的访问日志记录到access.log, 关闭方法: 在nginx.conf配置文件中, 在全局配置中添加 err ...

  3. 通过Nginx,Tomcat访问日志(access log)记录请求耗时

    一.Nginx通过$upstream_response_time $request_time统计请求和后台服务响应时间 nginx.conf使用配置方式: log_format main '$remo ...

  4. 在nginx日志的access log中记录post请求的参数值

    背景:有时程序偶出现参数少了或没有提交到下一个链接Url里后出现问题,如何查呢,最好的办法是在nginx上的加post参数,以定位到问题才有可能对某个UIR的代码出现的问题进行排查. og_forma ...

  5. 在nginx日志access log可以记录POST请求的参数值

    1)      在nginx日志access log可以记录POST请求的参数值 实现程度:日志中可以显示POST请求所提交的参数值 问题: 日志中文显示十六进制(在配置文件中配置中文也无效) 没有对 ...

  6. nginx access.log 忽略favicon.ico訪问记录的方法

    favicon.ico 文件是浏览器收藏网址时显示的图标,当第一次訪问页面时.浏览器会自己主动发起请求获取页面的favicon.ico文件.当/favicon.ico文件不存在时,服务器会记录404日 ...

  7. Nginx 的 access log 如何以 json 形式记录?

    Nginx 的 access log 默认是以空格分隔的字符串形式记录的,格式如下 log_format proxy '[$time_local] $remote_addr ' '$protocol ...

  8. nginx记录响应与POST请求日志

    生产环境中的某些api出现故障,但是问题无法重现,但是又很想解决掉问题以及我们新项目上线,需要跟踪请求与响应的信息,可以预先找到一些bug,减少大面积的损失. 安装nginx与ngx_lua 响应日志 ...

  9. nginx的access.log文件详解

    事实证明,日志文件真的是很重要很重要的.能够帮助我们快速的定位问题,并且知道用户访问的状态,浏览器,Ip,接口地址等,简直可怕.. 一.nginx的access.log(1)对博主而言,日志文件存放在 ...

随机推荐

  1. ODM & mongoose

    ODM & mongoose ODM (object data modeling) https://mongoosejs.com/ MongoDB NoSQL xgqfrms 2012-202 ...

  2. Typescript & React & optional parameters & default parameters

    Typescript & React & optional parameters & default parameters Typescript & optional ...

  3. js 动态构建style

    使用创建style的方式 btn.addEventListener("click", async () => { const ns = document.createElem ...

  4. 「NGK每日快讯」2021.2.2日NGK公链第91期官方快讯!

  5. PAUL ADAMS ARCHITECT:澳洲房贷最低利率来袭

    11月3日澳洲储备银行宣布将官方现金利率从0.25%降至0.1%,破历史最低纪录.此次澳洲储备银行降息的目的主要是为了刺激经济走出全球经济危机引发的衰退.据了解,这已经是澳洲今年第三次降息,也是自20 ...

  6. 权限管理整合springsecurity代码执行过程

    (1)输入用户名密码. (2)进入认证过滤器中,执行attemptAuthentication方法, 通过该方法获取输入的用户名和密码. (3)执行实现了UserDetailsService接口的类中 ...

  7. oracle之用户

    命令都是在命令行窗口执行 创建用户 1)登陆管理员用户 sqlplus system/密码 sqlplus system/briup 注意不要以分号结尾 2)创建用户 create user 用户名 ...

  8. Linux没有ens33解决方案

    一.前言 运行环境:window10+VMware14+Centos7 博主最近遇到一个比较郁闷的问题,在虚拟机上操作Linux系统查看IP的时候,发现没有ens33或者eth0了,试了很多办法都没有 ...

  9. 使用lua-nginx模块实现请求解析与调度

    系统版本及需求: OS:CentOS 7.7.1908 OpenResty:1.15.8.2 目录 描述 安装配置 安装openresty 使用示例 HTTP请求复制 HTTP报文解析 总结 描述 l ...

  10. C++核心篇

    C++核心编程 本阶段主要针对C++面向对象编程技术做详细讲解,探讨C++中的核心和精髓. 1 内存分区模型 C++程序在执行时,将内存大方向划分为4个区域 代码区:存放函数体的二进制代码,由操作系统 ...